cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

jpeg-core.h (7323B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/* linux/drivers/media/platform/samsung/s5p-jpeg/jpeg-core.h
      3 *
      4 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
      5 *		http://www.samsung.com
      6 *
      7 * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com>
      8 */
      9
     10#ifndef JPEG_CORE_H_
     11#define JPEG_CORE_H_
     12
     13#include <linux/interrupt.h>
     14#include <media/v4l2-device.h>
     15#include <media/v4l2-fh.h>
     16#include <media/v4l2-ctrls.h>
     17
     18#define S5P_JPEG_M2M_NAME		"s5p-jpeg"
     19
     20#define JPEG_MAX_CLOCKS			4
     21
     22/* JPEG compression quality setting */
     23#define S5P_JPEG_COMPR_QUAL_BEST	0
     24#define S5P_JPEG_COMPR_QUAL_WORST	3
     25
     26/* JPEG RGB to YCbCr conversion matrix coefficients */
     27#define S5P_JPEG_COEF11			0x4d
     28#define S5P_JPEG_COEF12			0x97
     29#define S5P_JPEG_COEF13			0x1e
     30#define S5P_JPEG_COEF21			0x2c
     31#define S5P_JPEG_COEF22			0x57
     32#define S5P_JPEG_COEF23			0x83
     33#define S5P_JPEG_COEF31			0x83
     34#define S5P_JPEG_COEF32			0x6e
     35#define S5P_JPEG_COEF33			0x13
     36
     37#define EXYNOS3250_IRQ_TIMEOUT		0x10000000
     38
     39/* a selection of JPEG markers */
     40#define JPEG_MARKER_TEM				0x01
     41#define JPEG_MARKER_SOF0				0xc0
     42#define JPEG_MARKER_DHT				0xc4
     43#define JPEG_MARKER_RST				0xd0
     44#define JPEG_MARKER_SOI				0xd8
     45#define JPEG_MARKER_EOI				0xd9
     46#define	JPEG_MARKER_SOS				0xda
     47#define JPEG_MARKER_DQT				0xdb
     48#define JPEG_MARKER_DHP				0xde
     49
     50/* Flags that indicate a format can be used for capture/output */
     51#define SJPEG_FMT_FLAG_ENC_CAPTURE	(1 << 0)
     52#define SJPEG_FMT_FLAG_ENC_OUTPUT	(1 << 1)
     53#define SJPEG_FMT_FLAG_DEC_CAPTURE	(1 << 2)
     54#define SJPEG_FMT_FLAG_DEC_OUTPUT	(1 << 3)
     55#define SJPEG_FMT_FLAG_S5P		(1 << 4)
     56#define SJPEG_FMT_FLAG_EXYNOS3250	(1 << 5)
     57#define SJPEG_FMT_FLAG_EXYNOS4		(1 << 6)
     58#define SJPEG_FMT_RGB			(1 << 7)
     59#define SJPEG_FMT_NON_RGB		(1 << 8)
     60
     61#define S5P_JPEG_ENCODE		0
     62#define S5P_JPEG_DECODE		1
     63#define S5P_JPEG_DISABLE	-1
     64
     65#define FMT_TYPE_OUTPUT		0
     66#define FMT_TYPE_CAPTURE	1
     67
     68#define SJPEG_SUBSAMPLING_444	0x11
     69#define SJPEG_SUBSAMPLING_422	0x21
     70#define SJPEG_SUBSAMPLING_420	0x22
     71
     72#define S5P_JPEG_MAX_MARKER	4
     73
     74/* Version numbers */
     75enum sjpeg_version {
     76	SJPEG_S5P,
     77	SJPEG_EXYNOS3250,
     78	SJPEG_EXYNOS4,
     79	SJPEG_EXYNOS5420,
     80	SJPEG_EXYNOS5433,
     81};
     82
     83enum exynos4_jpeg_result {
     84	OK_ENC_OR_DEC,
     85	ERR_PROT,
     86	ERR_DEC_INVALID_FORMAT,
     87	ERR_MULTI_SCAN,
     88	ERR_FRAME,
     89	ERR_UNKNOWN,
     90};
     91
     92enum  exynos4_jpeg_img_quality_level {
     93	QUALITY_LEVEL_1 = 0,	/* high */
     94	QUALITY_LEVEL_2,
     95	QUALITY_LEVEL_3,
     96	QUALITY_LEVEL_4,	/* low */
     97};
     98
     99enum s5p_jpeg_ctx_state {
    100	JPEGCTX_RUNNING = 0,
    101	JPEGCTX_RESOLUTION_CHANGE,
    102};
    103
    104/**
    105 * struct s5p_jpeg - JPEG IP abstraction
    106 * @lock:		the mutex protecting this structure
    107 * @slock:		spinlock protecting the device contexts
    108 * @v4l2_dev:		v4l2 device for mem2mem mode
    109 * @vfd_encoder:	video device node for encoder mem2mem mode
    110 * @vfd_decoder:	video device node for decoder mem2mem mode
    111 * @m2m_dev:		v4l2 mem2mem device data
    112 * @regs:		JPEG IP registers mapping
    113 * @irq:		JPEG IP irq
    114 * @irq_ret:		JPEG IP irq result value
    115 * @clocks:		JPEG IP clock(s)
    116 * @dev:		JPEG IP struct device
    117 * @variant:		driver variant to be used
    118 * @irq_status:		interrupt flags set during single encode/decode
    119 *			operation
    120 */
    121struct s5p_jpeg {
    122	struct mutex		lock;
    123	spinlock_t		slock;
    124
    125	struct v4l2_device	v4l2_dev;
    126	struct video_device	*vfd_encoder;
    127	struct video_device	*vfd_decoder;
    128	struct v4l2_m2m_dev	*m2m_dev;
    129
    130	void __iomem		*regs;
    131	unsigned int		irq;
    132	enum exynos4_jpeg_result irq_ret;
    133	struct clk		*clocks[JPEG_MAX_CLOCKS];
    134	struct device		*dev;
    135	struct s5p_jpeg_variant *variant;
    136	u32			irq_status;
    137};
    138
    139struct s5p_jpeg_variant {
    140	unsigned int		version;
    141	unsigned int		fmt_ver_flag;
    142	unsigned int		hw3250_compat:1;
    143	unsigned int		htbl_reinit:1;
    144	unsigned int		hw_ex4_compat:1;
    145	const struct v4l2_m2m_ops *m2m_ops;
    146	irqreturn_t		(*jpeg_irq)(int irq, void *priv);
    147	const char		*clk_names[JPEG_MAX_CLOCKS];
    148	int			num_clocks;
    149};
    150
    151/**
    152 * struct s5p_jpeg_fmt - driver's internal color format data
    153 * @fourcc:	the fourcc code, 0 if not applicable
    154 * @depth:	number of bits per pixel
    155 * @colplanes:	number of color planes (1 for packed formats)
    156 * @memplanes:	number of memory planes (1 for packed formats)
    157 * @h_align:	horizontal alignment order (align to 2^h_align)
    158 * @v_align:	vertical alignment order (align to 2^v_align)
    159 * @subsampling:subsampling of a raw format or a JPEG
    160 * @flags:	flags describing format applicability
    161 */
    162struct s5p_jpeg_fmt {
    163	u32	fourcc;
    164	int	depth;
    165	int	colplanes;
    166	int	memplanes;
    167	int	h_align;
    168	int	v_align;
    169	int	subsampling;
    170	u32	flags;
    171};
    172
    173/**
    174 * struct s5p_jpeg_marker - collection of markers from jpeg header
    175 * @marker:	markers' positions relative to the buffer beginning
    176 * @len:	markers' payload lengths (without length field)
    177 * @n:		number of markers in collection
    178 */
    179struct s5p_jpeg_marker {
    180	u32	marker[S5P_JPEG_MAX_MARKER];
    181	u32	len[S5P_JPEG_MAX_MARKER];
    182	u32	n;
    183};
    184
    185/**
    186 * struct s5p_jpeg_q_data - parameters of one queue
    187 * @fmt:	driver-specific format of this queue
    188 * @w:		image width
    189 * @h:		image height
    190 * @sos:	JPEG_MARKER_SOS's position relative to the buffer beginning
    191 * @dht:	JPEG_MARKER_DHT' positions relative to the buffer beginning
    192 * @dqt:	JPEG_MARKER_DQT' positions relative to the buffer beginning
    193 * @sof:	JPEG_MARKER_SOF0's position relative to the buffer beginning
    194 * @sof_len:	JPEG_MARKER_SOF0's payload length (without length field itself)
    195 * @size:	image buffer size in bytes
    196 */
    197struct s5p_jpeg_q_data {
    198	struct s5p_jpeg_fmt	*fmt;
    199	u32			w;
    200	u32			h;
    201	u32			sos;
    202	struct s5p_jpeg_marker	dht;
    203	struct s5p_jpeg_marker	dqt;
    204	u32			sof;
    205	u32			sof_len;
    206	u32			size;
    207};
    208
    209/**
    210 * struct s5p_jpeg_ctx - the device context data
    211 * @jpeg:		JPEG IP device for this context
    212 * @mode:		compression (encode) operation or decompression (decode)
    213 * @compr_quality:	destination image quality in compression (encode) mode
    214 * @restart_interval:	JPEG restart interval for JPEG encoding
    215 * @subsampling:	subsampling of a raw format or a JPEG
    216 * @out_q:		source (output) queue information
    217 * @cap_q:		destination (capture) queue queue information
    218 * @scale_factor:	scale factor for JPEG decoding
    219 * @crop_rect:		a rectangle representing crop area of the output buffer
    220 * @fh:			V4L2 file handle
    221 * @hdr_parsed:		set if header has been parsed during decompression
    222 * @crop_altered:	set if crop rectangle has been altered by the user space
    223 * @ctrl_handler:	controls handler
    224 * @state:		state of the context
    225 */
    226struct s5p_jpeg_ctx {
    227	struct s5p_jpeg		*jpeg;
    228	unsigned int		mode;
    229	unsigned short		compr_quality;
    230	unsigned short		restart_interval;
    231	unsigned short		subsampling;
    232	struct s5p_jpeg_q_data	out_q;
    233	struct s5p_jpeg_q_data	cap_q;
    234	unsigned int		scale_factor;
    235	struct v4l2_rect	crop_rect;
    236	struct v4l2_fh		fh;
    237	bool			hdr_parsed;
    238	bool			crop_altered;
    239	struct v4l2_ctrl_handler ctrl_handler;
    240	enum s5p_jpeg_ctx_state	state;
    241};
    242
    243/**
    244 * struct s5p_jpeg_buffer - description of memory containing input JPEG data
    245 * @size:	buffer size
    246 * @curr:	current position in the buffer
    247 * @data:	pointer to the data
    248 */
    249struct s5p_jpeg_buffer {
    250	unsigned long size;
    251	unsigned long curr;
    252	unsigned long data;
    253};
    254
    255/**
    256 * struct s5p_jpeg_addr - JPEG converter physical address set for DMA
    257 * @y:   luminance plane physical address
    258 * @cb:  Cb plane physical address
    259 * @cr:  Cr plane physical address
    260 */
    261struct s5p_jpeg_addr {
    262	u32     y;
    263	u32     cb;
    264	u32     cr;
    265};
    266
    267#endif /* JPEG_CORE_H */