/* SPDX-License-Identifier: GPL-2.0 */ /* * i.MX8QXP/i.MX8QM JPEG encoder/decoder v4l2 driver * * Copyright 2018-2019 NXP */ #include #include #include #ifndef _MXC_JPEG_CORE_H #define _MXC_JPEG_CORE_H #define MXC_JPEG_NAME "mxc-jpeg" #define MXC_JPEG_FMT_TYPE_ENC 0 #define MXC_JPEG_FMT_TYPE_RAW 1 #define MXC_JPEG_DEFAULT_WIDTH 1280 #define MXC_JPEG_DEFAULT_HEIGHT 720 #define MXC_JPEG_DEFAULT_PFMT V4L2_PIX_FMT_BGR24 #define MXC_JPEG_MIN_WIDTH 64 #define MXC_JPEG_MIN_HEIGHT 64 #define MXC_JPEG_MAX_WIDTH 0x2000 #define MXC_JPEG_MAX_HEIGHT 0x2000 #define MXC_JPEG_MAX_CFG_STREAM 0x1000 #define MXC_JPEG_H_ALIGN 3 #define MXC_JPEG_W_ALIGN 3 #define MXC_JPEG_MAX_SIZEIMAGE 0xFFFFFC00 #define MXC_JPEG_MAX_PLANES 2 enum mxc_jpeg_enc_state { MXC_JPEG_ENCODING = 0, /* jpeg encode phase */ MXC_JPEG_ENC_CONF = 1, /* jpeg encoder config phase */ }; enum mxc_jpeg_mode { MXC_JPEG_DECODE = 0, /* jpeg decode mode */ MXC_JPEG_ENCODE = 1, /* jpeg encode mode */ }; /** * struct mxc_jpeg_fmt - driver's internal color format data * @name: format description * @fourcc: fourcc code, 0 if not applicable * @subsampling: subsampling of jpeg components * @nc: number of color components * @depth: number of bits per pixel * @colplanes: number of color planes (1 for packed formats) * @h_align: horizontal alignment order (align to 2^h_align) * @v_align: vertical alignment order (align to 2^v_align) * @flags: flags describing format applicability * @precision: jpeg sample precision */ struct mxc_jpeg_fmt { const char *name; u32 fourcc; enum v4l2_jpeg_chroma_subsampling subsampling; int nc; int depth; int colplanes; int h_align; int v_align; u32 flags; u8 precision; }; struct mxc_jpeg_desc { u32 next_descpt_ptr; u32 buf_base0; u32 buf_base1; u32 line_pitch; u32 stm_bufbase; u32 stm_bufsize; u32 imgsize; u32 stm_ctrl; } __packed; struct mxc_jpeg_q_data { const struct mxc_jpeg_fmt *fmt; u32 sizeimage[MXC_JPEG_MAX_PLANES]; u32 bytesperline[MXC_JPEG_MAX_PLANES]; int w; int w_adjusted; int h; int h_adjusted; unsigned int sequence; }; struct mxc_jpeg_ctx { struct mxc_jpeg_dev *mxc_jpeg; struct mxc_jpeg_q_data out_q; struct mxc_jpeg_q_data cap_q; struct v4l2_fh fh; enum mxc_jpeg_enc_state enc_state; unsigned int slot; unsigned int source_change; bool header_parsed; struct v4l2_ctrl_handler ctrl_handler; u8 jpeg_quality; }; struct mxc_jpeg_slot_data { bool used; struct mxc_jpeg_desc *desc; // enc/dec descriptor struct mxc_jpeg_desc *cfg_desc; // configuration descriptor void *cfg_stream_vaddr; // configuration bitstream virtual address unsigned int cfg_stream_size; dma_addr_t desc_handle; dma_addr_t cfg_desc_handle; // configuration descriptor dma address dma_addr_t cfg_stream_handle; // configuration bitstream dma address }; struct mxc_jpeg_dev { spinlock_t hw_lock; /* hardware access lock */ unsigned int mode; struct mutex lock; /* v4l2 ioctls serialization */ struct clk_bulk_data *clks; int num_clks; struct platform_device *pdev; struct device *dev; void __iomem *base_reg; struct v4l2_device v4l2_dev; struct v4l2_m2m_dev *m2m_dev; struct video_device *dec_vdev; struct mxc_jpeg_slot_data slot_data[MXC_MAX_SLOTS]; int num_domains; struct device **pd_dev; struct device_link **pd_link; }; /** * struct mxc_jpeg_sof_comp - JPEG Start Of Frame component fields * @id: component id * @v: vertical sampling * @h: horizontal sampling * @quantization_table_no: id of quantization table */ struct mxc_jpeg_sof_comp { u8 id; u8 v :4; u8 h :4; u8 quantization_table_no; } __packed; #define MXC_JPEG_MAX_COMPONENTS 4 /** * struct mxc_jpeg_sof - JPEG Start Of Frame marker fields * @length: Start of Frame length * @precision: precision (bits per pixel per color component) * @height: image height * @width: image width * @components_no: number of color components * @comp: component fields for each color component */ struct mxc_jpeg_sof { u16 length; u8 precision; u16 height, width; u8 components_no; struct mxc_jpeg_sof_comp comp[MXC_JPEG_MAX_COMPONENTS]; } __packed; /** * struct mxc_jpeg_sos_comp - JPEG Start Of Scan component fields * @id: component id * @huffman_table_no: id of the Huffman table */ struct mxc_jpeg_sos_comp { u8 id; /*component id*/ u8 huffman_table_no; } __packed; /** * struct mxc_jpeg_sos - JPEG Start Of Scan marker fields * @length: Start of Frame length * @components_no: number of color components * @comp: SOS component fields for each color component * @ignorable_bytes: ignorable bytes */ struct mxc_jpeg_sos { u16 length; u8 components_no; struct mxc_jpeg_sos_comp comp[MXC_JPEG_MAX_COMPONENTS]; u8 ignorable_bytes[3]; } __packed; #endif