xref: /OK3568_Linux_fs/kernel/drivers/video/rockchip/iep/iep_drv.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef IEP_DRV_H_
3*4882a593Smuzhiyun #define IEP_DRV_H_
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/device.h>
6*4882a593Smuzhiyun #include <linux/miscdevice.h>
7*4882a593Smuzhiyun #include <linux/mutex.h>
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include "iep.h"
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #define IEP_REG_LEN         0x100
12*4882a593Smuzhiyun #define IEP_CMD_REG_LEN     0xE
13*4882a593Smuzhiyun #define IEP_ADD_REG_LEN     0xE0
14*4882a593Smuzhiyun #define IEP_RAW_REG_LEN     0xA
15*4882a593Smuzhiyun #define IEP_SYS_REG_LEN     0x6
16*4882a593Smuzhiyun #define IEP_CNF_REG_LEN     0x2
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define IEP_CNF_REG_BASE    0x0
19*4882a593Smuzhiyun #define IEP_SYS_REG_BASE    0x2
20*4882a593Smuzhiyun #define IEP_CMD_REG_BASE    0x8
21*4882a593Smuzhiyun #define IEP_ADD_REG_BASE    0x20
22*4882a593Smuzhiyun #define IEP_RAW_REG_BASE    0x16
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun struct iep_parameter_req {
25*4882a593Smuzhiyun 	struct iep_img src;
26*4882a593Smuzhiyun 	struct iep_img dst;
27*4882a593Smuzhiyun };
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun struct iep_parameter_deinterlace {
30*4882a593Smuzhiyun 	struct iep_img src1;
31*4882a593Smuzhiyun 	struct iep_img dst1;
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun 	struct iep_img src_itemp;
34*4882a593Smuzhiyun 	struct iep_img src_ftemp;
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 	struct iep_img dst_itemp;
37*4882a593Smuzhiyun 	struct iep_img dst_ftemp;
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun 	u8 dein_mode;
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun 	// deinterlace high frequency
42*4882a593Smuzhiyun 	u8 dein_high_fre_en;
43*4882a593Smuzhiyun 	u8 dein_high_fre_fct;
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun 	// deinterlace edge interpolation
46*4882a593Smuzhiyun 	u8 dein_ei_mode;
47*4882a593Smuzhiyun 	u8 dein_ei_smooth;
48*4882a593Smuzhiyun 	u8 dein_ei_sel;
49*4882a593Smuzhiyun 	u8 dein_ei_radius;
50*4882a593Smuzhiyun };
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun struct iep_parameter_enhance {
53*4882a593Smuzhiyun 	u8 yuv_3D_denoise_en;
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun 	u8 yuv_enhance_en;
56*4882a593Smuzhiyun 	float yuv_enh_saturation; //0-1.992
57*4882a593Smuzhiyun 	float yuv_enh_contrast; //0-1.992
58*4882a593Smuzhiyun 	s8 yuv_enh_brightness; //-32<brightness<31
59*4882a593Smuzhiyun 	s8 yuv_enh_hue_angle; //0-30,value is 0 - 30
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun 	u8 video_mode; //0-3
62*4882a593Smuzhiyun 	u8 color_bar_y; //0-127
63*4882a593Smuzhiyun 	u8 color_bar_u; //0-127
64*4882a593Smuzhiyun 	u8 color_bar_v; //0-127
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	u8 rgb_enhance_en;
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 	u8 rgb_cg_en; //sw_rgb_con_gam_en
69*4882a593Smuzhiyun 	double cg_rr;
70*4882a593Smuzhiyun 	double cg_rg;
71*4882a593Smuzhiyun 	double cg_rb;
72*4882a593Smuzhiyun 	u8 rgb_color_enhance_en; //sw_rgb_color_enh_en
73*4882a593Smuzhiyun 	float rgb_enh_coe; //0-3.96875
74*4882a593Smuzhiyun };
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun struct iep_parameter_scale {
77*4882a593Smuzhiyun 	u8 scale_up_mode;
78*4882a593Smuzhiyun };
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun struct iep_parameter_convert {
81*4882a593Smuzhiyun 	u8 dither_up_en;
82*4882a593Smuzhiyun 	u8 dither_down_en; //not to be used
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	u8 yuv2rgb_mode;
85*4882a593Smuzhiyun 	u8 rgb2yuv_mode;
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 	u8 global_alpha_value;
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun 	u8 rgb2yuv_clip_en;
90*4882a593Smuzhiyun 	u8 yuv2rgb_clip_en;
91*4882a593Smuzhiyun };
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun typedef struct iep_session {
94*4882a593Smuzhiyun 	/* a linked list of data so we can access them for debugging */
95*4882a593Smuzhiyun 	struct list_head    list_session;
96*4882a593Smuzhiyun 	/* a linked list of register data waiting for process */
97*4882a593Smuzhiyun 	struct list_head    waiting;
98*4882a593Smuzhiyun 	/* a linked list of register data in ready */
99*4882a593Smuzhiyun 	struct list_head    ready;
100*4882a593Smuzhiyun 	/* a linked list of register data in processing */
101*4882a593Smuzhiyun 	struct list_head    running;
102*4882a593Smuzhiyun 	/* all coommand this thread done */
103*4882a593Smuzhiyun 	atomic_t            done;
104*4882a593Smuzhiyun 	wait_queue_head_t   wait;
105*4882a593Smuzhiyun 	pid_t               pid;
106*4882a593Smuzhiyun 	atomic_t            task_running;
107*4882a593Smuzhiyun 	atomic_t            num_done;
108*4882a593Smuzhiyun } iep_session;
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun typedef struct iep_service_info {
111*4882a593Smuzhiyun 	struct mutex        lock;
112*4882a593Smuzhiyun 	struct timer_list	timer;          /* timer for power off */
113*4882a593Smuzhiyun 	struct list_head	waiting;        /* link to link_reg in struct iep_reg */
114*4882a593Smuzhiyun 	atomic_t            waitcnt;
115*4882a593Smuzhiyun 	struct list_head    ready;          /* link to link_reg in struct iep_reg */
116*4882a593Smuzhiyun 	struct list_head	running;        /* link to link_reg in struct iep_reg */
117*4882a593Smuzhiyun 	struct list_head	done;           /* link to link_reg in struct iep_reg */
118*4882a593Smuzhiyun 	struct list_head	session;        /* link to list_session in struct vpu_session */
119*4882a593Smuzhiyun 	atomic_t		    total_running;
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun 	struct iep_reg      *reg;
122*4882a593Smuzhiyun 	bool                enable;
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	struct mutex	    mutex;  // mutex
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun 	struct iep_iommu_info *iommu_info;
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun 	struct device *iommu_dev;
129*4882a593Smuzhiyun 	u32 alloc_type;
130*4882a593Smuzhiyun } iep_service_info;
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun struct iep_reg {
133*4882a593Smuzhiyun 	iep_session *session;
134*4882a593Smuzhiyun 	struct list_head 	session_link;      /* link to rga service session */
135*4882a593Smuzhiyun 	struct list_head 	status_link;       /* link to register set list */
136*4882a593Smuzhiyun 	uint32_t 			reg[0x300];
137*4882a593Smuzhiyun 	bool                dpi_en;
138*4882a593Smuzhiyun 	int                 off_x;
139*4882a593Smuzhiyun 	int                 off_y;
140*4882a593Smuzhiyun 	int                 act_width;
141*4882a593Smuzhiyun 	int                 act_height;
142*4882a593Smuzhiyun 	int                 vir_width;
143*4882a593Smuzhiyun 	int                 vir_height;
144*4882a593Smuzhiyun 	int                 layer;
145*4882a593Smuzhiyun 	unsigned int        format;
146*4882a593Smuzhiyun 	struct list_head    mem_region_list;
147*4882a593Smuzhiyun };
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun struct iep_mem_region {
150*4882a593Smuzhiyun 	struct list_head srv_lnk;
151*4882a593Smuzhiyun 	struct list_head reg_lnk;
152*4882a593Smuzhiyun 	struct list_head session_lnk;
153*4882a593Smuzhiyun 	unsigned long iova;              /* virtual address for iommu */
154*4882a593Smuzhiyun 	unsigned long len;
155*4882a593Smuzhiyun 	int hdl;
156*4882a593Smuzhiyun };
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun #endif
159*4882a593Smuzhiyun 
160