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