Merge tag 'drm-misc-next-fixes-2023-09-01' of git://anongit.freedesktop.org/drm/drm...
[platform/kernel/linux-rpi.git] / drivers / media / platform / nxp / imx-jpeg / mxc-jpeg.h
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_BGR24
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  * @mem_planes: number of memory planes (1 for packed formats)
49  * @comp_planes:number of component planes, which includes the alpha plane (1 to 4).
50  * @h_align:    horizontal alignment order (align to 2^h_align)
51  * @v_align:    vertical alignment order (align to 2^v_align)
52  * @flags:      flags describing format applicability
53  * @precision:  jpeg sample precision
54  * @is_rgb:     is an RGB pixel format
55  */
56 struct mxc_jpeg_fmt {
57         const char                              *name;
58         u32                                     fourcc;
59         enum v4l2_jpeg_chroma_subsampling       subsampling;
60         int                                     nc;
61         int                                     depth;
62         int                                     mem_planes;
63         int                                     comp_planes;
64         int                                     h_align;
65         int                                     v_align;
66         u32                                     flags;
67         u8                                      precision;
68         u8                                      is_rgb;
69 };
70
71 struct mxc_jpeg_desc {
72         u32 next_descpt_ptr;
73         u32 buf_base0;
74         u32 buf_base1;
75         u32 line_pitch;
76         u32 stm_bufbase;
77         u32 stm_bufsize;
78         u32 imgsize;
79         u32 stm_ctrl;
80 } __packed;
81
82 struct mxc_jpeg_q_data {
83         const struct mxc_jpeg_fmt       *fmt;
84         u32                             sizeimage[MXC_JPEG_MAX_PLANES];
85         u32                             bytesperline[MXC_JPEG_MAX_PLANES];
86         int                             w;
87         int                             w_adjusted;
88         int                             h;
89         int                             h_adjusted;
90         unsigned int                    sequence;
91         struct v4l2_rect                crop;
92 };
93
94 struct mxc_jpeg_ctx {
95         struct mxc_jpeg_dev             *mxc_jpeg;
96         struct mxc_jpeg_q_data          out_q;
97         struct mxc_jpeg_q_data          cap_q;
98         struct v4l2_fh                  fh;
99         enum mxc_jpeg_enc_state         enc_state;
100         int                             slot;
101         unsigned int                    source_change;
102         bool                            header_parsed;
103         struct v4l2_ctrl_handler        ctrl_handler;
104         u8                              jpeg_quality;
105         struct delayed_work             task_timer;
106 };
107
108 struct mxc_jpeg_slot_data {
109         int slot;
110         bool used;
111         struct mxc_jpeg_desc *desc; // enc/dec descriptor
112         struct mxc_jpeg_desc *cfg_desc; // configuration descriptor
113         void *cfg_stream_vaddr; // configuration bitstream virtual address
114         unsigned int cfg_stream_size;
115         dma_addr_t desc_handle;
116         dma_addr_t cfg_desc_handle; // configuration descriptor dma address
117         dma_addr_t cfg_stream_handle; // configuration bitstream dma address
118 };
119
120 struct mxc_jpeg_dev {
121         spinlock_t                      hw_lock; /* hardware access lock */
122         unsigned int                    mode;
123         struct mutex                    lock; /* v4l2 ioctls serialization */
124         struct clk_bulk_data            *clks;
125         int                             num_clks;
126         struct platform_device          *pdev;
127         struct device                   *dev;
128         void __iomem                    *base_reg;
129         struct v4l2_device              v4l2_dev;
130         struct v4l2_m2m_dev             *m2m_dev;
131         struct video_device             *dec_vdev;
132         struct mxc_jpeg_slot_data       slot_data;
133         int                             num_domains;
134         struct device                   **pd_dev;
135         struct device_link              **pd_link;
136 };
137
138 /**
139  * struct mxc_jpeg_sof_comp - JPEG Start Of Frame component fields
140  * @id:                         component id
141  * @v:                          vertical sampling
142  * @h:                          horizontal sampling
143  * @quantization_table_no:      id of quantization table
144  */
145 struct mxc_jpeg_sof_comp {
146         u8 id;
147         u8 v :4;
148         u8 h :4;
149         u8 quantization_table_no;
150 } __packed;
151
152 #define MXC_JPEG_MAX_COMPONENTS 4
153 /**
154  * struct mxc_jpeg_sof - JPEG Start Of Frame marker fields
155  * @length:             Start of Frame length
156  * @precision:          precision (bits per pixel per color component)
157  * @height:             image height
158  * @width:              image width
159  * @components_no:      number of color components
160  * @comp:               component fields for each color component
161  */
162 struct mxc_jpeg_sof {
163         u16 length;
164         u8 precision;
165         u16 height, width;
166         u8 components_no;
167         struct mxc_jpeg_sof_comp comp[MXC_JPEG_MAX_COMPONENTS];
168 } __packed;
169
170 /**
171  * struct mxc_jpeg_sos_comp - JPEG Start Of Scan component fields
172  * @id:                 component id
173  * @huffman_table_no:   id of the Huffman table
174  */
175 struct mxc_jpeg_sos_comp {
176         u8 id; /*component id*/
177         u8 huffman_table_no;
178 } __packed;
179
180 /**
181  * struct mxc_jpeg_sos - JPEG Start Of Scan marker fields
182  * @length:             Start of Frame length
183  * @components_no:      number of color components
184  * @comp:               SOS component fields for each color component
185  * @ignorable_bytes:    ignorable bytes
186  */
187 struct mxc_jpeg_sos {
188         u16 length;
189         u8 components_no;
190         struct mxc_jpeg_sos_comp comp[MXC_JPEG_MAX_COMPONENTS];
191         u8 ignorable_bytes[3];
192 } __packed;
193
194 #endif