188 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			188 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| /*
 | |
|  * i.MX8QXP/i.MX8QM JPEG encoder/decoder v4l2 driver
 | |
|  *
 | |
|  * Copyright 2018-2019 NXP
 | |
|  */
 | |
| 
 | |
| #include <media/v4l2-ctrls.h>
 | |
| #include <media/v4l2-device.h>
 | |
| #include <media/v4l2-fh.h>
 | |
| 
 | |
| #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
 |