1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * i.MX8QXP/i.MX8QM JPEG encoder/decoder v4l2 driver
4  *
5  * Copyright 2018-2019 NXP
6  */
7 
8 #include <media/v4l2-ctrls.h>
9 #include <media/v4l2-device.h>
10 #include <media/v4l2-fh.h>
11 
12 #ifndef _MXC_JPEG_CORE_H
13 #define _MXC_JPEG_CORE_H
14 
15 #define MXC_JPEG_NAME			"mxc-jpeg"
16 #define MXC_JPEG_FMT_TYPE_ENC		0
17 #define MXC_JPEG_FMT_TYPE_RAW		1
18 #define MXC_JPEG_DEFAULT_WIDTH		1280
19 #define MXC_JPEG_DEFAULT_HEIGHT		720
20 #define MXC_JPEG_DEFAULT_PFMT		V4L2_PIX_FMT_RGB24
21 #define MXC_JPEG_MIN_WIDTH		64
22 #define MXC_JPEG_MIN_HEIGHT		64
23 #define MXC_JPEG_MAX_WIDTH		0x2000
24 #define MXC_JPEG_MAX_HEIGHT		0x2000
25 #define MXC_JPEG_MAX_CFG_STREAM		0x1000
26 #define MXC_JPEG_H_ALIGN		3
27 #define MXC_JPEG_W_ALIGN		3
28 #define MXC_JPEG_MAX_SIZEIMAGE		0xFFFFFC00
29 #define MXC_JPEG_MAX_PLANES		2
30 
31 enum mxc_jpeg_enc_state {
32 	MXC_JPEG_ENCODING	= 0, /* jpeg encode phase */
33 	MXC_JPEG_ENC_CONF	= 1, /* jpeg encoder config phase */
34 };
35 
36 enum mxc_jpeg_mode {
37 	MXC_JPEG_DECODE	= 0, /* jpeg decode mode */
38 	MXC_JPEG_ENCODE	= 1, /* jpeg encode mode */
39 };
40 
41 /**
42  * struct mxc_jpeg_fmt - driver's internal color format data
43  * @name:	format description
44  * @fourcc:	fourcc code, 0 if not applicable
45  * @subsampling: subsampling of jpeg components
46  * @nc:		number of color components
47  * @depth:	number of bits per pixel
48  * @colplanes:	number of color planes (1 for packed formats)
49  * @h_align:	horizontal alignment order (align to 2^h_align)
50  * @v_align:	vertical alignment order (align to 2^v_align)
51  * @flags:	flags describing format applicability
52  */
53 struct mxc_jpeg_fmt {
54 	const char				*name;
55 	u32					fourcc;
56 	enum v4l2_jpeg_chroma_subsampling	subsampling;
57 	int					nc;
58 	int					depth;
59 	int					colplanes;
60 	int					h_align;
61 	int					v_align;
62 	u32					flags;
63 };
64 
65 struct mxc_jpeg_desc {
66 	u32 next_descpt_ptr;
67 	u32 buf_base0;
68 	u32 buf_base1;
69 	u32 line_pitch;
70 	u32 stm_bufbase;
71 	u32 stm_bufsize;
72 	u32 imgsize;
73 	u32 stm_ctrl;
74 } __packed;
75 
76 struct mxc_jpeg_q_data {
77 	const struct mxc_jpeg_fmt	*fmt;
78 	u32				sizeimage[MXC_JPEG_MAX_PLANES];
79 	u32				bytesperline[MXC_JPEG_MAX_PLANES];
80 	int				w;
81 	int				w_adjusted;
82 	int				h;
83 	int				h_adjusted;
84 	unsigned int			sequence;
85 };
86 
87 struct mxc_jpeg_ctx {
88 	struct mxc_jpeg_dev		*mxc_jpeg;
89 	struct mxc_jpeg_q_data		out_q;
90 	struct mxc_jpeg_q_data		cap_q;
91 	struct v4l2_fh			fh;
92 	enum mxc_jpeg_enc_state		enc_state;
93 	unsigned int			stopping;
94 	unsigned int			stopped;
95 	unsigned int			slot;
96 };
97 
98 struct mxc_jpeg_slot_data {
99 	bool used;
100 	struct mxc_jpeg_desc *desc; // enc/dec descriptor
101 	struct mxc_jpeg_desc *cfg_desc; // configuration descriptor
102 	void *cfg_stream_vaddr; // configuration bitstream virtual address
103 	unsigned int cfg_stream_size;
104 	dma_addr_t desc_handle;
105 	dma_addr_t cfg_desc_handle; // configuration descriptor dma address
106 	dma_addr_t cfg_stream_handle; // configuration bitstream dma address
107 };
108 
109 struct mxc_jpeg_dev {
110 	spinlock_t			hw_lock; /* hardware access lock */
111 	unsigned int			mode;
112 	struct mutex			lock; /* v4l2 ioctls serialization */
113 	struct clk			*clk_ipg;
114 	struct clk			*clk_per;
115 	struct platform_device		*pdev;
116 	struct device			*dev;
117 	void __iomem			*base_reg;
118 	struct v4l2_device		v4l2_dev;
119 	struct v4l2_m2m_dev		*m2m_dev;
120 	struct video_device		*dec_vdev;
121 	struct mxc_jpeg_slot_data	slot_data[MXC_MAX_SLOTS];
122 	int				num_domains;
123 	struct device			**pd_dev;
124 	struct device_link		**pd_link;
125 };
126 
127 /**
128  * struct mxc_jpeg_sof_comp - JPEG Start Of Frame component fields
129  * @id:				component id
130  * @v:				vertical sampling
131  * @h:				horizontal sampling
132  * @quantization_table_no:	id of quantization table
133  */
134 struct mxc_jpeg_sof_comp {
135 	u8 id;
136 	u8 v :4;
137 	u8 h :4;
138 	u8 quantization_table_no;
139 } __packed;
140 
141 #define MXC_JPEG_MAX_COMPONENTS 4
142 /**
143  * struct mxc_jpeg_sof - JPEG Start Of Frame marker fields
144  * @length:		Start of Frame length
145  * @precision:		precision (bits per pixel per color component)
146  * @height:		image height
147  * @width:		image width
148  * @components_no:	number of color components
149  * @comp:		component fields for each color component
150  */
151 struct mxc_jpeg_sof {
152 	u16 length;
153 	u8 precision;
154 	u16 height, width;
155 	u8 components_no;
156 	struct mxc_jpeg_sof_comp comp[MXC_JPEG_MAX_COMPONENTS];
157 } __packed;
158 
159 /**
160  * struct mxc_jpeg_sos_comp - JPEG Start Of Scan component fields
161  * @id:			component id
162  * @huffman_table_no:	id of the Huffman table
163  */
164 struct mxc_jpeg_sos_comp {
165 	u8 id; /*component id*/
166 	u8 huffman_table_no;
167 } __packed;
168 
169 /**
170  * struct mxc_jpeg_sos - JPEG Start Of Scan marker fields
171  * @length:		Start of Frame length
172  * @components_no:	number of color components
173  * @comp:		SOS component fields for each color component
174  * @ignorable_bytes:	ignorable bytes
175  */
176 struct mxc_jpeg_sos {
177 	u16 length;
178 	u8 components_no;
179 	struct mxc_jpeg_sos_comp comp[MXC_JPEG_MAX_COMPONENTS];
180 	u8 ignorable_bytes[3];
181 } __packed;
182 
183 #endif
184