xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
4*4882a593Smuzhiyun  * Author:Mark Yao <mark.yao@rock-chips.com>
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef _ROCKCHIP_DRM_VOP_H
8*4882a593Smuzhiyun #define _ROCKCHIP_DRM_VOP_H
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <drm/drm_plane.h>
11*4882a593Smuzhiyun #include <drm/drm_modes.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include "rockchip_drm_drv.h"
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun /*
16*4882a593Smuzhiyun  * major: IP major version, used for IP structure
17*4882a593Smuzhiyun  * minor: big feature change under same structure
18*4882a593Smuzhiyun  * build: RTL current SVN number
19*4882a593Smuzhiyun  */
20*4882a593Smuzhiyun #define VOP_VERSION(major, minor)	((major) << 8 | (minor))
21*4882a593Smuzhiyun #define VOP_MAJOR(version)		((version) >> 8)
22*4882a593Smuzhiyun #define VOP_MINOR(version)		((version) & 0xff)
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define VOP2_VERSION(major, minor, build)	((major) << 24 | (minor) << 16 | (build))
25*4882a593Smuzhiyun #define VOP2_MAJOR(version)		(((version) >> 24) & 0xff)
26*4882a593Smuzhiyun #define VOP2_MINOR(version)		(((version) >> 16) & 0xff)
27*4882a593Smuzhiyun #define VOP2_BUILD(version)		((version) & 0xffff)
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #define VOP_VERSION_RK3528	VOP2_VERSION(0x50, 0x17, 0x1263)
30*4882a593Smuzhiyun #define VOP_VERSION_RK3562	VOP2_VERSION(0x50, 0x17, 0x4350)
31*4882a593Smuzhiyun #define VOP_VERSION_RK3568	VOP2_VERSION(0x40, 0x15, 0x8023)
32*4882a593Smuzhiyun #define VOP_VERSION_RK3588	VOP2_VERSION(0x40, 0x17, 0x6786)
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun /* register one connector */
35*4882a593Smuzhiyun #define ROCKCHIP_OUTPUT_DUAL_CHANNEL_LEFT_RIGHT_MODE	BIT(0)
36*4882a593Smuzhiyun /* register one connector */
37*4882a593Smuzhiyun #define ROCKCHIP_OUTPUT_DUAL_CHANNEL_ODD_EVEN_MODE	BIT(1)
38*4882a593Smuzhiyun #define ROCKCHIP_OUTPUT_DATA_SWAP			BIT(2)
39*4882a593Smuzhiyun /* MIPI DSI DataStream(cmd) mode on rk3588 */
40*4882a593Smuzhiyun #define ROCKCHIP_OUTPUT_MIPI_DS_MODE			BIT(3)
41*4882a593Smuzhiyun /* register two connector */
42*4882a593Smuzhiyun #define ROCKCHIP_OUTPUT_DUAL_CONNECTOR_SPLIT_MODE	BIT(4)
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #define AFBDC_FMT_RGB565	0x0
45*4882a593Smuzhiyun #define AFBDC_FMT_U8U8U8U8	0x5
46*4882a593Smuzhiyun #define AFBDC_FMT_U8U8U8	0x4
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #define VOP_FEATURE_OUTPUT_RGB10	BIT(0)
49*4882a593Smuzhiyun #define VOP_FEATURE_INTERNAL_RGB	BIT(1)
50*4882a593Smuzhiyun #define VOP_FEATURE_ALPHA_SCALE		BIT(2)
51*4882a593Smuzhiyun #define VOP_FEATURE_HDR10		BIT(3)
52*4882a593Smuzhiyun #define VOP_FEATURE_NEXT_HDR		BIT(4)
53*4882a593Smuzhiyun /* a feature to splice two windows and two vps to support resolution > 4096 */
54*4882a593Smuzhiyun #define VOP_FEATURE_SPLICE		BIT(5)
55*4882a593Smuzhiyun #define VOP_FEATURE_OVERSCAN		BIT(6)
56*4882a593Smuzhiyun #define VOP_FEATURE_VIVID_HDR		BIT(7)
57*4882a593Smuzhiyun #define VOP_FEATURE_POST_ACM		BIT(8)
58*4882a593Smuzhiyun #define VOP_FEATURE_POST_CSC		BIT(9)
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun #define VOP_FEATURE_OUTPUT_10BIT	VOP_FEATURE_OUTPUT_RGB10
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun #define WIN_FEATURE_HDR2SDR		BIT(0)
64*4882a593Smuzhiyun #define WIN_FEATURE_SDR2HDR		BIT(1)
65*4882a593Smuzhiyun #define WIN_FEATURE_PRE_OVERLAY		BIT(2)
66*4882a593Smuzhiyun #define WIN_FEATURE_AFBDC		BIT(3)
67*4882a593Smuzhiyun #define WIN_FEATURE_CLUSTER_MAIN	BIT(4)
68*4882a593Smuzhiyun #define WIN_FEATURE_CLUSTER_SUB		BIT(5)
69*4882a593Smuzhiyun /* Left win in splice mode */
70*4882a593Smuzhiyun #define WIN_FEATURE_SPLICE_LEFT		BIT(6)
71*4882a593Smuzhiyun /* a mirror win can only get fb address
72*4882a593Smuzhiyun  * from source win:
73*4882a593Smuzhiyun  * Cluster1---->Cluster0
74*4882a593Smuzhiyun  * Esmart1 ---->Esmart0
75*4882a593Smuzhiyun  * Smart1  ---->Smart0
76*4882a593Smuzhiyun  * This is a feather on rk3566
77*4882a593Smuzhiyun  */
78*4882a593Smuzhiyun #define WIN_FEATURE_MIRROR		BIT(6)
79*4882a593Smuzhiyun #define WIN_FEATURE_MULTI_AREA		BIT(7)
80*4882a593Smuzhiyun #define WIN_FEATURE_Y2R_13BIT_DEPTH	BIT(8)
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun #define VOP2_SOC_VARIANT		4
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun #define ROCKCHIP_DSC_PPS_SIZE_BYTE	88
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun enum vop_vp_id {
88*4882a593Smuzhiyun 	ROCKCHIP_VOP_VP0 = 0,
89*4882a593Smuzhiyun 	ROCKCHIP_VOP_VP1,
90*4882a593Smuzhiyun 	ROCKCHIP_VOP_VP2,
91*4882a593Smuzhiyun 	ROCKCHIP_VOP_VP3,
92*4882a593Smuzhiyun };
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun enum vop_win_phy_id {
95*4882a593Smuzhiyun 	ROCKCHIP_VOP_WIN0 = 0,
96*4882a593Smuzhiyun 	ROCKCHIP_VOP_WIN1,
97*4882a593Smuzhiyun 	ROCKCHIP_VOP_WIN2,
98*4882a593Smuzhiyun 	ROCKCHIP_VOP_WIN3,
99*4882a593Smuzhiyun 	ROCKCHIP_VOP_PHY_ID_INVALID = -1,
100*4882a593Smuzhiyun };
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun enum bcsh_out_mode {
103*4882a593Smuzhiyun 	BCSH_OUT_MODE_BLACK,
104*4882a593Smuzhiyun 	BCSH_OUT_MODE_BLUE,
105*4882a593Smuzhiyun 	BCSH_OUT_MODE_COLOR_BAR,
106*4882a593Smuzhiyun 	BCSH_OUT_MODE_NORMAL_VIDEO,
107*4882a593Smuzhiyun };
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun enum cabc_stage_mode {
110*4882a593Smuzhiyun 	LAST_FRAME_PWM_VAL	= 0x0,
111*4882a593Smuzhiyun 	CUR_FRAME_PWM_VAL	= 0x1,
112*4882a593Smuzhiyun 	STAGE_BY_STAGE		= 0x2
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun enum cabc_stage_up_mode {
116*4882a593Smuzhiyun 	MUL_MODE,
117*4882a593Smuzhiyun 	ADD_MODE,
118*4882a593Smuzhiyun };
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun /*
121*4882a593Smuzhiyun  *  the delay number of a window in different mode.
122*4882a593Smuzhiyun  */
123*4882a593Smuzhiyun enum vop2_win_dly_mode {
124*4882a593Smuzhiyun 	VOP2_DLY_MODE_DEFAULT,   /**< default mode */
125*4882a593Smuzhiyun 	VOP2_DLY_MODE_HISO_S,    /** HDR in SDR out mode, as a SDR window */
126*4882a593Smuzhiyun 	VOP2_DLY_MODE_HIHO_H,    /** HDR in HDR out mode, as a HDR window */
127*4882a593Smuzhiyun 	VOP2_DLY_MODE_MAX,
128*4882a593Smuzhiyun };
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun enum vop3_esmart_lb_mode {
131*4882a593Smuzhiyun 	VOP3_ESMART_8K_MODE,
132*4882a593Smuzhiyun 	VOP3_ESMART_4K_4K_MODE,
133*4882a593Smuzhiyun 	VOP3_ESMART_4K_2K_2K_MODE,
134*4882a593Smuzhiyun 	VOP3_ESMART_2K_2K_2K_2K_MODE,
135*4882a593Smuzhiyun };
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun /*
138*4882a593Smuzhiyun  * vop2 dsc id
139*4882a593Smuzhiyun  */
140*4882a593Smuzhiyun #define ROCKCHIP_VOP2_DSC_8K	0
141*4882a593Smuzhiyun #define ROCKCHIP_VOP2_DSC_4K	1
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun /*
144*4882a593Smuzhiyun  * vop2 internal power domain id,
145*4882a593Smuzhiyun  * should be all none zero, 0 will be
146*4882a593Smuzhiyun  * treat as invalid;
147*4882a593Smuzhiyun  */
148*4882a593Smuzhiyun #define VOP2_PD_CLUSTER0	BIT(0)
149*4882a593Smuzhiyun #define VOP2_PD_CLUSTER1	BIT(1)
150*4882a593Smuzhiyun #define VOP2_PD_CLUSTER2	BIT(2)
151*4882a593Smuzhiyun #define VOP2_PD_CLUSTER3	BIT(3)
152*4882a593Smuzhiyun #define VOP2_PD_DSC_8K		BIT(5)
153*4882a593Smuzhiyun #define VOP2_PD_DSC_4K		BIT(6)
154*4882a593Smuzhiyun #define VOP2_PD_ESMART		BIT(7)
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun /*
157*4882a593Smuzhiyun  * vop2 submem power gate,
158*4882a593Smuzhiyun  * should be all none zero, 0 will be
159*4882a593Smuzhiyun  * treat as invalid;
160*4882a593Smuzhiyun  */
161*4882a593Smuzhiyun #define VOP2_MEM_PG_VP0		BIT(0)
162*4882a593Smuzhiyun #define VOP2_MEM_PG_VP1		BIT(1)
163*4882a593Smuzhiyun #define VOP2_MEM_PG_VP2		BIT(2)
164*4882a593Smuzhiyun #define VOP2_MEM_PG_VP3		BIT(3)
165*4882a593Smuzhiyun #define VOP2_MEM_PG_DB0		BIT(4)
166*4882a593Smuzhiyun #define VOP2_MEM_PG_DB1		BIT(5)
167*4882a593Smuzhiyun #define VOP2_MEM_PG_DB2		BIT(6)
168*4882a593Smuzhiyun #define VOP2_MEM_PG_WB		BIT(7)
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun #define DSP_BG_SWAP		0x1
171*4882a593Smuzhiyun #define DSP_RB_SWAP		0x2
172*4882a593Smuzhiyun #define DSP_RG_SWAP		0x4
173*4882a593Smuzhiyun #define DSP_DELTA_SWAP		0x8
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun #define V4L2_COLORSPACE_BT709F	0xfe
176*4882a593Smuzhiyun #define V4L2_COLORSPACE_BT2020F	0xff
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun enum vop_csc_format {
179*4882a593Smuzhiyun 	CSC_BT601L,
180*4882a593Smuzhiyun 	CSC_BT709L,
181*4882a593Smuzhiyun 	CSC_BT601F,
182*4882a593Smuzhiyun 	CSC_BT2020,
183*4882a593Smuzhiyun 	CSC_BT709L_13BIT,
184*4882a593Smuzhiyun 	CSC_BT709F_13BIT,
185*4882a593Smuzhiyun 	CSC_BT2020L_13BIT,
186*4882a593Smuzhiyun 	CSC_BT2020F_13BIT,
187*4882a593Smuzhiyun };
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun enum vop_csc_mode {
190*4882a593Smuzhiyun 	CSC_RGB,
191*4882a593Smuzhiyun 	CSC_YUV,
192*4882a593Smuzhiyun };
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun enum vop_csc_bit_depth {
195*4882a593Smuzhiyun 	CSC_10BIT_DEPTH,
196*4882a593Smuzhiyun 	CSC_13BIT_DEPTH,
197*4882a593Smuzhiyun };
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun enum vop_data_format {
200*4882a593Smuzhiyun 	VOP_FMT_ARGB8888 = 0,
201*4882a593Smuzhiyun 	VOP_FMT_RGB888,
202*4882a593Smuzhiyun 	VOP_FMT_RGB565 = 2,
203*4882a593Smuzhiyun 	VOP_FMT_YUYV = 2,
204*4882a593Smuzhiyun 	VOP_FMT_YUV420SP = 4,
205*4882a593Smuzhiyun 	VOP_FMT_YUV422SP,
206*4882a593Smuzhiyun 	VOP_FMT_YUV444SP,
207*4882a593Smuzhiyun };
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun enum vop_dsc_interface_mode {
210*4882a593Smuzhiyun 	VOP_DSC_IF_DISABLE = 0,
211*4882a593Smuzhiyun 	VOP_DSC_IF_HDMI = 1,
212*4882a593Smuzhiyun 	VOP_DSC_IF_MIPI_DS_MODE = 2,
213*4882a593Smuzhiyun 	VOP_DSC_IF_MIPI_VIDEO_MODE = 3,
214*4882a593Smuzhiyun };
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun struct vop_reg_data {
217*4882a593Smuzhiyun 	uint32_t offset;
218*4882a593Smuzhiyun 	uint32_t value;
219*4882a593Smuzhiyun };
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun struct vop_reg {
222*4882a593Smuzhiyun 	uint32_t mask;
223*4882a593Smuzhiyun 	uint32_t offset:17;
224*4882a593Smuzhiyun 	uint32_t shift:5;
225*4882a593Smuzhiyun 	uint32_t begin_minor:4;
226*4882a593Smuzhiyun 	uint32_t end_minor:4;
227*4882a593Smuzhiyun 	uint32_t reserved:2;
228*4882a593Smuzhiyun 	uint32_t major:3;
229*4882a593Smuzhiyun 	uint32_t write_mask:1;
230*4882a593Smuzhiyun };
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun struct vop_csc {
233*4882a593Smuzhiyun 	struct vop_reg y2r_en;
234*4882a593Smuzhiyun 	struct vop_reg r2r_en;
235*4882a593Smuzhiyun 	struct vop_reg r2y_en;
236*4882a593Smuzhiyun 	struct vop_reg csc_mode;
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 	uint32_t y2r_offset;
239*4882a593Smuzhiyun 	uint32_t r2r_offset;
240*4882a593Smuzhiyun 	uint32_t r2y_offset;
241*4882a593Smuzhiyun };
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun struct vop_rect {
244*4882a593Smuzhiyun 	int width;
245*4882a593Smuzhiyun 	int height;
246*4882a593Smuzhiyun };
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun struct vop_ctrl {
249*4882a593Smuzhiyun 	struct vop_reg version;
250*4882a593Smuzhiyun 	struct vop_reg standby;
251*4882a593Smuzhiyun 	struct vop_reg dma_stop;
252*4882a593Smuzhiyun 	struct vop_reg axi_outstanding_max_num;
253*4882a593Smuzhiyun 	struct vop_reg axi_max_outstanding_en;
254*4882a593Smuzhiyun 	struct vop_reg htotal_pw;
255*4882a593Smuzhiyun 	struct vop_reg hact_st_end;
256*4882a593Smuzhiyun 	struct vop_reg vtotal_pw;
257*4882a593Smuzhiyun 	struct vop_reg vact_st_end;
258*4882a593Smuzhiyun 	struct vop_reg vact_st_end_f1;
259*4882a593Smuzhiyun 	struct vop_reg vs_st_end_f1;
260*4882a593Smuzhiyun 	struct vop_reg hpost_st_end;
261*4882a593Smuzhiyun 	struct vop_reg vpost_st_end;
262*4882a593Smuzhiyun 	struct vop_reg vpost_st_end_f1;
263*4882a593Smuzhiyun 	struct vop_reg post_scl_factor;
264*4882a593Smuzhiyun 	struct vop_reg post_scl_ctrl;
265*4882a593Smuzhiyun 	struct vop_reg dsp_interlace;
266*4882a593Smuzhiyun 	struct vop_reg dsp_interlace_pol;
267*4882a593Smuzhiyun 	struct vop_reg global_regdone_en;
268*4882a593Smuzhiyun 	struct vop_reg auto_gate_en;
269*4882a593Smuzhiyun 	struct vop_reg post_lb_mode;
270*4882a593Smuzhiyun 	struct vop_reg dsp_layer_sel;
271*4882a593Smuzhiyun 	struct vop_reg overlay_mode;
272*4882a593Smuzhiyun 	struct vop_reg core_dclk_div;
273*4882a593Smuzhiyun 	struct vop_reg dclk_ddr;
274*4882a593Smuzhiyun 	struct vop_reg p2i_en;
275*4882a593Smuzhiyun 	struct vop_reg hdmi_dclk_out_en;
276*4882a593Smuzhiyun 	struct vop_reg rgb_en;
277*4882a593Smuzhiyun 	struct vop_reg lvds_en;
278*4882a593Smuzhiyun 	struct vop_reg edp_en;
279*4882a593Smuzhiyun 	struct vop_reg hdmi_en;
280*4882a593Smuzhiyun 	struct vop_reg mipi_en;
281*4882a593Smuzhiyun 	struct vop_reg data01_swap;
282*4882a593Smuzhiyun 	struct vop_reg mipi_dual_channel_en;
283*4882a593Smuzhiyun 	struct vop_reg dp_en;
284*4882a593Smuzhiyun 	struct vop_reg dclk_pol;
285*4882a593Smuzhiyun 	struct vop_reg pin_pol;
286*4882a593Smuzhiyun 	struct vop_reg rgb_dclk_pol;
287*4882a593Smuzhiyun 	struct vop_reg rgb_pin_pol;
288*4882a593Smuzhiyun 	struct vop_reg lvds_dclk_pol;
289*4882a593Smuzhiyun 	struct vop_reg lvds_pin_pol;
290*4882a593Smuzhiyun 	struct vop_reg hdmi_dclk_pol;
291*4882a593Smuzhiyun 	struct vop_reg hdmi_pin_pol;
292*4882a593Smuzhiyun 	struct vop_reg edp_dclk_pol;
293*4882a593Smuzhiyun 	struct vop_reg edp_pin_pol;
294*4882a593Smuzhiyun 	struct vop_reg mipi_dclk_pol;
295*4882a593Smuzhiyun 	struct vop_reg mipi_pin_pol;
296*4882a593Smuzhiyun 	struct vop_reg dp_dclk_pol;
297*4882a593Smuzhiyun 	struct vop_reg dp_pin_pol;
298*4882a593Smuzhiyun 	struct vop_reg dither_down_sel;
299*4882a593Smuzhiyun 	struct vop_reg dither_down_mode;
300*4882a593Smuzhiyun 	struct vop_reg dither_down_en;
301*4882a593Smuzhiyun 	struct vop_reg pre_dither_down_en;
302*4882a593Smuzhiyun 	struct vop_reg dither_up_en;
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun 	struct vop_reg sw_dac_sel;
305*4882a593Smuzhiyun 	struct vop_reg tve_sw_mode;
306*4882a593Smuzhiyun 	struct vop_reg tve_dclk_pol;
307*4882a593Smuzhiyun 	struct vop_reg tve_dclk_en;
308*4882a593Smuzhiyun 	struct vop_reg sw_genlock;
309*4882a593Smuzhiyun 	struct vop_reg sw_uv_offset_en;
310*4882a593Smuzhiyun 	struct vop_reg dsp_out_yuv;
311*4882a593Smuzhiyun 	struct vop_reg dsp_data_swap;
312*4882a593Smuzhiyun 	struct vop_reg dsp_bg_swap;
313*4882a593Smuzhiyun 	struct vop_reg dsp_rb_swap;
314*4882a593Smuzhiyun 	struct vop_reg dsp_rg_swap;
315*4882a593Smuzhiyun 	struct vop_reg dsp_delta_swap;
316*4882a593Smuzhiyun 	struct vop_reg dsp_dummy_swap;
317*4882a593Smuzhiyun 	struct vop_reg yuv_clip;
318*4882a593Smuzhiyun 	struct vop_reg dsp_ccir656_avg;
319*4882a593Smuzhiyun 	struct vop_reg dsp_black;
320*4882a593Smuzhiyun 	struct vop_reg dsp_blank;
321*4882a593Smuzhiyun 	struct vop_reg dsp_outzero;
322*4882a593Smuzhiyun 	struct vop_reg update_gamma_lut;
323*4882a593Smuzhiyun 	struct vop_reg lut_buffer_index;
324*4882a593Smuzhiyun 	struct vop_reg dsp_lut_en;
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun 	struct vop_reg out_mode;
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun 	struct vop_reg xmirror;
329*4882a593Smuzhiyun 	struct vop_reg ymirror;
330*4882a593Smuzhiyun 	struct vop_reg dsp_background;
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun 	/* AFBDC */
333*4882a593Smuzhiyun 	struct vop_reg afbdc_en;
334*4882a593Smuzhiyun 	struct vop_reg afbdc_sel;
335*4882a593Smuzhiyun 	struct vop_reg afbdc_format;
336*4882a593Smuzhiyun 	struct vop_reg afbdc_hreg_block_split;
337*4882a593Smuzhiyun 	struct vop_reg afbdc_pic_size;
338*4882a593Smuzhiyun 	struct vop_reg afbdc_hdr_ptr;
339*4882a593Smuzhiyun 	struct vop_reg afbdc_rstn;
340*4882a593Smuzhiyun 	struct vop_reg afbdc_pic_vir_width;
341*4882a593Smuzhiyun 	struct vop_reg afbdc_pic_offset;
342*4882a593Smuzhiyun 	struct vop_reg afbdc_axi_ctrl;
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun 	/* BCSH */
345*4882a593Smuzhiyun 	struct vop_reg bcsh_brightness;
346*4882a593Smuzhiyun 	struct vop_reg bcsh_contrast;
347*4882a593Smuzhiyun 	struct vop_reg bcsh_sat_con;
348*4882a593Smuzhiyun 	struct vop_reg bcsh_sin_hue;
349*4882a593Smuzhiyun 	struct vop_reg bcsh_cos_hue;
350*4882a593Smuzhiyun 	struct vop_reg bcsh_r2y_csc_mode;
351*4882a593Smuzhiyun 	struct vop_reg bcsh_r2y_en;
352*4882a593Smuzhiyun 	struct vop_reg bcsh_y2r_csc_mode;
353*4882a593Smuzhiyun 	struct vop_reg bcsh_y2r_en;
354*4882a593Smuzhiyun 	struct vop_reg bcsh_color_bar;
355*4882a593Smuzhiyun 	struct vop_reg bcsh_out_mode;
356*4882a593Smuzhiyun 	struct vop_reg bcsh_en;
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun 	/* HDR */
359*4882a593Smuzhiyun 	struct vop_reg level2_overlay_en;
360*4882a593Smuzhiyun 	struct vop_reg alpha_hard_calc;
361*4882a593Smuzhiyun 	struct vop_reg hdr2sdr_en;
362*4882a593Smuzhiyun 	struct vop_reg hdr2sdr_en_win0_csc;
363*4882a593Smuzhiyun 	struct vop_reg hdr2sdr_src_min;
364*4882a593Smuzhiyun 	struct vop_reg hdr2sdr_src_max;
365*4882a593Smuzhiyun 	struct vop_reg hdr2sdr_normfaceetf;
366*4882a593Smuzhiyun 	struct vop_reg hdr2sdr_dst_min;
367*4882a593Smuzhiyun 	struct vop_reg hdr2sdr_dst_max;
368*4882a593Smuzhiyun 	struct vop_reg hdr2sdr_normfacgamma;
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun 	struct vop_reg bt1886eotf_pre_conv_en;
371*4882a593Smuzhiyun 	struct vop_reg rgb2rgb_pre_conv_en;
372*4882a593Smuzhiyun 	struct vop_reg rgb2rgb_pre_conv_mode;
373*4882a593Smuzhiyun 	struct vop_reg st2084oetf_pre_conv_en;
374*4882a593Smuzhiyun 	struct vop_reg bt1886eotf_post_conv_en;
375*4882a593Smuzhiyun 	struct vop_reg rgb2rgb_post_conv_en;
376*4882a593Smuzhiyun 	struct vop_reg rgb2rgb_post_conv_mode;
377*4882a593Smuzhiyun 	struct vop_reg st2084oetf_post_conv_en;
378*4882a593Smuzhiyun 	struct vop_reg win_csc_mode_sel;
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun 	/* MCU OUTPUT */
381*4882a593Smuzhiyun 	struct vop_reg mcu_pix_total;
382*4882a593Smuzhiyun 	struct vop_reg mcu_cs_pst;
383*4882a593Smuzhiyun 	struct vop_reg mcu_cs_pend;
384*4882a593Smuzhiyun 	struct vop_reg mcu_rw_pst;
385*4882a593Smuzhiyun 	struct vop_reg mcu_rw_pend;
386*4882a593Smuzhiyun 	struct vop_reg mcu_clk_sel;
387*4882a593Smuzhiyun 	struct vop_reg mcu_hold_mode;
388*4882a593Smuzhiyun 	struct vop_reg mcu_frame_st;
389*4882a593Smuzhiyun 	struct vop_reg mcu_rs;
390*4882a593Smuzhiyun 	struct vop_reg mcu_bypass;
391*4882a593Smuzhiyun 	struct vop_reg mcu_type;
392*4882a593Smuzhiyun 	struct vop_reg mcu_rw_bypass_port;
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun 	/* bt1120 */
395*4882a593Smuzhiyun 	struct vop_reg bt1120_yc_swap;
396*4882a593Smuzhiyun 	struct vop_reg bt1120_en;
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 	/* bt656 */
399*4882a593Smuzhiyun 	struct vop_reg bt656_en;
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun 	struct vop_reg reg_done_frm;
402*4882a593Smuzhiyun 	struct vop_reg cfg_done;
403*4882a593Smuzhiyun };
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun struct vop_intr {
406*4882a593Smuzhiyun 	const int *intrs;
407*4882a593Smuzhiyun 	uint32_t nintrs;
408*4882a593Smuzhiyun 	struct vop_reg line_flag_num[2];
409*4882a593Smuzhiyun 	struct vop_reg enable;
410*4882a593Smuzhiyun 	struct vop_reg clear;
411*4882a593Smuzhiyun 	struct vop_reg status;
412*4882a593Smuzhiyun };
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun struct vop_scl_extension {
415*4882a593Smuzhiyun 	struct vop_reg cbcr_vsd_mode;
416*4882a593Smuzhiyun 	struct vop_reg cbcr_vsu_mode;
417*4882a593Smuzhiyun 	struct vop_reg cbcr_hsd_mode;
418*4882a593Smuzhiyun 	struct vop_reg cbcr_ver_scl_mode;
419*4882a593Smuzhiyun 	struct vop_reg cbcr_hor_scl_mode;
420*4882a593Smuzhiyun 	struct vop_reg yrgb_vsd_mode;
421*4882a593Smuzhiyun 	struct vop_reg yrgb_vsu_mode;
422*4882a593Smuzhiyun 	struct vop_reg yrgb_hsd_mode;
423*4882a593Smuzhiyun 	struct vop_reg yrgb_ver_scl_mode;
424*4882a593Smuzhiyun 	struct vop_reg yrgb_hor_scl_mode;
425*4882a593Smuzhiyun 	struct vop_reg line_load_mode;
426*4882a593Smuzhiyun 	struct vop_reg cbcr_axi_gather_num;
427*4882a593Smuzhiyun 	struct vop_reg yrgb_axi_gather_num;
428*4882a593Smuzhiyun 	struct vop_reg vsd_cbcr_gt2;
429*4882a593Smuzhiyun 	struct vop_reg vsd_cbcr_gt4;
430*4882a593Smuzhiyun 	struct vop_reg vsd_yrgb_gt2;
431*4882a593Smuzhiyun 	struct vop_reg vsd_yrgb_gt4;
432*4882a593Smuzhiyun 	struct vop_reg bic_coe_sel;
433*4882a593Smuzhiyun 	struct vop_reg cbcr_axi_gather_en;
434*4882a593Smuzhiyun 	struct vop_reg yrgb_axi_gather_en;
435*4882a593Smuzhiyun 	struct vop_reg lb_mode;
436*4882a593Smuzhiyun };
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun struct vop_scl_regs {
439*4882a593Smuzhiyun 	const struct vop_scl_extension *ext;
440*4882a593Smuzhiyun 
441*4882a593Smuzhiyun 	struct vop_reg scale_yrgb_x;
442*4882a593Smuzhiyun 	struct vop_reg scale_yrgb_y;
443*4882a593Smuzhiyun 	struct vop_reg scale_cbcr_x;
444*4882a593Smuzhiyun 	struct vop_reg scale_cbcr_y;
445*4882a593Smuzhiyun };
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun struct vop_afbc {
448*4882a593Smuzhiyun 	struct vop_reg enable;
449*4882a593Smuzhiyun 	struct vop_reg win_sel;
450*4882a593Smuzhiyun 	struct vop_reg format;
451*4882a593Smuzhiyun 	struct vop_reg rb_swap;
452*4882a593Smuzhiyun 	struct vop_reg uv_swap;
453*4882a593Smuzhiyun 	struct vop_reg auto_gating_en;
454*4882a593Smuzhiyun 	struct vop_reg rotate;
455*4882a593Smuzhiyun 	struct vop_reg block_split_en;
456*4882a593Smuzhiyun 	struct vop_reg pic_vir_width;
457*4882a593Smuzhiyun 	struct vop_reg tile_num;
458*4882a593Smuzhiyun 	struct vop_reg pic_offset;
459*4882a593Smuzhiyun 	struct vop_reg pic_size;
460*4882a593Smuzhiyun 	struct vop_reg dsp_offset;
461*4882a593Smuzhiyun 	struct vop_reg transform_offset;
462*4882a593Smuzhiyun 	struct vop_reg hdr_ptr;
463*4882a593Smuzhiyun 	struct vop_reg half_block_en;
464*4882a593Smuzhiyun 	struct vop_reg xmirror;
465*4882a593Smuzhiyun 	struct vop_reg ymirror;
466*4882a593Smuzhiyun 	struct vop_reg rotate_270;
467*4882a593Smuzhiyun 	struct vop_reg rotate_90;
468*4882a593Smuzhiyun 	struct vop_reg rstn;
469*4882a593Smuzhiyun };
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun struct vop_csc_table {
472*4882a593Smuzhiyun 	const uint32_t *y2r_bt601;
473*4882a593Smuzhiyun 	const uint32_t *y2r_bt601_12_235;
474*4882a593Smuzhiyun 	const uint32_t *y2r_bt601_10bit;
475*4882a593Smuzhiyun 	const uint32_t *y2r_bt601_10bit_12_235;
476*4882a593Smuzhiyun 	const uint32_t *r2y_bt601;
477*4882a593Smuzhiyun 	const uint32_t *r2y_bt601_12_235;
478*4882a593Smuzhiyun 	const uint32_t *r2y_bt601_10bit;
479*4882a593Smuzhiyun 	const uint32_t *r2y_bt601_10bit_12_235;
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun 	const uint32_t *y2r_bt709;
482*4882a593Smuzhiyun 	const uint32_t *y2r_bt709_10bit;
483*4882a593Smuzhiyun 	const uint32_t *r2y_bt709;
484*4882a593Smuzhiyun 	const uint32_t *r2y_bt709_10bit;
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun 	const uint32_t *y2r_bt2020;
487*4882a593Smuzhiyun 	const uint32_t *r2y_bt2020;
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun 	const uint32_t *r2r_bt709_to_bt2020;
490*4882a593Smuzhiyun 	const uint32_t *r2r_bt2020_to_bt709;
491*4882a593Smuzhiyun };
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun struct vop_hdr_table {
494*4882a593Smuzhiyun 	const uint32_t hdr2sdr_eetf_oetf_y0_offset;
495*4882a593Smuzhiyun 	const uint32_t hdr2sdr_eetf_oetf_y1_offset;
496*4882a593Smuzhiyun 	const uint32_t *hdr2sdr_eetf_yn;
497*4882a593Smuzhiyun 	const uint32_t *hdr2sdr_bt1886oetf_yn;
498*4882a593Smuzhiyun 	const uint32_t hdr2sdr_sat_y0_offset;
499*4882a593Smuzhiyun 	const uint32_t hdr2sdr_sat_y1_offset;
500*4882a593Smuzhiyun 	const uint32_t *hdr2sdr_sat_yn;
501*4882a593Smuzhiyun 
502*4882a593Smuzhiyun 	const uint32_t hdr2sdr_src_range_min;
503*4882a593Smuzhiyun 	const uint32_t hdr2sdr_src_range_max;
504*4882a593Smuzhiyun 	const uint32_t hdr2sdr_normfaceetf;
505*4882a593Smuzhiyun 	const uint32_t hdr2sdr_dst_range_min;
506*4882a593Smuzhiyun 	const uint32_t hdr2sdr_dst_range_max;
507*4882a593Smuzhiyun 	const uint32_t hdr2sdr_normfacgamma;
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun 	const uint32_t sdr2hdr_eotf_oetf_y0_offset;
510*4882a593Smuzhiyun 	const uint32_t sdr2hdr_eotf_oetf_y1_offset;
511*4882a593Smuzhiyun 	const uint32_t *sdr2hdr_bt1886eotf_yn_for_hlg_hdr;
512*4882a593Smuzhiyun 	const uint32_t *sdr2hdr_bt1886eotf_yn_for_bt2020;
513*4882a593Smuzhiyun 	const uint32_t *sdr2hdr_bt1886eotf_yn_for_hdr;
514*4882a593Smuzhiyun 	const uint32_t *sdr2hdr_st2084oetf_yn_for_hlg_hdr;
515*4882a593Smuzhiyun 	const uint32_t *sdr2hdr_st2084oetf_yn_for_bt2020;
516*4882a593Smuzhiyun 	const uint32_t *sdr2hdr_st2084oetf_yn_for_hdr;
517*4882a593Smuzhiyun 	const uint32_t sdr2hdr_oetf_dx_dxpow1_offset;
518*4882a593Smuzhiyun 	const uint32_t *sdr2hdr_st2084oetf_dxn_pow2;
519*4882a593Smuzhiyun 	const uint32_t *sdr2hdr_st2084oetf_dxn;
520*4882a593Smuzhiyun 	const uint32_t sdr2hdr_oetf_xn1_offset;
521*4882a593Smuzhiyun 	const uint32_t *sdr2hdr_st2084oetf_xn;
522*4882a593Smuzhiyun };
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun #define RK_HDRVIVID_TONE_SCA_TAB_LENGTH		257
525*4882a593Smuzhiyun #define RK_HDRVIVID_GAMMA_CURVE_LENGTH		81
526*4882a593Smuzhiyun #define RK_HDRVIVID_GAMMA_MDFVALUE_LENGTH	9
527*4882a593Smuzhiyun #define RK_SDR2HDR_INVGAMMA_CURVE_LENGTH	69
528*4882a593Smuzhiyun #define RK_SDR2HDR_INVGAMMA_S_IDX_LENGTH	6
529*4882a593Smuzhiyun #define RK_SDR2HDR_INVGAMMA_C_IDX_LENGTH	6
530*4882a593Smuzhiyun #define RK_SDR2HDR_SMGAIN_LENGTH		64
531*4882a593Smuzhiyun #define RK_HDRVIVID_TONE_SCA_AXI_TAB_LENGTH	264
532*4882a593Smuzhiyun 
533*4882a593Smuzhiyun struct hdrvivid_regs {
534*4882a593Smuzhiyun 	uint32_t sdr2hdr_ctrl;
535*4882a593Smuzhiyun 	uint32_t sdr2hdr_coe0;
536*4882a593Smuzhiyun 	uint32_t sdr2hdr_coe1;
537*4882a593Smuzhiyun 	uint32_t sdr2hdr_csc_coe00_01;
538*4882a593Smuzhiyun 	uint32_t sdr2hdr_csc_coe02_10;
539*4882a593Smuzhiyun 	uint32_t sdr2hdr_csc_coe11_12;
540*4882a593Smuzhiyun 	uint32_t sdr2hdr_csc_coe20_21;
541*4882a593Smuzhiyun 	uint32_t sdr2hdr_csc_coe22;
542*4882a593Smuzhiyun 	uint32_t hdrvivid_ctrl;
543*4882a593Smuzhiyun 	uint32_t hdr_pq_gamma;
544*4882a593Smuzhiyun 	uint32_t hlg_rfix_scalefac;
545*4882a593Smuzhiyun 	uint32_t hlg_maxluma;
546*4882a593Smuzhiyun 	uint32_t hlg_r_tm_lin2non;
547*4882a593Smuzhiyun 	uint32_t hdr_csc_coe00_01;
548*4882a593Smuzhiyun 	uint32_t hdr_csc_coe02_10;
549*4882a593Smuzhiyun 	uint32_t hdr_csc_coe11_12;
550*4882a593Smuzhiyun 	uint32_t hdr_csc_coe20_21;
551*4882a593Smuzhiyun 	uint32_t hdr_csc_coe22;
552*4882a593Smuzhiyun 	uint32_t hdr_tone_sca[RK_HDRVIVID_TONE_SCA_TAB_LENGTH];
553*4882a593Smuzhiyun 	uint32_t hdrgamma_curve[RK_HDRVIVID_GAMMA_CURVE_LENGTH];
554*4882a593Smuzhiyun 	uint32_t hdrgamma_mdfvalue[RK_HDRVIVID_GAMMA_MDFVALUE_LENGTH];
555*4882a593Smuzhiyun 	uint32_t sdrinvgamma_curve[RK_SDR2HDR_INVGAMMA_CURVE_LENGTH];
556*4882a593Smuzhiyun 	uint32_t sdrinvgamma_startidx[RK_SDR2HDR_INVGAMMA_S_IDX_LENGTH];
557*4882a593Smuzhiyun 	uint32_t sdrinvgamma_changeidx[RK_SDR2HDR_INVGAMMA_C_IDX_LENGTH];
558*4882a593Smuzhiyun 	uint32_t sdr_smgain[RK_SDR2HDR_SMGAIN_LENGTH];
559*4882a593Smuzhiyun 	uint32_t hdr_mode;
560*4882a593Smuzhiyun 	uint32_t tone_sca_axi_tab[RK_HDRVIVID_TONE_SCA_AXI_TAB_LENGTH];
561*4882a593Smuzhiyun };
562*4882a593Smuzhiyun 
563*4882a593Smuzhiyun struct hdr_extend {
564*4882a593Smuzhiyun 	uint32_t hdr_type;
565*4882a593Smuzhiyun 	uint32_t length;
566*4882a593Smuzhiyun 	union {
567*4882a593Smuzhiyun 		struct hdrvivid_regs hdrvivid_data;
568*4882a593Smuzhiyun 	};
569*4882a593Smuzhiyun };
570*4882a593Smuzhiyun 
571*4882a593Smuzhiyun enum _vop_hdrvivid_mode {
572*4882a593Smuzhiyun 	PQHDR2HDR_WITH_DYNAMIC = 0,
573*4882a593Smuzhiyun 	PQHDR2SDR_WITH_DYNAMIC,
574*4882a593Smuzhiyun 	HLG2PQHDR_WITH_DYNAMIC,
575*4882a593Smuzhiyun 	HLG2SDR_WITH_DYNAMIC,
576*4882a593Smuzhiyun 	HLG2PQHDR_WITHOUT_DYNAMIC,
577*4882a593Smuzhiyun 	HLG2SDR_WITHOUT_DYNAMIC,
578*4882a593Smuzhiyun 	HDR_BYPASS,
579*4882a593Smuzhiyun 	HDR102SDR,
580*4882a593Smuzhiyun 	SDR2HDR10,
581*4882a593Smuzhiyun 	SDR2HLG,
582*4882a593Smuzhiyun 	SDR2HDR10_USERSPACE = 100,
583*4882a593Smuzhiyun 	SDR2HLG_USERSPACE = 101,
584*4882a593Smuzhiyun };
585*4882a593Smuzhiyun 
586*4882a593Smuzhiyun enum vop_hdr_format {
587*4882a593Smuzhiyun 	HDR_NONE = 0,
588*4882a593Smuzhiyun 	HDR_HDR10 = 1,
589*4882a593Smuzhiyun 	HDR_HLGSTATIC = 2,
590*4882a593Smuzhiyun 	RESERVED3 = 3,		/* reserved for more future static hdr format */
591*4882a593Smuzhiyun 	RESERVED4 = 4,		/* reserved for more future static hdr format */
592*4882a593Smuzhiyun 	HDR_HDRVIVID = 5,
593*4882a593Smuzhiyun 	RESERVED6 = 6,		/* reserved for hdr vivid */
594*4882a593Smuzhiyun 	RESERVED7 = 7,		/* reserved for hdr vivid */
595*4882a593Smuzhiyun 	HDR_HDR10PLUS = 8,
596*4882a593Smuzhiyun 	RESERVED9 = 9,		/* reserved for hdr hdr10+ */
597*4882a593Smuzhiyun 	RESERVED10 = 10,	/* reserved for hdr hdr10+ */
598*4882a593Smuzhiyun 	HDR_NEXT = 11,
599*4882a593Smuzhiyun 	RESERVED12 = 12,	/* reserved for other dynamic hdr format */
600*4882a593Smuzhiyun 	RESERVED13 = 13,	/* reserved for other dynamic hdr format */
601*4882a593Smuzhiyun 	HDR_FORMAT_MAX,
602*4882a593Smuzhiyun };
603*4882a593Smuzhiyun 
604*4882a593Smuzhiyun struct post_csc_coef {
605*4882a593Smuzhiyun 	s32 csc_coef00;
606*4882a593Smuzhiyun 	s32 csc_coef01;
607*4882a593Smuzhiyun 	s32 csc_coef02;
608*4882a593Smuzhiyun 	s32 csc_coef10;
609*4882a593Smuzhiyun 	s32 csc_coef11;
610*4882a593Smuzhiyun 	s32 csc_coef12;
611*4882a593Smuzhiyun 	s32 csc_coef20;
612*4882a593Smuzhiyun 	s32 csc_coef21;
613*4882a593Smuzhiyun 	s32 csc_coef22;
614*4882a593Smuzhiyun 
615*4882a593Smuzhiyun 	s32 csc_dc0;
616*4882a593Smuzhiyun 	s32 csc_dc1;
617*4882a593Smuzhiyun 	s32 csc_dc2;
618*4882a593Smuzhiyun 
619*4882a593Smuzhiyun 	u32 range_type;
620*4882a593Smuzhiyun };
621*4882a593Smuzhiyun 
622*4882a593Smuzhiyun enum {
623*4882a593Smuzhiyun 	VOP_CSC_Y2R_BT601,
624*4882a593Smuzhiyun 	VOP_CSC_Y2R_BT709,
625*4882a593Smuzhiyun 	VOP_CSC_Y2R_BT2020,
626*4882a593Smuzhiyun 	VOP_CSC_R2Y_BT601,
627*4882a593Smuzhiyun 	VOP_CSC_R2Y_BT709,
628*4882a593Smuzhiyun 	VOP_CSC_R2Y_BT2020,
629*4882a593Smuzhiyun 	VOP_CSC_R2R_BT2020_TO_BT709,
630*4882a593Smuzhiyun 	VOP_CSC_R2R_BT709_TO_2020,
631*4882a593Smuzhiyun };
632*4882a593Smuzhiyun 
633*4882a593Smuzhiyun enum _vop_overlay_mode {
634*4882a593Smuzhiyun 	VOP_RGB_DOMAIN,
635*4882a593Smuzhiyun 	VOP_YUV_DOMAIN
636*4882a593Smuzhiyun };
637*4882a593Smuzhiyun 
638*4882a593Smuzhiyun enum _vop_sdr2hdr_func {
639*4882a593Smuzhiyun 	SDR2HDR_FOR_BT2020,
640*4882a593Smuzhiyun 	SDR2HDR_FOR_HDR,
641*4882a593Smuzhiyun 	SDR2HDR_FOR_HLG_HDR,
642*4882a593Smuzhiyun };
643*4882a593Smuzhiyun 
644*4882a593Smuzhiyun enum _vop_rgb2rgb_conv_mode {
645*4882a593Smuzhiyun 	BT709_TO_BT2020,
646*4882a593Smuzhiyun 	BT2020_TO_BT709,
647*4882a593Smuzhiyun };
648*4882a593Smuzhiyun 
649*4882a593Smuzhiyun enum _MCU_IOCTL {
650*4882a593Smuzhiyun 	MCU_WRCMD = 0,
651*4882a593Smuzhiyun 	MCU_WRDATA,
652*4882a593Smuzhiyun 	MCU_SETBYPASS,
653*4882a593Smuzhiyun };
654*4882a593Smuzhiyun 
655*4882a593Smuzhiyun struct vop_win_phy {
656*4882a593Smuzhiyun 	const struct vop_scl_regs *scl;
657*4882a593Smuzhiyun 	const uint32_t *data_formats;
658*4882a593Smuzhiyun 	uint32_t nformats;
659*4882a593Smuzhiyun 
660*4882a593Smuzhiyun 	struct vop_reg gate;
661*4882a593Smuzhiyun 	struct vop_reg enable;
662*4882a593Smuzhiyun 	struct vop_reg format;
663*4882a593Smuzhiyun 	struct vop_reg interlace_read;
664*4882a593Smuzhiyun 	struct vop_reg fmt_10;
665*4882a593Smuzhiyun 	struct vop_reg fmt_yuyv;
666*4882a593Smuzhiyun 	struct vop_reg csc_mode;
667*4882a593Smuzhiyun 	struct vop_reg xmirror;
668*4882a593Smuzhiyun 	struct vop_reg ymirror;
669*4882a593Smuzhiyun 	struct vop_reg rb_swap;
670*4882a593Smuzhiyun 	struct vop_reg act_info;
671*4882a593Smuzhiyun 	struct vop_reg dsp_info;
672*4882a593Smuzhiyun 	struct vop_reg dsp_st;
673*4882a593Smuzhiyun 	struct vop_reg yrgb_mst;
674*4882a593Smuzhiyun 	struct vop_reg uv_mst;
675*4882a593Smuzhiyun 	struct vop_reg yrgb_vir;
676*4882a593Smuzhiyun 	struct vop_reg uv_vir;
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun 	struct vop_reg channel;
679*4882a593Smuzhiyun 	struct vop_reg dst_alpha_ctl;
680*4882a593Smuzhiyun 	struct vop_reg src_alpha_ctl;
681*4882a593Smuzhiyun 	struct vop_reg alpha_mode;
682*4882a593Smuzhiyun 	struct vop_reg alpha_en;
683*4882a593Smuzhiyun 	struct vop_reg alpha_pre_mul;
684*4882a593Smuzhiyun 	struct vop_reg global_alpha_val;
685*4882a593Smuzhiyun 	struct vop_reg color_key;
686*4882a593Smuzhiyun 	struct vop_reg color_key_en;
687*4882a593Smuzhiyun };
688*4882a593Smuzhiyun 
689*4882a593Smuzhiyun struct vop_win_data {
690*4882a593Smuzhiyun 	uint32_t base;
691*4882a593Smuzhiyun 	enum drm_plane_type type;
692*4882a593Smuzhiyun 	const struct vop_win_phy *phy;
693*4882a593Smuzhiyun 	const struct vop_win_phy **area;
694*4882a593Smuzhiyun 	const uint64_t *format_modifiers;
695*4882a593Smuzhiyun 	const struct vop_csc *csc;
696*4882a593Smuzhiyun 	unsigned int area_size;
697*4882a593Smuzhiyun 	u64 feature;
698*4882a593Smuzhiyun };
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun struct vop2_cluster_regs {
701*4882a593Smuzhiyun 	struct vop_reg enable;
702*4882a593Smuzhiyun 	struct vop_reg afbc_enable;
703*4882a593Smuzhiyun 	struct vop_reg lb_mode;
704*4882a593Smuzhiyun 	struct vop_reg scl_lb_mode;
705*4882a593Smuzhiyun 	struct vop_reg frm_reset_en;
706*4882a593Smuzhiyun 
707*4882a593Smuzhiyun 	struct vop_reg src_color_ctrl;
708*4882a593Smuzhiyun 	struct vop_reg dst_color_ctrl;
709*4882a593Smuzhiyun 	struct vop_reg src_alpha_ctrl;
710*4882a593Smuzhiyun 	struct vop_reg dst_alpha_ctrl;
711*4882a593Smuzhiyun };
712*4882a593Smuzhiyun 
713*4882a593Smuzhiyun struct vop2_scl_regs {
714*4882a593Smuzhiyun 	struct vop_reg scale_yrgb_x;
715*4882a593Smuzhiyun 	struct vop_reg scale_yrgb_y;
716*4882a593Smuzhiyun 	struct vop_reg scale_cbcr_x;
717*4882a593Smuzhiyun 	struct vop_reg scale_cbcr_y;
718*4882a593Smuzhiyun 	struct vop_reg yrgb_hor_scl_mode;
719*4882a593Smuzhiyun 	struct vop_reg yrgb_hscl_filter_mode;
720*4882a593Smuzhiyun 	struct vop_reg yrgb_ver_scl_mode;
721*4882a593Smuzhiyun 	struct vop_reg yrgb_vscl_filter_mode;
722*4882a593Smuzhiyun 	struct vop_reg cbcr_ver_scl_mode;
723*4882a593Smuzhiyun 	struct vop_reg cbcr_hscl_filter_mode;
724*4882a593Smuzhiyun 	struct vop_reg cbcr_hor_scl_mode;
725*4882a593Smuzhiyun 	struct vop_reg cbcr_vscl_filter_mode;
726*4882a593Smuzhiyun 	struct vop_reg vsd_cbcr_gt2;
727*4882a593Smuzhiyun 	struct vop_reg vsd_cbcr_gt4;
728*4882a593Smuzhiyun 	struct vop_reg vsd_yrgb_gt2;
729*4882a593Smuzhiyun 	struct vop_reg vsd_yrgb_gt4;
730*4882a593Smuzhiyun 	struct vop_reg bic_coe_sel;
731*4882a593Smuzhiyun 	struct vop_reg xavg_en; /* supported from vop3 */
732*4882a593Smuzhiyun 	struct vop_reg xgt_en;
733*4882a593Smuzhiyun 	struct vop_reg xgt_mode;
734*4882a593Smuzhiyun 	struct vop_reg vsd_avg2;
735*4882a593Smuzhiyun 	struct vop_reg vsd_avg4;
736*4882a593Smuzhiyun };
737*4882a593Smuzhiyun 
738*4882a593Smuzhiyun struct vop2_win_regs {
739*4882a593Smuzhiyun 	const struct vop2_scl_regs *scl;
740*4882a593Smuzhiyun 	const struct vop2_cluster_regs *cluster;
741*4882a593Smuzhiyun 	const struct vop_afbc *afbc;
742*4882a593Smuzhiyun 
743*4882a593Smuzhiyun 	struct vop_reg gate;
744*4882a593Smuzhiyun 	struct vop_reg enable;
745*4882a593Smuzhiyun 	struct vop_reg format;
746*4882a593Smuzhiyun 	struct vop_reg tile_mode;
747*4882a593Smuzhiyun 	struct vop_reg csc_mode;
748*4882a593Smuzhiyun 	struct vop_reg csc_13bit_en;
749*4882a593Smuzhiyun 	struct vop_reg xmirror;
750*4882a593Smuzhiyun 	struct vop_reg ymirror;
751*4882a593Smuzhiyun 	struct vop_reg rb_swap;
752*4882a593Smuzhiyun 	struct vop_reg uv_swap;
753*4882a593Smuzhiyun 	struct vop_reg act_info;
754*4882a593Smuzhiyun 	struct vop_reg dsp_info;
755*4882a593Smuzhiyun 	struct vop_reg dsp_st;
756*4882a593Smuzhiyun 	struct vop_reg yrgb_mst;
757*4882a593Smuzhiyun 	struct vop_reg uv_mst;
758*4882a593Smuzhiyun 	struct vop_reg yrgb_vir;
759*4882a593Smuzhiyun 	struct vop_reg uv_vir;
760*4882a593Smuzhiyun 	struct vop_reg yuv_clip;
761*4882a593Smuzhiyun 	struct vop_reg lb_mode;
762*4882a593Smuzhiyun 	struct vop_reg y2r_en;
763*4882a593Smuzhiyun 	struct vop_reg r2y_en;
764*4882a593Smuzhiyun 	struct vop_reg channel;
765*4882a593Smuzhiyun 	struct vop_reg dst_alpha_ctl;
766*4882a593Smuzhiyun 	struct vop_reg src_alpha_ctl;
767*4882a593Smuzhiyun 	struct vop_reg alpha_mode;
768*4882a593Smuzhiyun 	struct vop_reg alpha_en;
769*4882a593Smuzhiyun 	struct vop_reg global_alpha_val;
770*4882a593Smuzhiyun 	struct vop_reg color_key;
771*4882a593Smuzhiyun 	struct vop_reg color_key_en;
772*4882a593Smuzhiyun 	struct vop_reg dither_up;
773*4882a593Smuzhiyun 	struct vop_reg axi_id;
774*4882a593Smuzhiyun 	struct vop_reg axi_yrgb_id;
775*4882a593Smuzhiyun 	struct vop_reg axi_uv_id;
776*4882a593Smuzhiyun 	struct vop_reg scale_engine_num;
777*4882a593Smuzhiyun };
778*4882a593Smuzhiyun 
779*4882a593Smuzhiyun struct vop2_video_port_regs {
780*4882a593Smuzhiyun 	struct vop_reg cfg_done;
781*4882a593Smuzhiyun 	struct vop_reg overlay_mode;
782*4882a593Smuzhiyun 	struct vop_reg dsp_background;
783*4882a593Smuzhiyun 	struct vop_reg port_mux;
784*4882a593Smuzhiyun 	struct vop_reg out_mode;
785*4882a593Smuzhiyun 	struct vop_reg standby;
786*4882a593Smuzhiyun 	struct vop_reg dsp_interlace;
787*4882a593Smuzhiyun 	struct vop_reg dsp_filed_pol;
788*4882a593Smuzhiyun 	struct vop_reg dsp_data_swap;
789*4882a593Smuzhiyun 	struct vop_reg dsp_x_mir_en;
790*4882a593Smuzhiyun 	struct vop_reg post_dsp_out_r2y;
791*4882a593Smuzhiyun 	struct vop_reg pre_scan_htiming;
792*4882a593Smuzhiyun 	struct vop_reg htotal_pw;
793*4882a593Smuzhiyun 	struct vop_reg hact_st_end;
794*4882a593Smuzhiyun 	struct vop_reg dsp_vtotal;
795*4882a593Smuzhiyun 	struct vop_reg sw_dsp_vtotal_imd;
796*4882a593Smuzhiyun 	struct vop_reg dsp_vs_end;
797*4882a593Smuzhiyun 	struct vop_reg vact_st_end;
798*4882a593Smuzhiyun 	struct vop_reg vact_st_end_f1;
799*4882a593Smuzhiyun 	struct vop_reg vs_st_end_f1;
800*4882a593Smuzhiyun 	struct vop_reg hpost_st_end;
801*4882a593Smuzhiyun 	struct vop_reg vpost_st_end;
802*4882a593Smuzhiyun 	struct vop_reg vpost_st_end_f1;
803*4882a593Smuzhiyun 	struct vop_reg post_scl_factor;
804*4882a593Smuzhiyun 	struct vop_reg post_scl_ctrl;
805*4882a593Smuzhiyun 	struct vop_reg dither_down_sel;
806*4882a593Smuzhiyun 	struct vop_reg dither_down_mode;
807*4882a593Smuzhiyun 	struct vop_reg dither_down_en;
808*4882a593Smuzhiyun 	struct vop_reg pre_dither_down_en;
809*4882a593Smuzhiyun 	struct vop_reg dither_up_en;
810*4882a593Smuzhiyun 	struct vop_reg bg_dly;
811*4882a593Smuzhiyun 
812*4882a593Smuzhiyun 	struct vop_reg core_dclk_div;
813*4882a593Smuzhiyun 	struct vop_reg p2i_en;
814*4882a593Smuzhiyun 	struct vop_reg dual_channel_en;
815*4882a593Smuzhiyun 	struct vop_reg dual_channel_swap;
816*4882a593Smuzhiyun 	struct vop_reg dsp_lut_en;
817*4882a593Smuzhiyun 
818*4882a593Smuzhiyun 	struct vop_reg dclk_div2;
819*4882a593Smuzhiyun 	struct vop_reg dclk_div2_phase_lock;
820*4882a593Smuzhiyun 
821*4882a593Smuzhiyun 	struct vop_reg hdr10_en;
822*4882a593Smuzhiyun 	struct vop_reg hdr_lut_update_en;
823*4882a593Smuzhiyun 	struct vop_reg hdr_lut_mode;
824*4882a593Smuzhiyun 	struct vop_reg hdr_lut_mst;
825*4882a593Smuzhiyun 	struct vop_reg hdr_lut_fetch_done;
826*4882a593Smuzhiyun 	struct vop_reg hdr_vivid_en;
827*4882a593Smuzhiyun 	struct vop_reg hdr_vivid_bypass_en;
828*4882a593Smuzhiyun 	struct vop_reg hdr_vivid_path_mode;
829*4882a593Smuzhiyun 	struct vop_reg hdr_vivid_dstgamut;
830*4882a593Smuzhiyun 	struct vop_reg sdr2hdr_en;
831*4882a593Smuzhiyun 	struct vop_reg sdr2hdr_dstmode;
832*4882a593Smuzhiyun 	struct vop_reg sdr2hdr_eotf_en;
833*4882a593Smuzhiyun 	struct vop_reg sdr2hdr_r2r_en;
834*4882a593Smuzhiyun 	struct vop_reg sdr2hdr_r2r_mode;
835*4882a593Smuzhiyun 	struct vop_reg sdr2hdr_oetf_en;
836*4882a593Smuzhiyun 	struct vop_reg sdr2hdr_bypass_en;
837*4882a593Smuzhiyun 	struct vop_reg sdr2hdr_auto_gating_en;
838*4882a593Smuzhiyun 	struct vop_reg sdr2hdr_path_en;
839*4882a593Smuzhiyun 	struct vop_reg hdr2sdr_en;
840*4882a593Smuzhiyun 	struct vop_reg hdr2sdr_bypass_en;
841*4882a593Smuzhiyun 	struct vop_reg hdr2sdr_auto_gating_en;
842*4882a593Smuzhiyun 	struct vop_reg hdr2sdr_src_min;
843*4882a593Smuzhiyun 	struct vop_reg hdr2sdr_src_max;
844*4882a593Smuzhiyun 	struct vop_reg hdr2sdr_normfaceetf;
845*4882a593Smuzhiyun 	struct vop_reg hdr2sdr_dst_min;
846*4882a593Smuzhiyun 	struct vop_reg hdr2sdr_dst_max;
847*4882a593Smuzhiyun 	struct vop_reg hdr2sdr_normfacgamma;
848*4882a593Smuzhiyun 	uint32_t hdr2sdr_eetf_oetf_y0_offset;
849*4882a593Smuzhiyun 	uint32_t hdr2sdr_sat_y0_offset;
850*4882a593Smuzhiyun 	uint32_t sdr2hdr_eotf_oetf_y0_offset;
851*4882a593Smuzhiyun 	uint32_t sdr2hdr_oetf_dx_pow1_offset;
852*4882a593Smuzhiyun 	uint32_t sdr2hdr_oetf_xn1_offset;
853*4882a593Smuzhiyun 	struct vop_reg hdr_src_color_ctrl;
854*4882a593Smuzhiyun 	struct vop_reg hdr_dst_color_ctrl;
855*4882a593Smuzhiyun 	struct vop_reg hdr_src_alpha_ctrl;
856*4882a593Smuzhiyun 	struct vop_reg hdr_dst_alpha_ctrl;
857*4882a593Smuzhiyun 	struct vop_reg bg_mix_ctrl;
858*4882a593Smuzhiyun 	struct vop_reg layer_sel;
859*4882a593Smuzhiyun 
860*4882a593Smuzhiyun 	/* BCSH */
861*4882a593Smuzhiyun 	struct vop_reg bcsh_brightness;
862*4882a593Smuzhiyun 	struct vop_reg bcsh_contrast;
863*4882a593Smuzhiyun 	struct vop_reg bcsh_sat_con;
864*4882a593Smuzhiyun 	struct vop_reg bcsh_sin_hue;
865*4882a593Smuzhiyun 	struct vop_reg bcsh_cos_hue;
866*4882a593Smuzhiyun 	struct vop_reg bcsh_r2y_csc_mode;
867*4882a593Smuzhiyun 	struct vop_reg bcsh_r2y_en;
868*4882a593Smuzhiyun 	struct vop_reg bcsh_y2r_csc_mode;
869*4882a593Smuzhiyun 	struct vop_reg bcsh_y2r_en;
870*4882a593Smuzhiyun 	struct vop_reg bcsh_out_mode;
871*4882a593Smuzhiyun 	struct vop_reg bcsh_en;
872*4882a593Smuzhiyun 
873*4882a593Smuzhiyun 	/* 3d lut */
874*4882a593Smuzhiyun 	struct vop_reg cubic_lut_en;
875*4882a593Smuzhiyun 	struct vop_reg cubic_lut_update_en;
876*4882a593Smuzhiyun 	struct vop_reg cubic_lut_mst;
877*4882a593Smuzhiyun 
878*4882a593Smuzhiyun 	/* cru */
879*4882a593Smuzhiyun 	struct vop_reg dclk_core_div;
880*4882a593Smuzhiyun 	struct vop_reg dclk_out_div;
881*4882a593Smuzhiyun 	struct vop_reg dclk_src_sel;
882*4882a593Smuzhiyun 
883*4882a593Smuzhiyun 	struct vop_reg splice_en;
884*4882a593Smuzhiyun 
885*4882a593Smuzhiyun 	struct vop_reg edpi_wms_hold_en;
886*4882a593Smuzhiyun 	struct vop_reg edpi_te_en;
887*4882a593Smuzhiyun 	struct vop_reg edpi_wms_fs;
888*4882a593Smuzhiyun 	struct vop_reg gamma_update_en;
889*4882a593Smuzhiyun 	struct vop_reg lut_dma_rid;
890*4882a593Smuzhiyun 
891*4882a593Smuzhiyun 	/* MCU output */
892*4882a593Smuzhiyun 	struct vop_reg mcu_pix_total;
893*4882a593Smuzhiyun 	struct vop_reg mcu_cs_pst;
894*4882a593Smuzhiyun 	struct vop_reg mcu_cs_pend;
895*4882a593Smuzhiyun 	struct vop_reg mcu_rw_pst;
896*4882a593Smuzhiyun 	struct vop_reg mcu_rw_pend;
897*4882a593Smuzhiyun 	struct vop_reg mcu_clk_sel;
898*4882a593Smuzhiyun 	struct vop_reg mcu_hold_mode;
899*4882a593Smuzhiyun 	struct vop_reg mcu_frame_st;
900*4882a593Smuzhiyun 	struct vop_reg mcu_rs;
901*4882a593Smuzhiyun 	struct vop_reg mcu_bypass;
902*4882a593Smuzhiyun 	struct vop_reg mcu_type;
903*4882a593Smuzhiyun 	struct vop_reg mcu_rw_bypass_port;
904*4882a593Smuzhiyun 
905*4882a593Smuzhiyun 	/* for DCF */
906*4882a593Smuzhiyun 	struct vop_reg line_flag_or_en;
907*4882a593Smuzhiyun 	struct vop_reg dsp_hold_or_en;
908*4882a593Smuzhiyun 	struct vop_reg almost_full_or_en;
909*4882a593Smuzhiyun 
910*4882a593Smuzhiyun 	/* CSC */
911*4882a593Smuzhiyun 	struct vop_reg acm_bypass_en;
912*4882a593Smuzhiyun 	struct vop_reg csc_en;
913*4882a593Smuzhiyun 	struct vop_reg acm_r2y_en;
914*4882a593Smuzhiyun 	struct vop_reg csc_mode;
915*4882a593Smuzhiyun 	struct vop_reg acm_r2y_mode;
916*4882a593Smuzhiyun 	struct vop_reg csc_coe00;
917*4882a593Smuzhiyun 	struct vop_reg csc_coe01;
918*4882a593Smuzhiyun 	struct vop_reg csc_coe02;
919*4882a593Smuzhiyun 	struct vop_reg csc_coe10;
920*4882a593Smuzhiyun 	struct vop_reg csc_coe11;
921*4882a593Smuzhiyun 	struct vop_reg csc_coe12;
922*4882a593Smuzhiyun 	struct vop_reg csc_coe20;
923*4882a593Smuzhiyun 	struct vop_reg csc_coe21;
924*4882a593Smuzhiyun 	struct vop_reg csc_coe22;
925*4882a593Smuzhiyun 	struct vop_reg csc_offset0;
926*4882a593Smuzhiyun 	struct vop_reg csc_offset1;
927*4882a593Smuzhiyun 	struct vop_reg csc_offset2;
928*4882a593Smuzhiyun 
929*4882a593Smuzhiyun 	/* color bar */
930*4882a593Smuzhiyun 	struct vop_reg color_bar_en;
931*4882a593Smuzhiyun 	struct vop_reg color_bar_mode;
932*4882a593Smuzhiyun };
933*4882a593Smuzhiyun 
934*4882a593Smuzhiyun struct vop2_power_domain_regs {
935*4882a593Smuzhiyun 	struct vop_reg pd;
936*4882a593Smuzhiyun 	struct vop_reg status;
937*4882a593Smuzhiyun 	struct vop_reg bisr_en_status;
938*4882a593Smuzhiyun 	struct vop_reg pmu_status;
939*4882a593Smuzhiyun };
940*4882a593Smuzhiyun 
941*4882a593Smuzhiyun struct vop2_dsc_regs {
942*4882a593Smuzhiyun 	/* DSC SYS CTRL */
943*4882a593Smuzhiyun 	struct vop_reg dsc_port_sel;
944*4882a593Smuzhiyun 	struct vop_reg dsc_man_mode;
945*4882a593Smuzhiyun 	struct vop_reg dsc_interface_mode;
946*4882a593Smuzhiyun 	struct vop_reg dsc_pixel_num;
947*4882a593Smuzhiyun 	struct vop_reg dsc_pxl_clk_div;
948*4882a593Smuzhiyun 	struct vop_reg dsc_cds_clk_div;
949*4882a593Smuzhiyun 	struct vop_reg dsc_txp_clk_div;
950*4882a593Smuzhiyun 	struct vop_reg dsc_init_dly_mode;
951*4882a593Smuzhiyun 	struct vop_reg dsc_scan_en;
952*4882a593Smuzhiyun 	struct vop_reg dsc_halt_en;
953*4882a593Smuzhiyun 	struct vop_reg rst_deassert;
954*4882a593Smuzhiyun 	struct vop_reg dsc_flush;
955*4882a593Smuzhiyun 	struct vop_reg dsc_cfg_done;
956*4882a593Smuzhiyun 	struct vop_reg dsc_init_dly_num;
957*4882a593Smuzhiyun 	struct vop_reg scan_timing_para_imd_en;
958*4882a593Smuzhiyun 	struct vop_reg dsc_htotal_pw;
959*4882a593Smuzhiyun 	struct vop_reg dsc_hact_st_end;
960*4882a593Smuzhiyun 	struct vop_reg dsc_vtotal;
961*4882a593Smuzhiyun 	struct vop_reg dsc_vs_end;
962*4882a593Smuzhiyun 	struct vop_reg dsc_vact_st_end;
963*4882a593Smuzhiyun 	struct vop_reg dsc_error_status;
964*4882a593Smuzhiyun 
965*4882a593Smuzhiyun 	/* DSC encoder */
966*4882a593Smuzhiyun 	struct vop_reg dsc_pps0_3;
967*4882a593Smuzhiyun 	struct vop_reg dsc_en;
968*4882a593Smuzhiyun 	struct vop_reg dsc_rbit;
969*4882a593Smuzhiyun 	struct vop_reg dsc_rbyt;
970*4882a593Smuzhiyun 	struct vop_reg dsc_flal;
971*4882a593Smuzhiyun 	struct vop_reg dsc_mer;
972*4882a593Smuzhiyun 	struct vop_reg dsc_epb;
973*4882a593Smuzhiyun 	struct vop_reg dsc_epl;
974*4882a593Smuzhiyun 	struct vop_reg dsc_nslc;
975*4882a593Smuzhiyun 	struct vop_reg dsc_sbo;
976*4882a593Smuzhiyun 	struct vop_reg dsc_ifep;
977*4882a593Smuzhiyun 	struct vop_reg dsc_pps_upd;
978*4882a593Smuzhiyun 	struct vop_reg dsc_status;
979*4882a593Smuzhiyun 	struct vop_reg dsc_ecw;
980*4882a593Smuzhiyun };
981*4882a593Smuzhiyun 
982*4882a593Smuzhiyun struct vop2_wb_regs {
983*4882a593Smuzhiyun 	struct vop_reg enable;
984*4882a593Smuzhiyun 	struct vop_reg format;
985*4882a593Smuzhiyun 	struct vop_reg dither_en;
986*4882a593Smuzhiyun 	struct vop_reg r2y_en;
987*4882a593Smuzhiyun 	struct vop_reg yrgb_mst;
988*4882a593Smuzhiyun 	struct vop_reg uv_mst;
989*4882a593Smuzhiyun 	struct vop_reg vp_id;
990*4882a593Smuzhiyun 	struct vop_reg fifo_throd;
991*4882a593Smuzhiyun 	struct vop_reg scale_x_factor;
992*4882a593Smuzhiyun 	struct vop_reg scale_x_en;
993*4882a593Smuzhiyun 	struct vop_reg scale_y_en;
994*4882a593Smuzhiyun 	struct vop_reg axi_yrgb_id;
995*4882a593Smuzhiyun 	struct vop_reg axi_uv_id;
996*4882a593Smuzhiyun };
997*4882a593Smuzhiyun 
998*4882a593Smuzhiyun struct vop2_power_domain_data {
999*4882a593Smuzhiyun 	uint8_t id;
1000*4882a593Smuzhiyun 	uint8_t parent_id;
1001*4882a593Smuzhiyun 	/*
1002*4882a593Smuzhiyun 	 * @module_id_mask: module id of which module this power domain is belongs to.
1003*4882a593Smuzhiyun 	 * PD_CLUSTER0,1,2,3 only belongs to CLUSTER0/1/2/3, PD_Esmart0 shared by Esmart1/2/3
1004*4882a593Smuzhiyun 	 */
1005*4882a593Smuzhiyun 	uint32_t module_id_mask;
1006*4882a593Smuzhiyun 
1007*4882a593Smuzhiyun 	const struct vop2_power_domain_regs *regs;
1008*4882a593Smuzhiyun };
1009*4882a593Smuzhiyun 
1010*4882a593Smuzhiyun /*
1011*4882a593Smuzhiyun  * connector interface(RGB/HDMI/eDP/DP/MIPI) data
1012*4882a593Smuzhiyun  */
1013*4882a593Smuzhiyun struct vop2_connector_if_data {
1014*4882a593Smuzhiyun 	u32 id;
1015*4882a593Smuzhiyun 	const char *clk_src_name;
1016*4882a593Smuzhiyun 	const char *clk_parent_name;
1017*4882a593Smuzhiyun 	const char *pixclk_name;
1018*4882a593Smuzhiyun 	const char *dclk_name;
1019*4882a593Smuzhiyun 	u32 post_proc_div_shift;
1020*4882a593Smuzhiyun 	u32 if_div_shift;
1021*4882a593Smuzhiyun 	u32 if_div_yuv420_shift;
1022*4882a593Smuzhiyun 	u32 bus_div_shift;
1023*4882a593Smuzhiyun 	u32 pixel_clk_div_shift;
1024*4882a593Smuzhiyun };
1025*4882a593Smuzhiyun 
1026*4882a593Smuzhiyun struct vop2_win_data {
1027*4882a593Smuzhiyun 	const char *name;
1028*4882a593Smuzhiyun 	uint8_t phys_id;
1029*4882a593Smuzhiyun 	uint8_t splice_win_id;
1030*4882a593Smuzhiyun 	uint8_t pd_id;
1031*4882a593Smuzhiyun 	uint8_t axi_id;
1032*4882a593Smuzhiyun 	uint8_t axi_yrgb_id;
1033*4882a593Smuzhiyun 	uint8_t axi_uv_id;
1034*4882a593Smuzhiyun 	uint8_t possible_crtcs;
1035*4882a593Smuzhiyun 
1036*4882a593Smuzhiyun 	uint32_t base;
1037*4882a593Smuzhiyun 	enum drm_plane_type type;
1038*4882a593Smuzhiyun 
1039*4882a593Smuzhiyun 	uint32_t nformats;
1040*4882a593Smuzhiyun 	const uint32_t *formats;
1041*4882a593Smuzhiyun 	const uint64_t *format_modifiers;
1042*4882a593Smuzhiyun 	const unsigned int supported_rotations;
1043*4882a593Smuzhiyun 
1044*4882a593Smuzhiyun 	const struct vop2_win_regs *regs;
1045*4882a593Smuzhiyun 	const struct vop2_win_regs **area;
1046*4882a593Smuzhiyun 	unsigned int area_size;
1047*4882a593Smuzhiyun 
1048*4882a593Smuzhiyun 	/*
1049*4882a593Smuzhiyun 	 * vertical/horizontal scale up/down filter mode
1050*4882a593Smuzhiyun 	 */
1051*4882a593Smuzhiyun 	const u8 hsu_filter_mode;
1052*4882a593Smuzhiyun 	const u8 hsd_filter_mode;
1053*4882a593Smuzhiyun 	const u8 vsu_filter_mode;
1054*4882a593Smuzhiyun 	const u8 vsd_filter_mode;
1055*4882a593Smuzhiyun 	const u8 hsd_pre_filter_mode;
1056*4882a593Smuzhiyun 	const u8 vsd_pre_filter_mode;
1057*4882a593Smuzhiyun 	/**
1058*4882a593Smuzhiyun 	 * @layer_sel_id: defined by register OVERLAY_LAYER_SEL of VOP2
1059*4882a593Smuzhiyun 	 */
1060*4882a593Smuzhiyun 	const uint8_t layer_sel_id[ROCKCHIP_MAX_CRTC];
1061*4882a593Smuzhiyun 	uint64_t feature;
1062*4882a593Smuzhiyun 
1063*4882a593Smuzhiyun 	unsigned int max_upscale_factor;
1064*4882a593Smuzhiyun 	unsigned int max_downscale_factor;
1065*4882a593Smuzhiyun 	const uint8_t dly[VOP2_DLY_MODE_MAX];
1066*4882a593Smuzhiyun };
1067*4882a593Smuzhiyun 
1068*4882a593Smuzhiyun struct dsc_error_info {
1069*4882a593Smuzhiyun 	u32 dsc_error_val;
1070*4882a593Smuzhiyun 	char dsc_error_info[50];
1071*4882a593Smuzhiyun };
1072*4882a593Smuzhiyun 
1073*4882a593Smuzhiyun struct vop2_dsc_data {
1074*4882a593Smuzhiyun 	uint8_t id;
1075*4882a593Smuzhiyun 	uint8_t pd_id;
1076*4882a593Smuzhiyun 	uint8_t max_slice_num;
1077*4882a593Smuzhiyun 	uint8_t max_linebuf_depth;	/* used to generate the bitstream */
1078*4882a593Smuzhiyun 	uint8_t min_bits_per_pixel;	/* bit num after encoder compress */
1079*4882a593Smuzhiyun 	const char *dsc_txp_clk_src_name;
1080*4882a593Smuzhiyun 	const char *dsc_txp_clk_name;
1081*4882a593Smuzhiyun 	const char *dsc_pxl_clk_name;
1082*4882a593Smuzhiyun 	const char *dsc_cds_clk_name;
1083*4882a593Smuzhiyun 	const struct vop2_dsc_regs *regs;
1084*4882a593Smuzhiyun };
1085*4882a593Smuzhiyun 
1086*4882a593Smuzhiyun struct vop2_wb_data {
1087*4882a593Smuzhiyun 	uint32_t nformats;
1088*4882a593Smuzhiyun 	const uint32_t *formats;
1089*4882a593Smuzhiyun 	struct vop_rect max_output;
1090*4882a593Smuzhiyun 	const struct vop2_wb_regs *regs;
1091*4882a593Smuzhiyun 	uint32_t fifo_depth;
1092*4882a593Smuzhiyun };
1093*4882a593Smuzhiyun 
1094*4882a593Smuzhiyun struct vop3_ovl_mix_regs {
1095*4882a593Smuzhiyun 	struct vop_reg src_color_ctrl;
1096*4882a593Smuzhiyun 	struct vop_reg dst_color_ctrl;
1097*4882a593Smuzhiyun 	struct vop_reg src_alpha_ctrl;
1098*4882a593Smuzhiyun 	struct vop_reg dst_alpha_ctrl;
1099*4882a593Smuzhiyun };
1100*4882a593Smuzhiyun 
1101*4882a593Smuzhiyun struct vop3_ovl_regs {
1102*4882a593Smuzhiyun 	const struct vop3_ovl_mix_regs *layer_mix_regs;
1103*4882a593Smuzhiyun 	const struct vop3_ovl_mix_regs *hdr_mix_regs;
1104*4882a593Smuzhiyun };
1105*4882a593Smuzhiyun 
1106*4882a593Smuzhiyun struct vop2_video_port_data {
1107*4882a593Smuzhiyun 	char id;
1108*4882a593Smuzhiyun 	uint8_t splice_vp_id;
1109*4882a593Smuzhiyun 	uint16_t lut_dma_rid;
1110*4882a593Smuzhiyun 	uint32_t feature;
1111*4882a593Smuzhiyun 	uint64_t soc_id[VOP2_SOC_VARIANT];
1112*4882a593Smuzhiyun 	uint16_t gamma_lut_len;
1113*4882a593Smuzhiyun 	uint16_t cubic_lut_len;
1114*4882a593Smuzhiyun 	unsigned long dclk_max;
1115*4882a593Smuzhiyun 	struct vop_rect max_output;
1116*4882a593Smuzhiyun 	const u8 pre_scan_max_dly[4];
1117*4882a593Smuzhiyun 	const u8 hdrvivid_dly[10];
1118*4882a593Smuzhiyun 	const u8 sdr2hdr_dly;
1119*4882a593Smuzhiyun 	const u8 layer_mix_dly;
1120*4882a593Smuzhiyun 	const u8 hdr_mix_dly;
1121*4882a593Smuzhiyun 	const u8 win_dly;
1122*4882a593Smuzhiyun 	const struct vop_intr *intr;
1123*4882a593Smuzhiyun 	const struct vop_hdr_table *hdr_table;
1124*4882a593Smuzhiyun 	const struct vop2_video_port_regs *regs;
1125*4882a593Smuzhiyun 	const struct vop3_ovl_regs *ovl_regs;
1126*4882a593Smuzhiyun };
1127*4882a593Smuzhiyun 
1128*4882a593Smuzhiyun struct vop2_layer_regs {
1129*4882a593Smuzhiyun 	struct vop_reg layer_sel;
1130*4882a593Smuzhiyun };
1131*4882a593Smuzhiyun 
1132*4882a593Smuzhiyun /**
1133*4882a593Smuzhiyun  * struct vop2_layer_data - The logic graphic layer in vop2
1134*4882a593Smuzhiyun  *
1135*4882a593Smuzhiyun  * The zorder:
1136*4882a593Smuzhiyun  *   LAYERn
1137*4882a593Smuzhiyun  *   LAYERn-1
1138*4882a593Smuzhiyun  *     .
1139*4882a593Smuzhiyun  *     .
1140*4882a593Smuzhiyun  *     .
1141*4882a593Smuzhiyun  *   LAYER5
1142*4882a593Smuzhiyun  *   LAYER4
1143*4882a593Smuzhiyun  *   LAYER3
1144*4882a593Smuzhiyun  *   LAYER2
1145*4882a593Smuzhiyun  *   LAYER1
1146*4882a593Smuzhiyun  *   LAYER0
1147*4882a593Smuzhiyun  *
1148*4882a593Smuzhiyun  * Each layer can select a unused window as input than feed to
1149*4882a593Smuzhiyun  * mixer for overlay.
1150*4882a593Smuzhiyun  *
1151*4882a593Smuzhiyun  * The pipeline in vop2:
1152*4882a593Smuzhiyun  *
1153*4882a593Smuzhiyun  * win-->layer-->mixer-->vp--->connector(RGB/LVDS/HDMI/MIPI)
1154*4882a593Smuzhiyun  *
1155*4882a593Smuzhiyun  */
1156*4882a593Smuzhiyun struct vop2_layer_data {
1157*4882a593Smuzhiyun 	char id;
1158*4882a593Smuzhiyun 	const struct vop2_layer_regs *regs;
1159*4882a593Smuzhiyun };
1160*4882a593Smuzhiyun 
1161*4882a593Smuzhiyun struct vop_grf_ctrl {
1162*4882a593Smuzhiyun 	struct vop_reg grf_dclk_inv;
1163*4882a593Smuzhiyun 	struct vop_reg grf_bt1120_clk_inv;
1164*4882a593Smuzhiyun 	struct vop_reg grf_bt656_clk_inv;
1165*4882a593Smuzhiyun 	struct vop_reg grf_edp0_en;
1166*4882a593Smuzhiyun 	struct vop_reg grf_edp1_en;
1167*4882a593Smuzhiyun 	struct vop_reg grf_hdmi0_en;
1168*4882a593Smuzhiyun 	struct vop_reg grf_hdmi1_en;
1169*4882a593Smuzhiyun 	struct vop_reg grf_hdmi0_dsc_en;
1170*4882a593Smuzhiyun 	struct vop_reg grf_hdmi1_dsc_en;
1171*4882a593Smuzhiyun 	struct vop_reg grf_hdmi0_pin_pol;
1172*4882a593Smuzhiyun 	struct vop_reg grf_hdmi1_pin_pol;
1173*4882a593Smuzhiyun };
1174*4882a593Smuzhiyun 
1175*4882a593Smuzhiyun struct vop_data {
1176*4882a593Smuzhiyun 	const struct vop_reg_data *init_table;
1177*4882a593Smuzhiyun 	unsigned int table_size;
1178*4882a593Smuzhiyun 	const struct vop_ctrl *ctrl;
1179*4882a593Smuzhiyun 	const struct vop_intr *intr;
1180*4882a593Smuzhiyun 	const struct vop_win_data *win;
1181*4882a593Smuzhiyun 	const struct vop_csc_table *csc_table;
1182*4882a593Smuzhiyun 	const struct vop_hdr_table *hdr_table;
1183*4882a593Smuzhiyun 	const struct vop_grf_ctrl *grf_ctrl;
1184*4882a593Smuzhiyun 	unsigned int win_size;
1185*4882a593Smuzhiyun 	uint32_t version;
1186*4882a593Smuzhiyun 	struct vop_rect max_input;
1187*4882a593Smuzhiyun 	struct vop_rect max_output;
1188*4882a593Smuzhiyun 	u64 feature;
1189*4882a593Smuzhiyun 	u64 soc_id;
1190*4882a593Smuzhiyun 	u8 vop_id;
1191*4882a593Smuzhiyun };
1192*4882a593Smuzhiyun 
1193*4882a593Smuzhiyun struct vop2_ctrl {
1194*4882a593Smuzhiyun 	struct vop_reg cfg_done_en;
1195*4882a593Smuzhiyun 	struct vop_reg wb_cfg_done;
1196*4882a593Smuzhiyun 	struct vop_reg auto_gating_en;
1197*4882a593Smuzhiyun 	struct vop_reg aclk_pre_auto_gating_en;
1198*4882a593Smuzhiyun 	struct vop_reg dma_finish_mode;
1199*4882a593Smuzhiyun 	struct vop_reg axi_dma_finish_and_en;
1200*4882a593Smuzhiyun 	struct vop_reg wb_dma_finish_and_en;
1201*4882a593Smuzhiyun 	struct vop_reg ovl_cfg_done_port;
1202*4882a593Smuzhiyun 	struct vop_reg ovl_port_mux_cfg_done_imd;
1203*4882a593Smuzhiyun 	struct vop_reg ovl_port_mux_cfg;
1204*4882a593Smuzhiyun 	struct vop_reg if_ctrl_cfg_done_imd;
1205*4882a593Smuzhiyun 	struct vop_reg version;
1206*4882a593Smuzhiyun 	struct vop_reg standby;
1207*4882a593Smuzhiyun 	struct vop_reg dma_stop;
1208*4882a593Smuzhiyun 	struct vop_reg dsp_vs_t_sel;
1209*4882a593Smuzhiyun 	struct vop_reg lut_dma_en;
1210*4882a593Smuzhiyun 	struct vop_reg axi_outstanding_max_num;
1211*4882a593Smuzhiyun 	struct vop_reg axi_max_outstanding_en;
1212*4882a593Smuzhiyun 	struct vop_reg hdmi_dclk_out_en;
1213*4882a593Smuzhiyun 	struct vop_reg rgb_en;
1214*4882a593Smuzhiyun 	struct vop_reg hdmi0_en;
1215*4882a593Smuzhiyun 	struct vop_reg hdmi1_en;
1216*4882a593Smuzhiyun 	struct vop_reg dp0_en;
1217*4882a593Smuzhiyun 	struct vop_reg dp1_en;
1218*4882a593Smuzhiyun 	struct vop_reg edp0_en;
1219*4882a593Smuzhiyun 	struct vop_reg edp1_en;
1220*4882a593Smuzhiyun 	struct vop_reg mipi0_en;
1221*4882a593Smuzhiyun 	struct vop_reg mipi1_en;
1222*4882a593Smuzhiyun 	struct vop_reg lvds0_en;
1223*4882a593Smuzhiyun 	struct vop_reg lvds1_en;
1224*4882a593Smuzhiyun 	struct vop_reg bt656_en;
1225*4882a593Smuzhiyun 	struct vop_reg bt1120_en;
1226*4882a593Smuzhiyun 	struct vop_reg bt656_dclk_pol;
1227*4882a593Smuzhiyun 	struct vop_reg bt1120_dclk_pol;
1228*4882a593Smuzhiyun 	struct vop_reg dclk_pol;
1229*4882a593Smuzhiyun 	struct vop_reg pin_pol;
1230*4882a593Smuzhiyun 	struct vop_reg rgb_dclk_pol;
1231*4882a593Smuzhiyun 	struct vop_reg rgb_pin_pol;
1232*4882a593Smuzhiyun 	struct vop_reg lvds_dclk_pol;
1233*4882a593Smuzhiyun 	struct vop_reg lvds_pin_pol;
1234*4882a593Smuzhiyun 	struct vop_reg hdmi_dclk_pol;
1235*4882a593Smuzhiyun 	struct vop_reg hdmi_pin_pol;
1236*4882a593Smuzhiyun 	struct vop_reg edp_dclk_pol;
1237*4882a593Smuzhiyun 	struct vop_reg edp_pin_pol;
1238*4882a593Smuzhiyun 	struct vop_reg mipi_dclk_pol;
1239*4882a593Smuzhiyun 	struct vop_reg mipi_pin_pol;
1240*4882a593Smuzhiyun 	struct vop_reg dp0_dclk_pol;
1241*4882a593Smuzhiyun 	struct vop_reg dp0_pin_pol;
1242*4882a593Smuzhiyun 	struct vop_reg dp1_dclk_pol;
1243*4882a593Smuzhiyun 	struct vop_reg dp1_pin_pol;
1244*4882a593Smuzhiyun 
1245*4882a593Smuzhiyun 	/* This will be reference by win_phy_id */
1246*4882a593Smuzhiyun 	struct vop_reg win_vp_id[16];
1247*4882a593Smuzhiyun 	struct vop_reg win_dly[16];
1248*4882a593Smuzhiyun 
1249*4882a593Smuzhiyun 	/* connector mux */
1250*4882a593Smuzhiyun 	struct vop_reg rgb_mux;
1251*4882a593Smuzhiyun 	struct vop_reg hdmi0_mux;
1252*4882a593Smuzhiyun 	struct vop_reg hdmi1_mux;
1253*4882a593Smuzhiyun 	struct vop_reg dp0_mux;
1254*4882a593Smuzhiyun 	struct vop_reg dp1_mux;
1255*4882a593Smuzhiyun 	struct vop_reg edp0_mux;
1256*4882a593Smuzhiyun 	struct vop_reg edp1_mux;
1257*4882a593Smuzhiyun 	struct vop_reg mipi0_mux;
1258*4882a593Smuzhiyun 	struct vop_reg mipi1_mux;
1259*4882a593Smuzhiyun 	struct vop_reg lvds0_mux;
1260*4882a593Smuzhiyun 	struct vop_reg lvds1_mux;
1261*4882a593Smuzhiyun 
1262*4882a593Smuzhiyun 	struct vop_reg lvds_dual_en;
1263*4882a593Smuzhiyun 	struct vop_reg lvds_dual_mode;
1264*4882a593Smuzhiyun 	struct vop_reg lvds_dual_channel_swap;
1265*4882a593Smuzhiyun 
1266*4882a593Smuzhiyun 	struct vop_reg dp_dual_en;
1267*4882a593Smuzhiyun 	struct vop_reg edp_dual_en;
1268*4882a593Smuzhiyun 	struct vop_reg hdmi_dual_en;
1269*4882a593Smuzhiyun 	struct vop_reg mipi_dual_en;
1270*4882a593Smuzhiyun 
1271*4882a593Smuzhiyun 	struct vop_reg hdmi0_dclk_div;
1272*4882a593Smuzhiyun 	struct vop_reg hdmi0_pixclk_div;
1273*4882a593Smuzhiyun 	struct vop_reg edp0_dclk_div;
1274*4882a593Smuzhiyun 	struct vop_reg edp0_pixclk_div;
1275*4882a593Smuzhiyun 
1276*4882a593Smuzhiyun 	struct vop_reg hdmi1_dclk_div;
1277*4882a593Smuzhiyun 	struct vop_reg hdmi1_pixclk_div;
1278*4882a593Smuzhiyun 	struct vop_reg edp1_dclk_div;
1279*4882a593Smuzhiyun 	struct vop_reg edp1_pixclk_div;
1280*4882a593Smuzhiyun 
1281*4882a593Smuzhiyun 	struct vop_reg mipi0_pixclk_div;
1282*4882a593Smuzhiyun 	struct vop_reg mipi1_pixclk_div;
1283*4882a593Smuzhiyun 	struct vop_reg mipi0_ds_mode;
1284*4882a593Smuzhiyun 	struct vop_reg mipi1_ds_mode;
1285*4882a593Smuzhiyun 
1286*4882a593Smuzhiyun 	struct vop_reg src_color_ctrl;
1287*4882a593Smuzhiyun 	struct vop_reg dst_color_ctrl;
1288*4882a593Smuzhiyun 	struct vop_reg src_alpha_ctrl;
1289*4882a593Smuzhiyun 	struct vop_reg dst_alpha_ctrl;
1290*4882a593Smuzhiyun 
1291*4882a593Smuzhiyun 	struct vop_reg bt1120_yc_swap;
1292*4882a593Smuzhiyun 	struct vop_reg bt656_yc_swap;
1293*4882a593Smuzhiyun 	struct vop_reg gamma_port_sel;
1294*4882a593Smuzhiyun 	struct vop_reg pd_off_imd;
1295*4882a593Smuzhiyun 
1296*4882a593Smuzhiyun 	struct vop_reg otp_en;
1297*4882a593Smuzhiyun 	struct vop_reg esmart_lb_mode;
1298*4882a593Smuzhiyun 	struct vop_reg reg_done_frm;
1299*4882a593Smuzhiyun 	struct vop_reg cfg_done;
1300*4882a593Smuzhiyun };
1301*4882a593Smuzhiyun 
1302*4882a593Smuzhiyun struct vop_dump_regs {
1303*4882a593Smuzhiyun 	uint32_t offset;
1304*4882a593Smuzhiyun 	const char *name;
1305*4882a593Smuzhiyun 	struct vop_reg state;
1306*4882a593Smuzhiyun 	bool enable_state;
1307*4882a593Smuzhiyun };
1308*4882a593Smuzhiyun 
1309*4882a593Smuzhiyun struct vop2_vp_plane_mask {
1310*4882a593Smuzhiyun 	u8 primary_plane_id;
1311*4882a593Smuzhiyun 	u8 attached_layers_nr;
1312*4882a593Smuzhiyun 	u8 attached_layers[ROCKCHIP_MAX_LAYER];
1313*4882a593Smuzhiyun };
1314*4882a593Smuzhiyun 
1315*4882a593Smuzhiyun /**
1316*4882a593Smuzhiyun  * VOP2 data structe
1317*4882a593Smuzhiyun  *
1318*4882a593Smuzhiyun  * @version: VOP IP version
1319*4882a593Smuzhiyun  * @win_size: hardware win number
1320*4882a593Smuzhiyun  */
1321*4882a593Smuzhiyun struct vop2_data {
1322*4882a593Smuzhiyun 	uint32_t version;
1323*4882a593Smuzhiyun 	uint32_t feature;
1324*4882a593Smuzhiyun 	uint8_t nr_dscs;
1325*4882a593Smuzhiyun 	uint8_t nr_dsc_ecw;
1326*4882a593Smuzhiyun 	uint8_t nr_dsc_buffer_flow;
1327*4882a593Smuzhiyun 	uint8_t nr_vps;
1328*4882a593Smuzhiyun 	uint8_t nr_mixers;
1329*4882a593Smuzhiyun 	uint8_t nr_layers;
1330*4882a593Smuzhiyun 	uint8_t nr_axi_intr;
1331*4882a593Smuzhiyun 	uint8_t nr_gammas;
1332*4882a593Smuzhiyun 	uint8_t nr_conns;
1333*4882a593Smuzhiyun 	uint8_t nr_pds;
1334*4882a593Smuzhiyun 	uint8_t nr_mem_pgs;
1335*4882a593Smuzhiyun 	uint8_t esmart_lb_mode;
1336*4882a593Smuzhiyun 	bool delayed_pd;
1337*4882a593Smuzhiyun 	const struct vop_intr *axi_intr;
1338*4882a593Smuzhiyun 	const struct vop2_ctrl *ctrl;
1339*4882a593Smuzhiyun 	const struct vop2_dsc_data *dsc;
1340*4882a593Smuzhiyun 	const struct dsc_error_info *dsc_error_ecw;
1341*4882a593Smuzhiyun 	const struct dsc_error_info *dsc_error_buffer_flow;
1342*4882a593Smuzhiyun 	const struct vop2_win_data *win;
1343*4882a593Smuzhiyun 	const struct vop2_video_port_data *vp;
1344*4882a593Smuzhiyun 	const struct vop2_connector_if_data *conn;
1345*4882a593Smuzhiyun 	const struct vop2_wb_data *wb;
1346*4882a593Smuzhiyun 	const struct vop2_layer_data *layer;
1347*4882a593Smuzhiyun 	const struct vop2_power_domain_data *pd;
1348*4882a593Smuzhiyun 	const struct vop2_power_domain_data *mem_pg;
1349*4882a593Smuzhiyun 	const struct vop_csc_table *csc_table;
1350*4882a593Smuzhiyun 	const struct vop_hdr_table *hdr_table;
1351*4882a593Smuzhiyun 	const struct vop_grf_ctrl *sys_grf;
1352*4882a593Smuzhiyun 	const struct vop_grf_ctrl *grf;
1353*4882a593Smuzhiyun 	const struct vop_grf_ctrl *vo0_grf;
1354*4882a593Smuzhiyun 	const struct vop_grf_ctrl *vo1_grf;
1355*4882a593Smuzhiyun 	const struct vop_dump_regs *dump_regs;
1356*4882a593Smuzhiyun 	uint32_t dump_regs_size;
1357*4882a593Smuzhiyun 	struct vop_rect max_input;
1358*4882a593Smuzhiyun 	struct vop_rect max_output;
1359*4882a593Smuzhiyun 	const struct vop2_vp_plane_mask *plane_mask;
1360*4882a593Smuzhiyun 	uint32_t plane_mask_base;
1361*4882a593Smuzhiyun 
1362*4882a593Smuzhiyun 	unsigned int win_size;
1363*4882a593Smuzhiyun };
1364*4882a593Smuzhiyun 
1365*4882a593Smuzhiyun #define CVBS_PAL_VDISPLAY		288
1366*4882a593Smuzhiyun 
1367*4882a593Smuzhiyun /* interrupt define */
1368*4882a593Smuzhiyun #define DSP_HOLD_VALID_INTR		BIT(0)
1369*4882a593Smuzhiyun #define FS_INTR				BIT(1)
1370*4882a593Smuzhiyun #define LINE_FLAG_INTR			BIT(2)
1371*4882a593Smuzhiyun #define BUS_ERROR_INTR			BIT(3)
1372*4882a593Smuzhiyun #define FS_NEW_INTR			BIT(4)
1373*4882a593Smuzhiyun #define ADDR_SAME_INTR			BIT(5)
1374*4882a593Smuzhiyun #define LINE_FLAG1_INTR			BIT(6)
1375*4882a593Smuzhiyun #define WIN0_EMPTY_INTR			BIT(7)
1376*4882a593Smuzhiyun #define WIN1_EMPTY_INTR			BIT(8)
1377*4882a593Smuzhiyun #define WIN2_EMPTY_INTR			BIT(9)
1378*4882a593Smuzhiyun #define WIN3_EMPTY_INTR			BIT(10)
1379*4882a593Smuzhiyun #define HWC_EMPTY_INTR			BIT(11)
1380*4882a593Smuzhiyun #define POST_BUF_EMPTY_INTR		BIT(12)
1381*4882a593Smuzhiyun #define PWM_GEN_INTR			BIT(13)
1382*4882a593Smuzhiyun #define DMA_FINISH_INTR			BIT(14)
1383*4882a593Smuzhiyun #define FS_FIELD_INTR			BIT(15)
1384*4882a593Smuzhiyun #define FE_INTR				BIT(16)
1385*4882a593Smuzhiyun #define WB_UV_FIFO_FULL_INTR		BIT(17)
1386*4882a593Smuzhiyun #define WB_YRGB_FIFO_FULL_INTR		BIT(18)
1387*4882a593Smuzhiyun #define WB_COMPLETE_INTR		BIT(19)
1388*4882a593Smuzhiyun 
1389*4882a593Smuzhiyun #define INTR_MASK			(DSP_HOLD_VALID_INTR | FS_INTR | \
1390*4882a593Smuzhiyun 					 LINE_FLAG_INTR | BUS_ERROR_INTR | \
1391*4882a593Smuzhiyun 					 FS_NEW_INTR | LINE_FLAG1_INTR | \
1392*4882a593Smuzhiyun 					 WIN0_EMPTY_INTR | WIN1_EMPTY_INTR | \
1393*4882a593Smuzhiyun 					 WIN2_EMPTY_INTR | WIN3_EMPTY_INTR | \
1394*4882a593Smuzhiyun 					 HWC_EMPTY_INTR | \
1395*4882a593Smuzhiyun 					 POST_BUF_EMPTY_INTR | \
1396*4882a593Smuzhiyun 					 DMA_FINISH_INTR | FS_FIELD_INTR | \
1397*4882a593Smuzhiyun 					 FE_INTR)
1398*4882a593Smuzhiyun #define DSP_HOLD_VALID_INTR_EN(x)	((x) << 4)
1399*4882a593Smuzhiyun #define FS_INTR_EN(x)			((x) << 5)
1400*4882a593Smuzhiyun #define LINE_FLAG_INTR_EN(x)		((x) << 6)
1401*4882a593Smuzhiyun #define BUS_ERROR_INTR_EN(x)		((x) << 7)
1402*4882a593Smuzhiyun #define DSP_HOLD_VALID_INTR_MASK	(1 << 4)
1403*4882a593Smuzhiyun #define FS_INTR_MASK			(1 << 5)
1404*4882a593Smuzhiyun #define LINE_FLAG_INTR_MASK		(1 << 6)
1405*4882a593Smuzhiyun #define BUS_ERROR_INTR_MASK		(1 << 7)
1406*4882a593Smuzhiyun 
1407*4882a593Smuzhiyun #define INTR_CLR_SHIFT			8
1408*4882a593Smuzhiyun #define DSP_HOLD_VALID_INTR_CLR		(1 << (INTR_CLR_SHIFT + 0))
1409*4882a593Smuzhiyun #define FS_INTR_CLR			(1 << (INTR_CLR_SHIFT + 1))
1410*4882a593Smuzhiyun #define LINE_FLAG_INTR_CLR		(1 << (INTR_CLR_SHIFT + 2))
1411*4882a593Smuzhiyun #define BUS_ERROR_INTR_CLR		(1 << (INTR_CLR_SHIFT + 3))
1412*4882a593Smuzhiyun 
1413*4882a593Smuzhiyun #define DSP_LINE_NUM(x)			(((x) & 0x1fff) << 12)
1414*4882a593Smuzhiyun #define DSP_LINE_NUM_MASK		(0x1fff << 12)
1415*4882a593Smuzhiyun 
1416*4882a593Smuzhiyun /* src alpha ctrl define */
1417*4882a593Smuzhiyun #define SRC_FADING_VALUE(x)		(((x) & 0xff) << 24)
1418*4882a593Smuzhiyun #define SRC_GLOBAL_ALPHA(x)		(((x) & 0xff) << 16)
1419*4882a593Smuzhiyun #define SRC_FACTOR_M0(x)		(((x) & 0x7) << 6)
1420*4882a593Smuzhiyun #define SRC_ALPHA_CAL_M0(x)		(((x) & 0x1) << 5)
1421*4882a593Smuzhiyun #define SRC_BLEND_M0(x)			(((x) & 0x3) << 3)
1422*4882a593Smuzhiyun #define SRC_ALPHA_M0(x)			(((x) & 0x1) << 2)
1423*4882a593Smuzhiyun #define SRC_COLOR_M0(x)			(((x) & 0x1) << 1)
1424*4882a593Smuzhiyun #define SRC_ALPHA_EN(x)			(((x) & 0x1) << 0)
1425*4882a593Smuzhiyun /* dst alpha ctrl define */
1426*4882a593Smuzhiyun #define DST_FACTOR_M0(x)		(((x) & 0x7) << 6)
1427*4882a593Smuzhiyun 
1428*4882a593Smuzhiyun /*
1429*4882a593Smuzhiyun  * display output interface supported by rockchip lcdc
1430*4882a593Smuzhiyun  */
1431*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_P888		0
1432*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_BT1120	0
1433*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_P666		1
1434*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_P565		2
1435*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_BT656		5
1436*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_S888		8
1437*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_S666		9
1438*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_YUV422	9
1439*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_S565		10
1440*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_S888_DUMMY	12
1441*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_YUV420	14
1442*4882a593Smuzhiyun /* for use special outface */
1443*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_AAAA		15
1444*4882a593Smuzhiyun 
1445*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_TYPE(x)	((x) >> 16)
1446*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE(x)		((x) & 0xffff)
1447*4882a593Smuzhiyun 
1448*4882a593Smuzhiyun enum alpha_mode {
1449*4882a593Smuzhiyun 	ALPHA_STRAIGHT,
1450*4882a593Smuzhiyun 	ALPHA_INVERSE,
1451*4882a593Smuzhiyun };
1452*4882a593Smuzhiyun 
1453*4882a593Smuzhiyun enum global_blend_mode {
1454*4882a593Smuzhiyun 	ALPHA_GLOBAL,
1455*4882a593Smuzhiyun 	ALPHA_PER_PIX,
1456*4882a593Smuzhiyun 	ALPHA_PER_PIX_GLOBAL,
1457*4882a593Smuzhiyun };
1458*4882a593Smuzhiyun 
1459*4882a593Smuzhiyun enum alpha_cal_mode {
1460*4882a593Smuzhiyun 	ALPHA_SATURATION,
1461*4882a593Smuzhiyun 	ALPHA_NO_SATURATION,
1462*4882a593Smuzhiyun };
1463*4882a593Smuzhiyun 
1464*4882a593Smuzhiyun enum color_mode {
1465*4882a593Smuzhiyun 	ALPHA_SRC_PRE_MUL,
1466*4882a593Smuzhiyun 	ALPHA_SRC_NO_PRE_MUL,
1467*4882a593Smuzhiyun };
1468*4882a593Smuzhiyun 
1469*4882a593Smuzhiyun enum factor_mode {
1470*4882a593Smuzhiyun 	ALPHA_ZERO,
1471*4882a593Smuzhiyun 	ALPHA_ONE,
1472*4882a593Smuzhiyun 	ALPHA_SRC,
1473*4882a593Smuzhiyun 	ALPHA_SRC_INVERSE,
1474*4882a593Smuzhiyun 	ALPHA_SRC_GLOBAL,
1475*4882a593Smuzhiyun 	ALPHA_DST_GLOBAL,
1476*4882a593Smuzhiyun };
1477*4882a593Smuzhiyun 
1478*4882a593Smuzhiyun enum src_factor_mode {
1479*4882a593Smuzhiyun 	SRC_FAC_ALPHA_ZERO,
1480*4882a593Smuzhiyun 	SRC_FAC_ALPHA_ONE,
1481*4882a593Smuzhiyun 	SRC_FAC_ALPHA_DST,
1482*4882a593Smuzhiyun 	SRC_FAC_ALPHA_DST_INVERSE,
1483*4882a593Smuzhiyun 	SRC_FAC_ALPHA_SRC,
1484*4882a593Smuzhiyun 	SRC_FAC_ALPHA_SRC_GLOBAL,
1485*4882a593Smuzhiyun };
1486*4882a593Smuzhiyun 
1487*4882a593Smuzhiyun enum dst_factor_mode {
1488*4882a593Smuzhiyun 	DST_FAC_ALPHA_ZERO,
1489*4882a593Smuzhiyun 	DST_FAC_ALPHA_ONE,
1490*4882a593Smuzhiyun 	DST_FAC_ALPHA_SRC,
1491*4882a593Smuzhiyun 	DST_FAC_ALPHA_SRC_INVERSE,
1492*4882a593Smuzhiyun 	DST_FAC_ALPHA_DST,
1493*4882a593Smuzhiyun 	DST_FAC_ALPHA_DST_GLOBAL,
1494*4882a593Smuzhiyun };
1495*4882a593Smuzhiyun 
1496*4882a593Smuzhiyun enum scale_mode {
1497*4882a593Smuzhiyun 	SCALE_NONE = 0x0,
1498*4882a593Smuzhiyun 	SCALE_UP   = 0x1,
1499*4882a593Smuzhiyun 	SCALE_DOWN = 0x2
1500*4882a593Smuzhiyun };
1501*4882a593Smuzhiyun 
1502*4882a593Smuzhiyun enum lb_mode {
1503*4882a593Smuzhiyun 	LB_YUV_3840X5 = 0x0,
1504*4882a593Smuzhiyun 	LB_YUV_2560X8 = 0x1,
1505*4882a593Smuzhiyun 	LB_RGB_3840X2 = 0x2,
1506*4882a593Smuzhiyun 	LB_RGB_2560X4 = 0x3,
1507*4882a593Smuzhiyun 	LB_RGB_1920X5 = 0x4,
1508*4882a593Smuzhiyun 	LB_RGB_1280X8 = 0x5
1509*4882a593Smuzhiyun };
1510*4882a593Smuzhiyun 
1511*4882a593Smuzhiyun enum sacle_up_mode {
1512*4882a593Smuzhiyun 	SCALE_UP_BIL = 0x0,
1513*4882a593Smuzhiyun 	SCALE_UP_BIC = 0x1
1514*4882a593Smuzhiyun };
1515*4882a593Smuzhiyun 
1516*4882a593Smuzhiyun enum scale_down_mode {
1517*4882a593Smuzhiyun 	SCALE_DOWN_BIL = 0x0,
1518*4882a593Smuzhiyun 	SCALE_DOWN_AVG = 0x1
1519*4882a593Smuzhiyun };
1520*4882a593Smuzhiyun 
1521*4882a593Smuzhiyun enum vop2_scale_up_mode {
1522*4882a593Smuzhiyun 	VOP2_SCALE_UP_NRST_NBOR,
1523*4882a593Smuzhiyun 	VOP2_SCALE_UP_BIL,
1524*4882a593Smuzhiyun 	VOP2_SCALE_UP_BIC,
1525*4882a593Smuzhiyun };
1526*4882a593Smuzhiyun 
1527*4882a593Smuzhiyun enum vop2_scale_down_mode {
1528*4882a593Smuzhiyun 	VOP2_SCALE_DOWN_NRST_NBOR,
1529*4882a593Smuzhiyun 	VOP2_SCALE_DOWN_BIL,
1530*4882a593Smuzhiyun 	VOP2_SCALE_DOWN_AVG,
1531*4882a593Smuzhiyun };
1532*4882a593Smuzhiyun 
1533*4882a593Smuzhiyun enum vop3_pre_scale_down_mode {
1534*4882a593Smuzhiyun 	VOP3_PRE_SCALE_UNSPPORT,
1535*4882a593Smuzhiyun 	VOP3_PRE_SCALE_DOWN_GT,
1536*4882a593Smuzhiyun 	VOP3_PRE_SCALE_DOWN_AVG,
1537*4882a593Smuzhiyun };
1538*4882a593Smuzhiyun 
1539*4882a593Smuzhiyun enum dither_down_mode {
1540*4882a593Smuzhiyun 	RGB888_TO_RGB565 = 0x0,
1541*4882a593Smuzhiyun 	RGB888_TO_RGB666 = 0x1
1542*4882a593Smuzhiyun };
1543*4882a593Smuzhiyun 
1544*4882a593Smuzhiyun enum dither_down_mode_sel {
1545*4882a593Smuzhiyun 	DITHER_DOWN_ALLEGRO = 0x0,
1546*4882a593Smuzhiyun 	DITHER_DOWN_FRC = 0x1
1547*4882a593Smuzhiyun };
1548*4882a593Smuzhiyun 
1549*4882a593Smuzhiyun enum vop_pol {
1550*4882a593Smuzhiyun 	HSYNC_POSITIVE = 0,
1551*4882a593Smuzhiyun 	VSYNC_POSITIVE = 1,
1552*4882a593Smuzhiyun 	DEN_NEGATIVE   = 2,
1553*4882a593Smuzhiyun 	DCLK_INVERT    = 3
1554*4882a593Smuzhiyun };
1555*4882a593Smuzhiyun 
1556*4882a593Smuzhiyun 
1557*4882a593Smuzhiyun #define FRAC_16_16(mult, div)    (((mult) << 16) / (div))
1558*4882a593Smuzhiyun #define SCL_FT_DEFAULT_FIXPOINT_SHIFT	12
1559*4882a593Smuzhiyun #define SCL_MAX_VSKIPLINES		4
1560*4882a593Smuzhiyun #define MIN_SCL_FT_AFTER_VSKIP		1
1561*4882a593Smuzhiyun 
scl_cal_scale(int src,int dst,int shift)1562*4882a593Smuzhiyun static inline uint16_t scl_cal_scale(int src, int dst, int shift)
1563*4882a593Smuzhiyun {
1564*4882a593Smuzhiyun 	return ((src * 2 - 3) << (shift - 1)) / (dst - 1);
1565*4882a593Smuzhiyun }
1566*4882a593Smuzhiyun 
scl_cal_scale2(int src,int dst)1567*4882a593Smuzhiyun static inline uint16_t scl_cal_scale2(int src, int dst)
1568*4882a593Smuzhiyun {
1569*4882a593Smuzhiyun 	return ((src - 1) << 12) / (dst - 1);
1570*4882a593Smuzhiyun }
1571*4882a593Smuzhiyun 
1572*4882a593Smuzhiyun #define GET_SCL_FT_BILI_DN(src, dst)	scl_cal_scale(src, dst, 12)
1573*4882a593Smuzhiyun #define GET_SCL_FT_BILI_UP(src, dst)	scl_cal_scale(src, dst, 16)
1574*4882a593Smuzhiyun #define GET_SCL_FT_BIC(src, dst)	scl_cal_scale(src, dst, 16)
1575*4882a593Smuzhiyun 
scl_get_bili_dn_vskip(int src_h,int dst_h,int vskiplines)1576*4882a593Smuzhiyun static inline uint16_t scl_get_bili_dn_vskip(int src_h, int dst_h,
1577*4882a593Smuzhiyun 					     int vskiplines)
1578*4882a593Smuzhiyun {
1579*4882a593Smuzhiyun 	int act_height;
1580*4882a593Smuzhiyun 
1581*4882a593Smuzhiyun 	act_height = (src_h + vskiplines - 1) / vskiplines;
1582*4882a593Smuzhiyun 
1583*4882a593Smuzhiyun 	if (act_height == dst_h)
1584*4882a593Smuzhiyun 		return GET_SCL_FT_BILI_DN(src_h, dst_h) / vskiplines;
1585*4882a593Smuzhiyun 
1586*4882a593Smuzhiyun 	return GET_SCL_FT_BILI_DN(act_height, dst_h);
1587*4882a593Smuzhiyun }
1588*4882a593Smuzhiyun 
scl_get_scl_mode(int src,int dst)1589*4882a593Smuzhiyun static inline enum scale_mode scl_get_scl_mode(int src, int dst)
1590*4882a593Smuzhiyun {
1591*4882a593Smuzhiyun 	if (src < dst)
1592*4882a593Smuzhiyun 		return SCALE_UP;
1593*4882a593Smuzhiyun 	else if (src > dst)
1594*4882a593Smuzhiyun 		return SCALE_DOWN;
1595*4882a593Smuzhiyun 
1596*4882a593Smuzhiyun 	return SCALE_NONE;
1597*4882a593Smuzhiyun }
1598*4882a593Smuzhiyun 
scl_get_vskiplines(uint32_t srch,uint32_t dsth)1599*4882a593Smuzhiyun static inline int scl_get_vskiplines(uint32_t srch, uint32_t dsth)
1600*4882a593Smuzhiyun {
1601*4882a593Smuzhiyun 	uint32_t vskiplines;
1602*4882a593Smuzhiyun 
1603*4882a593Smuzhiyun 	for (vskiplines = SCL_MAX_VSKIPLINES; vskiplines > 1; vskiplines /= 2)
1604*4882a593Smuzhiyun 		if (srch >= vskiplines * dsth * MIN_SCL_FT_AFTER_VSKIP)
1605*4882a593Smuzhiyun 			break;
1606*4882a593Smuzhiyun 
1607*4882a593Smuzhiyun 	return vskiplines;
1608*4882a593Smuzhiyun }
1609*4882a593Smuzhiyun 
scl_vop_cal_lb_mode(int width,bool is_yuv)1610*4882a593Smuzhiyun static inline int scl_vop_cal_lb_mode(int width, bool is_yuv)
1611*4882a593Smuzhiyun {
1612*4882a593Smuzhiyun 	int lb_mode;
1613*4882a593Smuzhiyun 
1614*4882a593Smuzhiyun 	if (is_yuv) {
1615*4882a593Smuzhiyun 		if (width > 1280)
1616*4882a593Smuzhiyun 			lb_mode = LB_YUV_3840X5;
1617*4882a593Smuzhiyun 		else
1618*4882a593Smuzhiyun 			lb_mode = LB_YUV_2560X8;
1619*4882a593Smuzhiyun 	} else {
1620*4882a593Smuzhiyun 		if (width > 2560)
1621*4882a593Smuzhiyun 			lb_mode = LB_RGB_3840X2;
1622*4882a593Smuzhiyun 		else if (width > 1920)
1623*4882a593Smuzhiyun 			lb_mode = LB_RGB_2560X4;
1624*4882a593Smuzhiyun 		else
1625*4882a593Smuzhiyun 			lb_mode = LB_RGB_1920X5;
1626*4882a593Smuzhiyun 	}
1627*4882a593Smuzhiyun 
1628*4882a593Smuzhiyun 	return lb_mode;
1629*4882a593Smuzhiyun }
1630*4882a593Smuzhiyun 
us_to_vertical_line(struct drm_display_mode * mode,int us)1631*4882a593Smuzhiyun static inline int us_to_vertical_line(struct drm_display_mode *mode, int us)
1632*4882a593Smuzhiyun {
1633*4882a593Smuzhiyun 	return us * mode->clock / mode->htotal / 1000;
1634*4882a593Smuzhiyun }
1635*4882a593Smuzhiyun 
interpolate(int x1,int y1,int x2,int y2,int x)1636*4882a593Smuzhiyun static inline int interpolate(int x1, int y1, int x2, int y2, int x)
1637*4882a593Smuzhiyun {
1638*4882a593Smuzhiyun 	return y1 + (y2 - y1) * (x - x1) / (x2 - x1);
1639*4882a593Smuzhiyun }
1640*4882a593Smuzhiyun 
1641*4882a593Smuzhiyun extern const struct component_ops vop_component_ops;
1642*4882a593Smuzhiyun extern const struct component_ops vop2_component_ops;
1643*4882a593Smuzhiyun #endif /* _ROCKCHIP_DRM_VOP_H */
1644