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 197