xref: /rk3399_rockchip-uboot/drivers/video/drm/rockchip_vop.h (revision fc8b0d66767c032e08f1d74da5d0fcc366d9ae00)
1186f8572SMark Yao /*
2186f8572SMark Yao  * (C) Copyright 2008-2017 Fuzhou Rockchip Electronics Co., Ltd
3186f8572SMark Yao  *
4186f8572SMark Yao  * SPDX-License-Identifier:	GPL-2.0+
5186f8572SMark Yao  */
6186f8572SMark Yao 
7186f8572SMark Yao #ifndef _ROCKCHIP_VOP_H_
8186f8572SMark Yao #define _ROCKCHIP_VOP_H_
9cf53642aSSandy Huang #include "rockchip_display.h"
106b898587SDamon Ding #include <asm/gpio.h>
11186f8572SMark Yao 
12186f8572SMark Yao 
13186f8572SMark Yao #define VOP_REG_SUPPORT(vop, reg) \
14543c0e78SSandy Huang 		(reg.mask && \
15543c0e78SSandy Huang 		 (!reg.major || \
16543c0e78SSandy Huang 		  (reg.major == VOP_MAJOR(vop->version) && \
17186f8572SMark Yao 		   reg.begin_minor <= VOP_MINOR(vop->version) && \
18543c0e78SSandy Huang 		   reg.end_minor >= VOP_MINOR(vop->version))))
19186f8572SMark Yao 
20186f8572SMark Yao #define VOP_WIN_SUPPORT(vop, win, name) \
21620af6a3SSandy Huang 		VOP_REG_SUPPORT(vop, win->name)
22186f8572SMark Yao 
23186f8572SMark Yao #define VOP_CTRL_SUPPORT(vop, name) \
24186f8572SMark Yao 		VOP_REG_SUPPORT(vop, vop->ctrl->name)
25186f8572SMark Yao 
26186f8572SMark Yao #define __REG_SET(x, off, mask, shift, v, write_mask) \
27186f8572SMark Yao 		vop_mask_write(x, off, mask, shift, v, write_mask)
28186f8572SMark Yao 
29186f8572SMark Yao #define _REG_SET(vop, name, off, reg, mask, v) \
30186f8572SMark Yao 	do { \
31186f8572SMark Yao 		if (VOP_REG_SUPPORT(vop, reg)) \
32186f8572SMark Yao 			__REG_SET(vop, off + reg.offset, mask, reg.shift, \
33186f8572SMark Yao 				  v, reg.write_mask); \
34186f8572SMark Yao 		else \
35186f8572SMark Yao 			debug("Warning: not support "#name"\n"); \
36186f8572SMark Yao 	} while(0)
37186f8572SMark Yao 
38186f8572SMark Yao #define REG_SET(x, name, off, reg, v) \
39186f8572SMark Yao 		_REG_SET(x, name, off, reg, reg.mask, v)
40186f8572SMark Yao #define REG_SET_MASK(x, name, off, reg, mask, v, relaxed) \
41186f8572SMark Yao 		_REG_SET(x, name, off, reg, reg.mask & mask, v)
42186f8572SMark Yao 
43186f8572SMark Yao #define VOP_WIN_SET(x, name, v) \
44186f8572SMark Yao 		REG_SET(x, name, x->win_offset, x->win->name, v)
45186f8572SMark Yao #define VOP_WIN_SET_EXT(x, ext, name, v) \
46186f8572SMark Yao 		REG_SET(x, name, x->win_offset, x->win->ext->name, v)
47186f8572SMark Yao #define VOP_SCL_SET(x, name, v) \
48186f8572SMark Yao 		REG_SET(x, name, x->win_offset, x->win->scl->name, v)
49186f8572SMark Yao #define VOP_SCL_SET_EXT(x, name, v) \
50186f8572SMark Yao 		REG_SET(x, name, x->win_offset, x->win->scl->ext->name, v)
51186f8572SMark Yao 
52186f8572SMark Yao #define VOP_CTRL_SET(x, name, v) \
53186f8572SMark Yao 		REG_SET(x, name, 0, (x)->ctrl->name, v)
54186f8572SMark Yao #define VOP_LINE_FLAG_SET(x, name, v) \
55186f8572SMark Yao 		REG_SET(x, name, 0, (x)->line_flag->name, v)
56b7618fd3SSandy Huang #define VOP_WIN_CSC_SET(x, name, v) \
57b7618fd3SSandy Huang 		REG_SET(x, name, 0, (x)->win_csc->name, v)
58186f8572SMark Yao 
59186f8572SMark Yao #define VOP_CTRL_GET(x, name) \
60186f8572SMark Yao 		vop_read_reg(x, 0, &vop->ctrl->name)
61186f8572SMark Yao 
62186f8572SMark Yao #define VOP_WIN_GET(x, name) \
63186f8572SMark Yao 		vop_read_reg(x, vop->win->offset, &vop->win->name)
64186f8572SMark Yao 
65*fc8b0d66SDamon Ding #define VOP_GRF_SET(vop, grf, reg, v) \
663a06149eSSandy Huang 	do { \
67*fc8b0d66SDamon Ding 		if (vop->data->grf) { \
68*fc8b0d66SDamon Ding 			vop_grf_writel(vop->grf, vop->data->grf->reg, v); \
693a06149eSSandy Huang 		} \
703a06149eSSandy Huang 	} while (0)
713a06149eSSandy Huang 
7209b01f9eSAlgea Cao #define CVBS_PAL_VDISPLAY              288
7309b01f9eSAlgea Cao 
74186f8572SMark Yao enum alpha_mode {
75186f8572SMark Yao 	ALPHA_STRAIGHT,
76186f8572SMark Yao 	ALPHA_INVERSE,
77186f8572SMark Yao };
78186f8572SMark Yao 
79186f8572SMark Yao enum global_blend_mode {
80186f8572SMark Yao 	ALPHA_GLOBAL,
81186f8572SMark Yao 	ALPHA_PER_PIX,
82186f8572SMark Yao 	ALPHA_PER_PIX_GLOBAL,
83186f8572SMark Yao };
84186f8572SMark Yao 
85186f8572SMark Yao enum alpha_cal_mode {
86186f8572SMark Yao 	ALPHA_SATURATION,
87186f8572SMark Yao 	ALPHA_NO_SATURATION,
88186f8572SMark Yao };
89186f8572SMark Yao 
90186f8572SMark Yao enum color_mode {
91186f8572SMark Yao 	ALPHA_SRC_PRE_MUL,
92186f8572SMark Yao 	ALPHA_SRC_NO_PRE_MUL,
93186f8572SMark Yao };
94186f8572SMark Yao 
95186f8572SMark Yao enum factor_mode {
96186f8572SMark Yao 	ALPHA_ZERO,
97186f8572SMark Yao 	ALPHA_ONE,
98186f8572SMark Yao 	ALPHA_SRC,
99186f8572SMark Yao 	ALPHA_SRC_INVERSE,
100186f8572SMark Yao 	ALPHA_SRC_GLOBAL,
101186f8572SMark Yao };
102186f8572SMark Yao 
103186f8572SMark Yao enum scale_mode {
104186f8572SMark Yao 	SCALE_NONE = 0x0,
105186f8572SMark Yao 	SCALE_UP   = 0x1,
106186f8572SMark Yao 	SCALE_DOWN = 0x2
107186f8572SMark Yao };
108186f8572SMark Yao 
109186f8572SMark Yao enum lb_mode {
110186f8572SMark Yao 	LB_YUV_3840X5 = 0x0,
111186f8572SMark Yao 	LB_YUV_2560X8 = 0x1,
112186f8572SMark Yao 	LB_RGB_3840X2 = 0x2,
113186f8572SMark Yao 	LB_RGB_2560X4 = 0x3,
114186f8572SMark Yao 	LB_RGB_1920X5 = 0x4,
115186f8572SMark Yao 	LB_RGB_1280X8 = 0x5
116186f8572SMark Yao };
117186f8572SMark Yao 
118186f8572SMark Yao enum sacle_up_mode {
119186f8572SMark Yao 	SCALE_UP_BIL = 0x0,
120186f8572SMark Yao 	SCALE_UP_BIC = 0x1
121186f8572SMark Yao };
122186f8572SMark Yao 
123186f8572SMark Yao enum scale_down_mode {
124186f8572SMark Yao 	SCALE_DOWN_BIL = 0x0,
125186f8572SMark Yao 	SCALE_DOWN_AVG = 0x1
126186f8572SMark Yao };
127186f8572SMark Yao 
128186f8572SMark Yao enum dither_down_mode {
129186f8572SMark Yao 	RGB888_TO_RGB565 = 0x0,
130186f8572SMark Yao 	RGB888_TO_RGB666 = 0x1
131186f8572SMark Yao };
132186f8572SMark Yao 
133186f8572SMark Yao enum dither_down_mode_sel {
134186f8572SMark Yao 	DITHER_DOWN_ALLEGRO = 0x0,
135186f8572SMark Yao 	DITHER_DOWN_FRC = 0x1
136186f8572SMark Yao };
137186f8572SMark Yao 
13879feefb1SSandy Huang enum vop_csc_format {
13979feefb1SSandy Huang 	CSC_BT601L,
14079feefb1SSandy Huang 	CSC_BT709L,
14179feefb1SSandy Huang 	CSC_BT601F,
14279feefb1SSandy Huang 	CSC_BT2020,
14379feefb1SSandy Huang };
14479feefb1SSandy Huang 
14579feefb1SSandy Huang #define DSP_BG_SWAP		0x1
14679feefb1SSandy Huang #define DSP_RB_SWAP		0x2
14779feefb1SSandy Huang #define DSP_RG_SWAP		0x4
14879feefb1SSandy Huang #define DSP_DELTA_SWAP		0x8
14979feefb1SSandy Huang 
150186f8572SMark Yao #define PRE_DITHER_DOWN_EN(x)	((x) << 0)
151186f8572SMark Yao #define DITHER_DOWN_EN(x)	((x) << 1)
152186f8572SMark Yao #define DITHER_DOWN_MODE(x)	((x) << 2)
153186f8572SMark Yao #define DITHER_DOWN_MODE_SEL(x)	((x) << 3)
154186f8572SMark Yao 
155186f8572SMark Yao #define FRAC_16_16(mult, div)    (((mult) << 16) / (div))
156186f8572SMark Yao #define SCL_FT_DEFAULT_FIXPOINT_SHIFT	12
157186f8572SMark Yao #define SCL_MAX_VSKIPLINES		4
158186f8572SMark Yao #define MIN_SCL_FT_AFTER_VSKIP		1
159186f8572SMark Yao 
1604c765862SDamon Ding #define VOP_PLANE_NO_SCALING	BIT(16)
1614c765862SDamon Ding 
162186f8572SMark Yao static inline uint16_t scl_cal_scale(int src, int dst, int shift)
163186f8572SMark Yao {
164186f8572SMark Yao 	return ((src * 2 - 3) << (shift - 1)) / (dst - 1);
165186f8572SMark Yao }
166186f8572SMark Yao 
167186f8572SMark Yao static inline uint16_t scl_cal_scale2(int src, int dst)
168186f8572SMark Yao {
169186f8572SMark Yao 	return ((src - 1) << 12) / (dst - 1);
170186f8572SMark Yao }
171186f8572SMark Yao 
172186f8572SMark Yao #define GET_SCL_FT_BILI_DN(src, dst)	scl_cal_scale(src, dst, 12)
173186f8572SMark Yao #define GET_SCL_FT_BILI_UP(src, dst)	scl_cal_scale(src, dst, 16)
174186f8572SMark Yao #define GET_SCL_FT_BIC(src, dst)	scl_cal_scale(src, dst, 16)
175186f8572SMark Yao 
176186f8572SMark Yao static inline uint16_t scl_get_bili_dn_vskip(int src_h, int dst_h,
177186f8572SMark Yao 					     int vskiplines)
178186f8572SMark Yao {
179186f8572SMark Yao 	int act_height;
180186f8572SMark Yao 
181186f8572SMark Yao 	act_height = (src_h + vskiplines - 1) / vskiplines;
182186f8572SMark Yao 
183186f8572SMark Yao 	return GET_SCL_FT_BILI_DN(act_height, dst_h);
184186f8572SMark Yao }
185186f8572SMark Yao 
186186f8572SMark Yao static inline enum scale_mode scl_get_scl_mode(int src, int dst)
187186f8572SMark Yao {
188186f8572SMark Yao 	if (src < dst)
189186f8572SMark Yao 		return SCALE_UP;
190186f8572SMark Yao 	else if (src > dst)
191186f8572SMark Yao 		return SCALE_DOWN;
192186f8572SMark Yao 
193186f8572SMark Yao 	return SCALE_NONE;
194186f8572SMark Yao }
195186f8572SMark Yao 
196186f8572SMark Yao static inline int scl_get_vskiplines(uint32_t srch, uint32_t dsth)
197186f8572SMark Yao {
198186f8572SMark Yao 	uint32_t vskiplines;
199186f8572SMark Yao 
200186f8572SMark Yao 	for (vskiplines = SCL_MAX_VSKIPLINES; vskiplines > 1; vskiplines /= 2)
201186f8572SMark Yao 		if (srch >= vskiplines * dsth * MIN_SCL_FT_AFTER_VSKIP)
202186f8572SMark Yao 			break;
203186f8572SMark Yao 
204186f8572SMark Yao 	return vskiplines;
205186f8572SMark Yao }
206186f8572SMark Yao 
207186f8572SMark Yao static inline int scl_vop_cal_lb_mode(int width, bool is_yuv)
208186f8572SMark Yao {
209186f8572SMark Yao 	int lb_mode;
210186f8572SMark Yao 
211186f8572SMark Yao 	if (width > 2560)
212186f8572SMark Yao 		lb_mode = LB_RGB_3840X2;
213186f8572SMark Yao 	else if (width > 1920)
214186f8572SMark Yao 		lb_mode = LB_RGB_2560X4;
215186f8572SMark Yao 	else if (!is_yuv)
216186f8572SMark Yao 		lb_mode = LB_RGB_1920X5;
217186f8572SMark Yao 	else if (width > 1280)
218186f8572SMark Yao 		lb_mode = LB_YUV_3840X5;
219186f8572SMark Yao 	else
220186f8572SMark Yao 		lb_mode = LB_YUV_2560X8;
221186f8572SMark Yao 
222186f8572SMark Yao 	return lb_mode;
223186f8572SMark Yao }
224186f8572SMark Yao 
225186f8572SMark Yao struct vop_reg_data {
226186f8572SMark Yao 	uint32_t offset;
227186f8572SMark Yao 	uint32_t value;
228186f8572SMark Yao };
229186f8572SMark Yao 
230186f8572SMark Yao struct vop_reg {
231186f8572SMark Yao 	uint32_t mask;
232dac93f83SChris Zhong 	uint32_t offset:17;
233186f8572SMark Yao 	uint32_t shift:5;
234186f8572SMark Yao 	uint32_t begin_minor:4;
235186f8572SMark Yao 	uint32_t end_minor:4;
236dac93f83SChris Zhong 	uint32_t reserved:2;
237186f8572SMark Yao 	uint32_t major:3;
238186f8572SMark Yao 	uint32_t write_mask:1;
239186f8572SMark Yao };
240186f8572SMark Yao 
241186f8572SMark Yao struct vop_ctrl {
242186f8572SMark Yao 	struct vop_reg standby;
2432b34f307SMark Yao 	struct vop_reg axi_outstanding_max_num;
2442b34f307SMark Yao 	struct vop_reg axi_max_outstanding_en;
245186f8572SMark Yao 	struct vop_reg htotal_pw;
246186f8572SMark Yao 	struct vop_reg hact_st_end;
247186f8572SMark Yao 	struct vop_reg vtotal_pw;
248186f8572SMark Yao 	struct vop_reg vact_st_end;
249186f8572SMark Yao 	struct vop_reg vact_st_end_f1;
250186f8572SMark Yao 	struct vop_reg vs_st_end_f1;
251186f8572SMark Yao 	struct vop_reg hpost_st_end;
252186f8572SMark Yao 	struct vop_reg vpost_st_end;
253186f8572SMark Yao 	struct vop_reg vpost_st_end_f1;
254186f8572SMark Yao 	struct vop_reg post_scl_factor;
255186f8572SMark Yao 	struct vop_reg post_scl_ctrl;
256186f8572SMark Yao 	struct vop_reg dsp_interlace;
257186f8572SMark Yao 	struct vop_reg global_regdone_en;
258186f8572SMark Yao 	struct vop_reg auto_gate_en;
259186f8572SMark Yao 	struct vop_reg post_lb_mode;
260186f8572SMark Yao 	struct vop_reg dsp_layer_sel;
261186f8572SMark Yao 	struct vop_reg overlay_mode;
262186f8572SMark Yao 	struct vop_reg core_dclk_div;
263186f8572SMark Yao 	struct vop_reg dclk_ddr;
264186f8572SMark Yao 	struct vop_reg p2i_en;
26579feefb1SSandy Huang 	struct vop_reg hdmi_dclk_out_en;
266186f8572SMark Yao 	struct vop_reg rgb_en;
2677130fbf6SSandy Huang 	struct vop_reg lvds_en;
268186f8572SMark Yao 	struct vop_reg edp_en;
269186f8572SMark Yao 	struct vop_reg hdmi_en;
270186f8572SMark Yao 	struct vop_reg mipi_en;
271186f8572SMark Yao 	struct vop_reg data01_swap;
272186f8572SMark Yao 	struct vop_reg mipi_dual_channel_en;
273186f8572SMark Yao 	struct vop_reg dp_en;
2747130fbf6SSandy Huang 	struct vop_reg dclk_pol;
275186f8572SMark Yao 	struct vop_reg pin_pol;
2767130fbf6SSandy Huang 	struct vop_reg rgb_dclk_pol;
277186f8572SMark Yao 	struct vop_reg rgb_pin_pol;
2787130fbf6SSandy Huang 	struct vop_reg lvds_dclk_pol;
2797130fbf6SSandy Huang 	struct vop_reg lvds_pin_pol;
2807130fbf6SSandy Huang 	struct vop_reg hdmi_dclk_pol;
281186f8572SMark Yao 	struct vop_reg hdmi_pin_pol;
2827130fbf6SSandy Huang 	struct vop_reg edp_dclk_pol;
283186f8572SMark Yao 	struct vop_reg edp_pin_pol;
2847130fbf6SSandy Huang 	struct vop_reg mipi_dclk_pol;
285186f8572SMark Yao 	struct vop_reg mipi_pin_pol;
2867130fbf6SSandy Huang 	struct vop_reg dp_dclk_pol;
287186f8572SMark Yao 	struct vop_reg dp_pin_pol;
288186f8572SMark Yao 
289186f8572SMark Yao 	struct vop_reg dither_up;
290186f8572SMark Yao 	struct vop_reg dither_down;
291186f8572SMark Yao 
29209b01f9eSAlgea Cao 	struct vop_reg sw_dac_sel;
29309b01f9eSAlgea Cao 	struct vop_reg tve_sw_mode;
29409b01f9eSAlgea Cao 	struct vop_reg tve_dclk_pol;
29509b01f9eSAlgea Cao 	struct vop_reg tve_dclk_en;
29609b01f9eSAlgea Cao 	struct vop_reg sw_genlock;
29709b01f9eSAlgea Cao 	struct vop_reg sw_uv_offset_en;
29809b01f9eSAlgea Cao 
299186f8572SMark Yao 	struct vop_reg dsp_out_yuv;
300186f8572SMark Yao 	struct vop_reg dsp_data_swap;
30132328971SDamon Ding 	struct vop_reg dsp_bg_swap;
30232328971SDamon Ding 	struct vop_reg dsp_rb_swap;
30332328971SDamon Ding 	struct vop_reg dsp_rg_swap;
30432328971SDamon Ding 	struct vop_reg dsp_delta_swap;
30532328971SDamon Ding 	struct vop_reg dsp_dummy_swap;
306186f8572SMark Yao 	struct vop_reg dsp_ccir656_avg;
307186f8572SMark Yao 	struct vop_reg dsp_black;
308186f8572SMark Yao 	struct vop_reg dsp_blank;
309186f8572SMark Yao 	struct vop_reg dsp_outzero;
310186f8572SMark Yao 	struct vop_reg dsp_lut_en;
311186f8572SMark Yao 	struct vop_reg update_gamma_lut;
312186f8572SMark Yao 
313186f8572SMark Yao 	struct vop_reg out_mode;
314186f8572SMark Yao 
315186f8572SMark Yao 	struct vop_reg xmirror;
316186f8572SMark Yao 	struct vop_reg ymirror;
317186f8572SMark Yao 	struct vop_reg dsp_background;
318186f8572SMark Yao 
3197130fbf6SSandy Huang 	/* CABC */
3207130fbf6SSandy Huang 	struct vop_reg cabc_total_num;
3217130fbf6SSandy Huang 	struct vop_reg cabc_config_mode;
3227130fbf6SSandy Huang 	struct vop_reg cabc_stage_up_mode;
3237130fbf6SSandy Huang 	struct vop_reg cabc_scale_cfg_value;
3247130fbf6SSandy Huang 	struct vop_reg cabc_scale_cfg_enable;
3257130fbf6SSandy Huang 	struct vop_reg cabc_global_dn_limit_en;
3267130fbf6SSandy Huang 	struct vop_reg cabc_lut_en;
3277130fbf6SSandy Huang 	struct vop_reg cabc_en;
3287130fbf6SSandy Huang 	struct vop_reg cabc_handle_en;
3297130fbf6SSandy Huang 	struct vop_reg cabc_stage_up;
3307130fbf6SSandy Huang 	struct vop_reg cabc_stage_down;
3317130fbf6SSandy Huang 	struct vop_reg cabc_global_dn;
3327130fbf6SSandy Huang 	struct vop_reg cabc_calc_pixel_num;
3337130fbf6SSandy Huang 
3342b34f307SMark Yao 	struct vop_reg win_gate[4];
3352b34f307SMark Yao 	struct vop_reg win_channel[4];
3362b34f307SMark Yao 
3377130fbf6SSandy Huang 	/* BCSH */
3387130fbf6SSandy Huang 	struct vop_reg bcsh_brightness;
3397130fbf6SSandy Huang 	struct vop_reg bcsh_contrast;
3407130fbf6SSandy Huang 	struct vop_reg bcsh_sat_con;
3417130fbf6SSandy Huang 	struct vop_reg bcsh_sin_hue;
3427130fbf6SSandy Huang 	struct vop_reg bcsh_cos_hue;
3437130fbf6SSandy Huang 	struct vop_reg bcsh_r2y_csc_mode;
3447130fbf6SSandy Huang 	struct vop_reg bcsh_r2y_en;
3457130fbf6SSandy Huang 	struct vop_reg bcsh_y2r_csc_mode;
3467130fbf6SSandy Huang 	struct vop_reg bcsh_y2r_en;
3477130fbf6SSandy Huang 	struct vop_reg bcsh_color_bar;
3487130fbf6SSandy Huang 	struct vop_reg bcsh_out_mode;
3497130fbf6SSandy Huang 	struct vop_reg bcsh_en;
350b0dbe9a0SSandy Huang 	struct vop_reg reg_done_frm;
3517130fbf6SSandy Huang 
3527130fbf6SSandy Huang 	/* MCU OUTPUT */
3537130fbf6SSandy Huang 	struct vop_reg mcu_pix_total;
3547130fbf6SSandy Huang 	struct vop_reg mcu_cs_pst;
3557130fbf6SSandy Huang 	struct vop_reg mcu_cs_pend;
3567130fbf6SSandy Huang 	struct vop_reg mcu_rw_pst;
3577130fbf6SSandy Huang 	struct vop_reg mcu_rw_pend;
3587130fbf6SSandy Huang 	struct vop_reg mcu_clk_sel;
3597130fbf6SSandy Huang 	struct vop_reg mcu_hold_mode;
3607130fbf6SSandy Huang 	struct vop_reg mcu_frame_st;
3617130fbf6SSandy Huang 	struct vop_reg mcu_rs;
3627130fbf6SSandy Huang 	struct vop_reg mcu_bypass;
3637130fbf6SSandy Huang 	struct vop_reg mcu_type;
3647130fbf6SSandy Huang 	struct vop_reg mcu_rw_bypass_port;
3657130fbf6SSandy Huang 
36654f7137bSDamon Ding 	/* bt1120 */
36754f7137bSDamon Ding 	struct vop_reg bt1120_yc_swap;
36854f7137bSDamon Ding 	struct vop_reg bt1120_en;
36954f7137bSDamon Ding 
37054f7137bSDamon Ding 	/* bt656 */
37154f7137bSDamon Ding 	struct vop_reg bt656_en;
3722b34f307SMark Yao 
373186f8572SMark Yao 	struct vop_reg cfg_done;
374186f8572SMark Yao };
375186f8572SMark Yao 
376186f8572SMark Yao struct vop_scl_extension {
377186f8572SMark Yao 	struct vop_reg cbcr_vsd_mode;
378186f8572SMark Yao 	struct vop_reg cbcr_vsu_mode;
379186f8572SMark Yao 	struct vop_reg cbcr_hsd_mode;
380186f8572SMark Yao 	struct vop_reg cbcr_ver_scl_mode;
381186f8572SMark Yao 	struct vop_reg cbcr_hor_scl_mode;
382186f8572SMark Yao 	struct vop_reg yrgb_vsd_mode;
383186f8572SMark Yao 	struct vop_reg yrgb_vsu_mode;
384186f8572SMark Yao 	struct vop_reg yrgb_hsd_mode;
385186f8572SMark Yao 	struct vop_reg yrgb_ver_scl_mode;
386186f8572SMark Yao 	struct vop_reg yrgb_hor_scl_mode;
387186f8572SMark Yao 	struct vop_reg line_load_mode;
388186f8572SMark Yao 	struct vop_reg cbcr_axi_gather_num;
389186f8572SMark Yao 	struct vop_reg yrgb_axi_gather_num;
390186f8572SMark Yao 	struct vop_reg vsd_cbcr_gt2;
391186f8572SMark Yao 	struct vop_reg vsd_cbcr_gt4;
392186f8572SMark Yao 	struct vop_reg vsd_yrgb_gt2;
393186f8572SMark Yao 	struct vop_reg vsd_yrgb_gt4;
394186f8572SMark Yao 	struct vop_reg bic_coe_sel;
395186f8572SMark Yao 	struct vop_reg cbcr_axi_gather_en;
396186f8572SMark Yao 	struct vop_reg yrgb_axi_gather_en;
397186f8572SMark Yao 	struct vop_reg lb_mode;
398186f8572SMark Yao };
399186f8572SMark Yao 
400186f8572SMark Yao struct vop_scl_regs {
401186f8572SMark Yao 	const struct vop_scl_extension *ext;
402186f8572SMark Yao 
403186f8572SMark Yao 	struct vop_reg scale_yrgb_x;
404186f8572SMark Yao 	struct vop_reg scale_yrgb_y;
405186f8572SMark Yao 	struct vop_reg scale_cbcr_x;
406186f8572SMark Yao 	struct vop_reg scale_cbcr_y;
407186f8572SMark Yao };
408186f8572SMark Yao 
409186f8572SMark Yao struct vop_win {
410186f8572SMark Yao 	const struct vop_scl_regs *scl;
411186f8572SMark Yao 
412a144d23dSAndy Yan 	struct vop_reg gate;
413186f8572SMark Yao 	struct vop_reg enable;
414186f8572SMark Yao 	struct vop_reg format;
41554f7137bSDamon Ding 	struct vop_reg interlace_read;
416186f8572SMark Yao 	struct vop_reg ymirror;
417186f8572SMark Yao 	struct vop_reg rb_swap;
418186f8572SMark Yao 	struct vop_reg act_info;
419186f8572SMark Yao 	struct vop_reg dsp_info;
420186f8572SMark Yao 	struct vop_reg dsp_st;
421186f8572SMark Yao 	struct vop_reg yrgb_mst;
422186f8572SMark Yao 	struct vop_reg uv_mst;
423186f8572SMark Yao 	struct vop_reg yrgb_vir;
424186f8572SMark Yao 	struct vop_reg uv_vir;
425186f8572SMark Yao 	struct vop_reg alpha_mode;
426186f8572SMark Yao 	struct vop_reg alpha_en;
427186f8572SMark Yao 
428186f8572SMark Yao 	struct vop_reg dst_alpha_ctl;
429186f8572SMark Yao 	struct vop_reg src_alpha_ctl;
430186f8572SMark Yao };
431186f8572SMark Yao 
432186f8572SMark Yao struct vop_line_flag {
433186f8572SMark Yao 	struct vop_reg line_flag_num[2];
434186f8572SMark Yao };
435186f8572SMark Yao 
4363a06149eSSandy Huang struct vop_grf_ctrl {
4373a06149eSSandy Huang 	struct vop_reg grf_dclk_inv;
4383a06149eSSandy Huang };
4393a06149eSSandy Huang 
440b7618fd3SSandy Huang struct vop_csc_table {
441b7618fd3SSandy Huang 	const uint32_t *r2y_bt601;
442b7618fd3SSandy Huang 	const uint32_t *r2y_bt601_12_235;
443b7618fd3SSandy Huang 	const uint32_t *r2y_bt709;
444b7618fd3SSandy Huang 	const uint32_t *r2y_bt2020;
445b7618fd3SSandy Huang };
446b7618fd3SSandy Huang 
447b7618fd3SSandy Huang struct vop_csc {
448b7618fd3SSandy Huang 	struct vop_reg y2r_en;
449b7618fd3SSandy Huang 	struct vop_reg r2r_en;
450b7618fd3SSandy Huang 	struct vop_reg r2y_en;
451b7618fd3SSandy Huang 
452b7618fd3SSandy Huang 	uint32_t y2r_offset;
453b7618fd3SSandy Huang 	uint32_t r2r_offset;
454b7618fd3SSandy Huang 	uint32_t r2y_offset;
455b7618fd3SSandy Huang };
456b7618fd3SSandy Huang 
457186f8572SMark Yao #define VOP_FEATURE_OUTPUT_10BIT	BIT(0)
458186f8572SMark Yao 
459186f8572SMark Yao struct vop_data {
460186f8572SMark Yao 	uint32_t version;
461186f8572SMark Yao 	const struct vop_ctrl *ctrl;
462186f8572SMark Yao 	const struct vop_win *win;
463186f8572SMark Yao 	const struct vop_line_flag *line_flag;
4643a06149eSSandy Huang 	const struct vop_grf_ctrl *grf_ctrl;
465b7618fd3SSandy Huang 	const struct vop_csc_table *csc_table;
466b7618fd3SSandy Huang 	const struct vop_csc *win_csc;
467186f8572SMark Yao 	int win_offset;
468186f8572SMark Yao 	int reg_len;
469186f8572SMark Yao 	u64 feature;
4702735489aSSandy Huang 	struct vop_rect max_output;
471186f8572SMark Yao };
472186f8572SMark Yao 
473186f8572SMark Yao struct vop {
474186f8572SMark Yao 	u32 *regsbak;
475186f8572SMark Yao 	void *regs;
476*fc8b0d66SDamon Ding 	void *grf_ctrl;
477186f8572SMark Yao 
478186f8572SMark Yao 	uint32_t version;
479186f8572SMark Yao 	const struct vop_ctrl *ctrl;
480186f8572SMark Yao 	const struct vop_win *win;
481186f8572SMark Yao 	const struct vop_line_flag *line_flag;
482b7618fd3SSandy Huang 	const struct vop_csc_table *csc_table;
483b7618fd3SSandy Huang 	const struct vop_csc *win_csc;
484*fc8b0d66SDamon Ding 	const struct vop_data *data;
485186f8572SMark Yao 	int win_offset;
4866b898587SDamon Ding 
4876b898587SDamon Ding 	struct gpio_desc mcu_rs_gpio;
488186f8572SMark Yao };
489186f8572SMark Yao 
490186f8572SMark Yao static inline void vop_writel(struct vop *vop, uint32_t offset, uint32_t v)
491186f8572SMark Yao {
492186f8572SMark Yao 	writel(v, vop->regs + offset);
493186f8572SMark Yao 	vop->regsbak[offset >> 2] = v;
494186f8572SMark Yao }
495186f8572SMark Yao 
496186f8572SMark Yao static inline uint32_t vop_readl(struct vop *vop, uint32_t offset)
497186f8572SMark Yao {
498186f8572SMark Yao 	return readl(vop->regs + offset);
499186f8572SMark Yao }
500186f8572SMark Yao 
501186f8572SMark Yao static inline uint32_t vop_read_reg(struct vop *vop, uint32_t base,
502186f8572SMark Yao 				    const struct vop_reg *reg)
503186f8572SMark Yao {
504186f8572SMark Yao 	return (vop_readl(vop, base + reg->offset) >> reg->shift) & reg->mask;
505186f8572SMark Yao }
506186f8572SMark Yao 
507186f8572SMark Yao static inline void vop_mask_write(struct vop *vop, uint32_t offset,
508186f8572SMark Yao 				  uint32_t mask, uint32_t shift, uint32_t v,
509186f8572SMark Yao 				  bool write_mask)
510186f8572SMark Yao {
511186f8572SMark Yao 	if (!mask)
512186f8572SMark Yao 		return;
513186f8572SMark Yao 
514186f8572SMark Yao 	if (write_mask) {
515186f8572SMark Yao 		v = ((v & mask) << shift) | (mask << (shift + 16));
516186f8572SMark Yao 	} else {
517186f8572SMark Yao 		uint32_t cached_val = vop->regsbak[offset >> 2];
518186f8572SMark Yao 
519186f8572SMark Yao 		v = (cached_val & ~(mask << shift)) | ((v & mask) << shift);
520186f8572SMark Yao 		vop->regsbak[offset >> 2] = v;
521186f8572SMark Yao 	}
522186f8572SMark Yao 
523186f8572SMark Yao 	writel(v, vop->regs + offset);
524186f8572SMark Yao }
525186f8572SMark Yao 
526186f8572SMark Yao static inline void vop_cfg_done(struct vop *vop)
527186f8572SMark Yao {
528186f8572SMark Yao 	VOP_CTRL_SET(vop, cfg_done, 1);
529186f8572SMark Yao }
530186f8572SMark Yao 
531*fc8b0d66SDamon Ding static inline void vop_grf_writel(void *regmap, struct vop_reg reg, u32 v)
5323a06149eSSandy Huang {
5333a06149eSSandy Huang 	u32 val = 0;
5343a06149eSSandy Huang 
535*fc8b0d66SDamon Ding 	if (reg.mask) {
5363a06149eSSandy Huang 		val = (v << reg.shift) | (reg.mask << (reg.shift + 16));
537*fc8b0d66SDamon Ding 		writel(val, regmap + reg.offset);
5383a06149eSSandy Huang 	}
5393a06149eSSandy Huang }
5403a06149eSSandy Huang 
541186f8572SMark Yao /**
542186f8572SMark Yao  * drm_format_horz_chroma_subsampling - get the horizontal chroma subsampling factor
543186f8572SMark Yao  * @format: pixel format (DRM_FORMAT_*)
544186f8572SMark Yao  *
545186f8572SMark Yao  * Returns:
546186f8572SMark Yao  * The horizontal chroma subsampling factor for the
547186f8572SMark Yao  * specified pixel format.
548186f8572SMark Yao  */
549186f8572SMark Yao static inline int drm_format_horz_chroma_subsampling(uint32_t format)
550186f8572SMark Yao {
551186f8572SMark Yao 	/* uboot only support RGB format */
552186f8572SMark Yao 	return 1;
553186f8572SMark Yao }
554186f8572SMark Yao 
555186f8572SMark Yao /**
556186f8572SMark Yao  * drm_format_vert_chroma_subsampling - get the vertical chroma subsampling factor
557186f8572SMark Yao  * @format: pixel format (DRM_FORMAT_*)
558186f8572SMark Yao  *
559186f8572SMark Yao  * Returns:
560186f8572SMark Yao  * The vertical chroma subsampling factor for the
561186f8572SMark Yao  * specified pixel format.
562186f8572SMark Yao  */
563186f8572SMark Yao static inline int drm_format_vert_chroma_subsampling(uint32_t format)
564186f8572SMark Yao {
565186f8572SMark Yao 	/* uboot only support RGB format */
566186f8572SMark Yao 	return 1;
567186f8572SMark Yao }
568186f8572SMark Yao 
569186f8572SMark Yao #endif
570