xref: /OK3568_Linux_fs/kernel/drivers/video/rockchip/iep/iep.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _IEP_H_
3*4882a593Smuzhiyun #define _IEP_H_
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun /* Capability for current iep version
6*4882a593Smuzhiyun using by userspace to determine iep features */
7*4882a593Smuzhiyun struct IEP_CAP {
8*4882a593Smuzhiyun 	u8 scaling_supported;
9*4882a593Smuzhiyun 	u8 i4_deinterlace_supported;
10*4882a593Smuzhiyun 	u8 i2_deinterlace_supported;
11*4882a593Smuzhiyun 	u8 compression_noise_reduction_supported;
12*4882a593Smuzhiyun 	u8 sampling_noise_reduction_supported;
13*4882a593Smuzhiyun 	u8 hsb_enhancement_supported;
14*4882a593Smuzhiyun 	u8 cg_enhancement_supported;
15*4882a593Smuzhiyun 	u8 direct_path_supported;
16*4882a593Smuzhiyun 	u16 max_dynamic_width;
17*4882a593Smuzhiyun 	u16 max_dynamic_height;
18*4882a593Smuzhiyun 	u16 max_static_width;
19*4882a593Smuzhiyun 	u16 max_static_height;
20*4882a593Smuzhiyun 	u8 max_enhance_radius;
21*4882a593Smuzhiyun };
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define IEP_IOC_MAGIC 'i'
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define IEP_SET_PARAMETER_REQ		_IOW(IEP_IOC_MAGIC, 1, unsigned long)
26*4882a593Smuzhiyun #define IEP_SET_PARAMETER_DEINTERLACE	_IOW(IEP_IOC_MAGIC, 2, unsigned long)
27*4882a593Smuzhiyun #define IEP_SET_PARAMETER_ENHANCE	_IOW(IEP_IOC_MAGIC, 3, unsigned long)
28*4882a593Smuzhiyun #define IEP_SET_PARAMETER_CONVERT	_IOW(IEP_IOC_MAGIC, 4, unsigned long)
29*4882a593Smuzhiyun #define IEP_SET_PARAMETER_SCALE		_IOW(IEP_IOC_MAGIC, 5, unsigned long)
30*4882a593Smuzhiyun #define IEP_GET_RESULT_SYNC		_IOW(IEP_IOC_MAGIC, 6, unsigned long)
31*4882a593Smuzhiyun #define IEP_GET_RESULT_ASYNC		_IOW(IEP_IOC_MAGIC, 7, unsigned long)
32*4882a593Smuzhiyun #define IEP_SET_PARAMETER		_IOW(IEP_IOC_MAGIC, 8, unsigned long)
33*4882a593Smuzhiyun #define IEP_RELEASE_CURRENT_TASK	_IOW(IEP_IOC_MAGIC, 9, unsigned long)
34*4882a593Smuzhiyun #define IEP_GET_IOMMU_STATE		_IOR(IEP_IOC_MAGIC,10, unsigned long)
35*4882a593Smuzhiyun #define IEP_QUERY_CAP			_IOR(IEP_IOC_MAGIC,11, struct IEP_CAP)
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #ifdef CONFIG_COMPAT
38*4882a593Smuzhiyun #define COMPAT_IEP_SET_PARAMETER_REQ		_IOW(IEP_IOC_MAGIC, 1, u32)
39*4882a593Smuzhiyun #define COMPAT_IEP_SET_PARAMETER_DEINTERLACE	_IOW(IEP_IOC_MAGIC, 2, u32)
40*4882a593Smuzhiyun #define COMPAT_IEP_SET_PARAMETER_ENHANCE	_IOW(IEP_IOC_MAGIC, 3, u32)
41*4882a593Smuzhiyun #define COMPAT_IEP_SET_PARAMETER_CONVERT	_IOW(IEP_IOC_MAGIC, 4, u32)
42*4882a593Smuzhiyun #define COMPAT_IEP_SET_PARAMETER_SCALE		_IOW(IEP_IOC_MAGIC, 5, u32)
43*4882a593Smuzhiyun #define COMPAT_IEP_GET_RESULT_SYNC		_IOW(IEP_IOC_MAGIC, 6, u32)
44*4882a593Smuzhiyun #define COMPAT_IEP_GET_RESULT_ASYNC		_IOW(IEP_IOC_MAGIC, 7, u32)
45*4882a593Smuzhiyun #define COMPAT_IEP_SET_PARAMETER		_IOW(IEP_IOC_MAGIC, 8, u32)
46*4882a593Smuzhiyun #define COMPAT_IEP_RELEASE_CURRENT_TASK		_IOW(IEP_IOC_MAGIC, 9, u32)
47*4882a593Smuzhiyun #define COMPAT_IEP_GET_IOMMU_STATE		_IOR(IEP_IOC_MAGIC,10, u32)
48*4882a593Smuzhiyun #define COMPAT_IEP_QUERY_CAP			_IOR(IEP_IOC_MAGIC,11, struct IEP_CAP)
49*4882a593Smuzhiyun #endif
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun /* Driver information */
52*4882a593Smuzhiyun #define DRIVER_DESC		"IEP Device Driver"
53*4882a593Smuzhiyun #define DRIVER_NAME		"iep"
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define DEBUG
56*4882a593Smuzhiyun #ifdef DEBUG
57*4882a593Smuzhiyun #define iep_debug(level, fmt, args...)				\
58*4882a593Smuzhiyun 	do {							\
59*4882a593Smuzhiyun 		if (debug >= level)				\
60*4882a593Smuzhiyun 			pr_info("%s:%d: " fmt,			\
61*4882a593Smuzhiyun 				 __func__, __LINE__, ##args);	\
62*4882a593Smuzhiyun 	} while (0)
63*4882a593Smuzhiyun #else
64*4882a593Smuzhiyun #define iep_debug(level, fmt, args...)
65*4882a593Smuzhiyun #endif
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #define iep_debug_enter() vpu_debug(4, "enter\n")
68*4882a593Smuzhiyun #define iep_debug_leave() vpu_debug(4, "leave\n")
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun #define iep_err(fmt, args...)				\
71*4882a593Smuzhiyun 		pr_err("%s:%d: " fmt, __func__, __LINE__, ##args)
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun /* Logging */
74*4882a593Smuzhiyun #define IEP_DEBUG 0
75*4882a593Smuzhiyun #if IEP_DEBUG
76*4882a593Smuzhiyun #define IEP_DBG(format, args...)	printk("%s: " format, DRIVER_NAME, ## args)
77*4882a593Smuzhiyun #else
78*4882a593Smuzhiyun #define IEP_DBG(format, args...)
79*4882a593Smuzhiyun #endif
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun #define IEP_INFORMATION 1
82*4882a593Smuzhiyun #if IEP_INFORMATION
83*4882a593Smuzhiyun #define IEP_INFO(format, args...)			\
84*4882a593Smuzhiyun 		printk(KERN_INFO "%s: " format, DRIVER_NAME, ## args)
85*4882a593Smuzhiyun #else
86*4882a593Smuzhiyun #define IEP_INFO(format, args...)
87*4882a593Smuzhiyun #endif
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun #define IEP_ERR(format, args...)	printk(KERN_ERR "%s: " format, DRIVER_NAME, ## args)
90*4882a593Smuzhiyun #define IEP_WARNING(format, args...)	printk(KERN_WARNING "%s: " format, DRIVER_NAME, ## args)
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun enum {
93*4882a593Smuzhiyun 	yuv2rgb_BT_601_l = 0x0,     /* BT.601_1 */
94*4882a593Smuzhiyun 	yuv2rgb_BT_601_f = 0x1,     /* BT.601_f */
95*4882a593Smuzhiyun 	yuv2rgb_BT_709_l = 0x2,     /* BT.709_1 */
96*4882a593Smuzhiyun 	yuv2rgb_BT_709_f = 0x3,     /* BT.709_f */
97*4882a593Smuzhiyun };
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun enum {
100*4882a593Smuzhiyun 	rgb2yuv_BT_601_l = 0x0,     /* BT.601_1 */
101*4882a593Smuzhiyun 	rgb2yuv_BT_601_f = 0x1,     /* BT.601_f */
102*4882a593Smuzhiyun 	rgb2yuv_BT_709_l = 0x2,     /* BT.709_1 */
103*4882a593Smuzhiyun 	rgb2yuv_BT_709_f = 0x3,     /* BT.709_f */
104*4882a593Smuzhiyun };
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun enum {
107*4882a593Smuzhiyun 	dein_mode_bypass_dis         = 0x0,
108*4882a593Smuzhiyun 	dein_mode_I4O2               = 0x1,
109*4882a593Smuzhiyun 	dein_mode_I4O1B              = 0x2,
110*4882a593Smuzhiyun 	dein_mode_I4O1T              = 0x3,
111*4882a593Smuzhiyun 	dein_mode_I2O1B              = 0x4,
112*4882a593Smuzhiyun 	dein_mode_I2O1T              = 0x5,
113*4882a593Smuzhiyun 	dein_mode_bypass             = 0x6,
114*4882a593Smuzhiyun };
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun enum IEP_FIELD_ORDER {
117*4882a593Smuzhiyun 	FIELD_ORDER_TOP_FIRST,
118*4882a593Smuzhiyun 	FIELD_ORDER_BOTTOM_FIRST
119*4882a593Smuzhiyun };
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun enum IEP_YUV_DEINTERLACE_MODE {
122*4882a593Smuzhiyun 	IEP_DEINTERLACE_MODE_DISABLE,
123*4882a593Smuzhiyun 	IEP_DEINTERLACE_MODE_I2O1,
124*4882a593Smuzhiyun 	IEP_DEINTERLACE_MODE_I4O1,
125*4882a593Smuzhiyun 	IEP_DEINTERLACE_MODE_I4O2,
126*4882a593Smuzhiyun 	IEP_DEINTERLACE_MODE_BYPASS
127*4882a593Smuzhiyun };
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun enum {
130*4882a593Smuzhiyun 	rgb_enhance_bypass          = 0x0,
131*4882a593Smuzhiyun 	rgb_enhance_denoise         = 0x1,
132*4882a593Smuzhiyun 	rgb_enhance_detail          = 0x2,
133*4882a593Smuzhiyun 	rgb_enhance_edge            = 0x3,
134*4882a593Smuzhiyun };/* for rgb_enhance_mode */
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun enum {
137*4882a593Smuzhiyun 	rgb_contrast_CC_P_DDE          = 0x0, /* cg prior to dde */
138*4882a593Smuzhiyun 	rgb_contrast_DDE_P_CC          = 0x1, /* dde prior to cg */
139*4882a593Smuzhiyun }; /* for rgb_contrast_enhance_mode */
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun enum {
142*4882a593Smuzhiyun 	black_screen                   = 0x0,
143*4882a593Smuzhiyun 	blue_screen                    = 0x1,
144*4882a593Smuzhiyun 	color_bar                      = 0x2,
145*4882a593Smuzhiyun 	normal_mode                    = 0x3,
146*4882a593Smuzhiyun }; /* for video mode */
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun /*
149*4882a593Smuzhiyun           Alpha    Red     Green   Blue
150*4882a593Smuzhiyun {  4, 32, {{32,24,   24,16,  16, 8,  8, 0 }}, GGL_RGBA },    IEP_FORMAT_ARGB_8888
151*4882a593Smuzhiyun {  4, 32, {{32,24,   8, 0,  16, 8,  24,16 }}, GGL_RGB  },    IEP_FORMAT_ABGR_8888
152*4882a593Smuzhiyun {  4, 32, {{ 8, 0,  32,24,  24,16,  16, 8 }}, GGL_RGB  },    IEP_FORMAT_RGBA_8888
153*4882a593Smuzhiyun {  4, 32, {{ 8, 0,  16, 8,  24,16,  32,24 }}, GGL_BGRA },    IEP_FORMAT_BGRA_8888
154*4882a593Smuzhiyun {  2, 16, {{ 0, 0,  16,11,  11, 5,   5, 0 }}, GGL_RGB  },    IEP_FORMAT_RGB_565
155*4882a593Smuzhiyun {  2, 16, {{ 0, 0,   5, 0,  11, 5,  16,11 }}, GGL_RGB  },    IEP_FORMAT_RGB_565
156*4882a593Smuzhiyun */
157*4882a593Smuzhiyun enum {
158*4882a593Smuzhiyun 	IEP_FORMAT_ARGB_8888    = 0x0,
159*4882a593Smuzhiyun 	IEP_FORMAT_ABGR_8888    = 0x1,
160*4882a593Smuzhiyun 	IEP_FORMAT_RGBA_8888    = 0x2,
161*4882a593Smuzhiyun 	IEP_FORMAT_BGRA_8888    = 0x3,
162*4882a593Smuzhiyun 	IEP_FORMAT_RGB_565      = 0x4,
163*4882a593Smuzhiyun 	IEP_FORMAT_BGR_565      = 0x5,
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 	IEP_FORMAT_YCbCr_422_SP = 0x10,
166*4882a593Smuzhiyun 	IEP_FORMAT_YCbCr_422_P  = 0x11,
167*4882a593Smuzhiyun 	IEP_FORMAT_YCbCr_420_SP = 0x12,
168*4882a593Smuzhiyun 	IEP_FORMAT_YCbCr_420_P  = 0x13,
169*4882a593Smuzhiyun 	IEP_FORMAT_YCrCb_422_SP = 0x14,
170*4882a593Smuzhiyun 	IEP_FORMAT_YCrCb_422_P  = 0x15,/* same as IEP_FORMAT_YCbCr_422_P */
171*4882a593Smuzhiyun 	IEP_FORMAT_YCrCb_420_SP = 0x16,
172*4882a593Smuzhiyun 	IEP_FORMAT_YCrCb_420_P  = 0x17,/* same as IEP_FORMAT_YCbCr_420_P */
173*4882a593Smuzhiyun }; /* for format */
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun struct iep_img
176*4882a593Smuzhiyun {
177*4882a593Smuzhiyun 	u16 act_w;	/* act_width */
178*4882a593Smuzhiyun 	u16 act_h;	/* act_height */
179*4882a593Smuzhiyun 	s16 x_off;	/* x offset for the vir,word unit */
180*4882a593Smuzhiyun 	s16 y_off;	/* y offset for the vir,word unit */
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 	u16 vir_w;	/* unit :pix */
183*4882a593Smuzhiyun 	u16 vir_h;	/* unit :pix */
184*4882a593Smuzhiyun 	u32 format;
185*4882a593Smuzhiyun 	u32 mem_addr;
186*4882a593Smuzhiyun 	u32 uv_addr;
187*4882a593Smuzhiyun 	u32 v_addr;
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	u8 rb_swap;	/* not be used */
190*4882a593Smuzhiyun 	u8 uv_swap;	/* not be used */
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 	u8 alpha_swap;	/* not be used */
193*4882a593Smuzhiyun };
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun struct IEP_MSG {
196*4882a593Smuzhiyun 	struct iep_img src;
197*4882a593Smuzhiyun 	struct iep_img dst;
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	struct iep_img src1;
200*4882a593Smuzhiyun 	struct iep_img dst1;
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun 	struct iep_img src_itemp;
203*4882a593Smuzhiyun 	struct iep_img src_ftemp;
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 	struct iep_img dst_itemp;
206*4882a593Smuzhiyun 	struct iep_img dst_ftemp;
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun 	u8 dither_up_en;
209*4882a593Smuzhiyun 	u8 dither_down_en;/* not to be used */
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun 	u8 yuv2rgb_mode;
212*4882a593Smuzhiyun 	u8 rgb2yuv_mode;
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun 	u8 global_alpha_value;
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun 	u8 rgb2yuv_clip_en;
217*4882a593Smuzhiyun 	u8 yuv2rgb_clip_en;
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 	u8 lcdc_path_en;
220*4882a593Smuzhiyun 	s32 off_x;
221*4882a593Smuzhiyun 	s32 off_y;
222*4882a593Smuzhiyun 	s32 width;
223*4882a593Smuzhiyun 	s32 height;
224*4882a593Smuzhiyun 	s32 layer;
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun 	u8 yuv_3D_denoise_en;
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun 	/* yuv color enhance */
229*4882a593Smuzhiyun 	u8 yuv_enhance_en;
230*4882a593Smuzhiyun 	s32 sat_con_int;
231*4882a593Smuzhiyun 	s32 contrast_int;
232*4882a593Smuzhiyun 	s32 cos_hue_int;
233*4882a593Smuzhiyun 	s32 sin_hue_int;
234*4882a593Smuzhiyun 	s8 yuv_enh_brightness;	/*-32<brightness<31*/
235*4882a593Smuzhiyun 	u8 video_mode;		/*0-3*/
236*4882a593Smuzhiyun 	u8 color_bar_y;	/*0-127*/
237*4882a593Smuzhiyun 	u8 color_bar_u;	/*0-127*/
238*4882a593Smuzhiyun 	u8 color_bar_v;	/*0-127*/
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun 	u8 rgb_enhance_en;/*i don't konw what is used*/
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun 	u8 rgb_color_enhance_en;/*sw_rgb_color_enh_en*/
244*4882a593Smuzhiyun 	u32 rgb_enh_coe;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 	u8 rgb_enhance_mode;/*sw_rgb_enh_sel,dde sel*/
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 	u8 rgb_cg_en;/*sw_rgb_con_gam_en*/
249*4882a593Smuzhiyun 	u32 cg_tab[192];
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun 	/*sw_con_gam_order;0 cg prior to dde,1 dde prior to cg*/
252*4882a593Smuzhiyun 	u8 rgb_contrast_enhance_mode;
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun 	s32 enh_threshold;
255*4882a593Smuzhiyun 	s32 enh_alpha;
256*4882a593Smuzhiyun 	s32 enh_radius;
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	u8 scale_up_mode;
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun 	u8 field_order;
261*4882a593Smuzhiyun 	u8 dein_mode;
262*4882a593Smuzhiyun 	/*DIL HF*/
263*4882a593Smuzhiyun 	u8 dein_high_fre_en;
264*4882a593Smuzhiyun 	u8 dein_high_fre_fct;
265*4882a593Smuzhiyun 	/*DIL EI*/
266*4882a593Smuzhiyun 	u8 dein_ei_mode;
267*4882a593Smuzhiyun 	u8 dein_ei_smooth;
268*4882a593Smuzhiyun 	u8 dein_ei_sel;
269*4882a593Smuzhiyun 	u8 dein_ei_radius;/*when dein_ei_sel=0 will be used*/
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun 	u8 vir_addr_enable;
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun 	void *base;
274*4882a593Smuzhiyun };
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun #endif
277