xref: /OK3568_Linux_fs/u-boot/drivers/video/drm/rockchip_vop.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * (C) Copyright 2008-2017 Fuzhou Rockchip Electronics Co., Ltd
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef _ROCKCHIP_VOP_H_
8*4882a593Smuzhiyun #define _ROCKCHIP_VOP_H_
9*4882a593Smuzhiyun #include "rockchip_display.h"
10*4882a593Smuzhiyun #include <asm/gpio.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #define VOP_REG_SUPPORT(vop, reg) \
14*4882a593Smuzhiyun 		(reg.mask && \
15*4882a593Smuzhiyun 		 (!reg.major || \
16*4882a593Smuzhiyun 		  (reg.major == VOP_MAJOR(vop->version) && \
17*4882a593Smuzhiyun 		   reg.begin_minor <= VOP_MINOR(vop->version) && \
18*4882a593Smuzhiyun 		   reg.end_minor >= VOP_MINOR(vop->version))))
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define VOP_WIN_SUPPORT(vop, win, name) \
21*4882a593Smuzhiyun 		VOP_REG_SUPPORT(vop, win->name)
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define VOP_CTRL_SUPPORT(vop, name) \
24*4882a593Smuzhiyun 		VOP_REG_SUPPORT(vop, vop->ctrl->name)
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define __REG_SET(x, off, mask, shift, v, write_mask) \
27*4882a593Smuzhiyun 		vop_mask_write(x, off, mask, shift, v, write_mask)
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #define _REG_SET(vop, name, off, reg, mask, v) \
30*4882a593Smuzhiyun 	do { \
31*4882a593Smuzhiyun 		if (VOP_REG_SUPPORT(vop, reg)) \
32*4882a593Smuzhiyun 			__REG_SET(vop, off + reg.offset, mask, reg.shift, \
33*4882a593Smuzhiyun 				  v, reg.write_mask); \
34*4882a593Smuzhiyun 		else \
35*4882a593Smuzhiyun 			debug("Warning: not support "#name"\n"); \
36*4882a593Smuzhiyun 	} while(0)
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #define REG_SET(x, name, off, reg, v) \
39*4882a593Smuzhiyun 		_REG_SET(x, name, off, reg, reg.mask, v)
40*4882a593Smuzhiyun #define REG_SET_MASK(x, name, off, reg, mask, v, relaxed) \
41*4882a593Smuzhiyun 		_REG_SET(x, name, off, reg, reg.mask & mask, v)
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun #define VOP_WIN_SET(x, name, v) \
44*4882a593Smuzhiyun 		REG_SET(x, name, x->win_offset, x->win->name, v)
45*4882a593Smuzhiyun #define VOP_WIN_SET_EXT(x, ext, name, v) \
46*4882a593Smuzhiyun 		REG_SET(x, name, x->win_offset, x->win->ext->name, v)
47*4882a593Smuzhiyun #define VOP_SCL_SET(x, name, v) \
48*4882a593Smuzhiyun 		REG_SET(x, name, x->win_offset, x->win->scl->name, v)
49*4882a593Smuzhiyun #define VOP_SCL_SET_EXT(x, name, v) \
50*4882a593Smuzhiyun 		REG_SET(x, name, x->win_offset, x->win->scl->ext->name, v)
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #define VOP_CTRL_SET(x, name, v) \
53*4882a593Smuzhiyun 		REG_SET(x, name, 0, (x)->ctrl->name, v)
54*4882a593Smuzhiyun #define VOP_LINE_FLAG_SET(x, name, v) \
55*4882a593Smuzhiyun 		REG_SET(x, name, 0, (x)->line_flag->name, v)
56*4882a593Smuzhiyun #define VOP_WIN_CSC_SET(x, name, v) \
57*4882a593Smuzhiyun 		REG_SET(x, name, 0, (x)->win_csc->name, v)
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun #define VOP_CTRL_GET(x, name) \
60*4882a593Smuzhiyun 		vop_read_reg(x, 0, &vop->ctrl->name)
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun #define VOP_WIN_GET(x, name) \
63*4882a593Smuzhiyun 		vop_read_reg(x, vop->win->offset, &vop->win->name)
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun #define VOP_GRF_SET(vop, name, v) \
66*4882a593Smuzhiyun 	do { \
67*4882a593Smuzhiyun 		if (vop->grf_ctrl) { \
68*4882a593Smuzhiyun 			vop_grf_writel(vop, vop->grf_ctrl->name, v); \
69*4882a593Smuzhiyun 		} \
70*4882a593Smuzhiyun 	} while (0)
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun #define CVBS_PAL_VDISPLAY              288
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun enum alpha_mode {
75*4882a593Smuzhiyun 	ALPHA_STRAIGHT,
76*4882a593Smuzhiyun 	ALPHA_INVERSE,
77*4882a593Smuzhiyun };
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun enum global_blend_mode {
80*4882a593Smuzhiyun 	ALPHA_GLOBAL,
81*4882a593Smuzhiyun 	ALPHA_PER_PIX,
82*4882a593Smuzhiyun 	ALPHA_PER_PIX_GLOBAL,
83*4882a593Smuzhiyun };
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun enum alpha_cal_mode {
86*4882a593Smuzhiyun 	ALPHA_SATURATION,
87*4882a593Smuzhiyun 	ALPHA_NO_SATURATION,
88*4882a593Smuzhiyun };
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun enum color_mode {
91*4882a593Smuzhiyun 	ALPHA_SRC_PRE_MUL,
92*4882a593Smuzhiyun 	ALPHA_SRC_NO_PRE_MUL,
93*4882a593Smuzhiyun };
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun enum factor_mode {
96*4882a593Smuzhiyun 	ALPHA_ZERO,
97*4882a593Smuzhiyun 	ALPHA_ONE,
98*4882a593Smuzhiyun 	ALPHA_SRC,
99*4882a593Smuzhiyun 	ALPHA_SRC_INVERSE,
100*4882a593Smuzhiyun 	ALPHA_SRC_GLOBAL,
101*4882a593Smuzhiyun };
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun enum scale_mode {
104*4882a593Smuzhiyun 	SCALE_NONE = 0x0,
105*4882a593Smuzhiyun 	SCALE_UP   = 0x1,
106*4882a593Smuzhiyun 	SCALE_DOWN = 0x2
107*4882a593Smuzhiyun };
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun enum lb_mode {
110*4882a593Smuzhiyun 	LB_YUV_3840X5 = 0x0,
111*4882a593Smuzhiyun 	LB_YUV_2560X8 = 0x1,
112*4882a593Smuzhiyun 	LB_RGB_3840X2 = 0x2,
113*4882a593Smuzhiyun 	LB_RGB_2560X4 = 0x3,
114*4882a593Smuzhiyun 	LB_RGB_1920X5 = 0x4,
115*4882a593Smuzhiyun 	LB_RGB_1280X8 = 0x5
116*4882a593Smuzhiyun };
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun enum sacle_up_mode {
119*4882a593Smuzhiyun 	SCALE_UP_BIL = 0x0,
120*4882a593Smuzhiyun 	SCALE_UP_BIC = 0x1
121*4882a593Smuzhiyun };
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun enum scale_down_mode {
124*4882a593Smuzhiyun 	SCALE_DOWN_BIL = 0x0,
125*4882a593Smuzhiyun 	SCALE_DOWN_AVG = 0x1
126*4882a593Smuzhiyun };
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun enum dither_down_mode {
129*4882a593Smuzhiyun 	RGB888_TO_RGB565 = 0x0,
130*4882a593Smuzhiyun 	RGB888_TO_RGB666 = 0x1
131*4882a593Smuzhiyun };
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun enum dither_down_mode_sel {
134*4882a593Smuzhiyun 	DITHER_DOWN_ALLEGRO = 0x0,
135*4882a593Smuzhiyun 	DITHER_DOWN_FRC = 0x1
136*4882a593Smuzhiyun };
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun enum vop_csc_format {
139*4882a593Smuzhiyun 	CSC_BT601L,
140*4882a593Smuzhiyun 	CSC_BT709L,
141*4882a593Smuzhiyun 	CSC_BT601F,
142*4882a593Smuzhiyun 	CSC_BT2020,
143*4882a593Smuzhiyun };
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun #define DSP_BG_SWAP		0x1
146*4882a593Smuzhiyun #define DSP_RB_SWAP		0x2
147*4882a593Smuzhiyun #define DSP_RG_SWAP		0x4
148*4882a593Smuzhiyun #define DSP_DELTA_SWAP		0x8
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun #define PRE_DITHER_DOWN_EN(x)	((x) << 0)
151*4882a593Smuzhiyun #define DITHER_DOWN_EN(x)	((x) << 1)
152*4882a593Smuzhiyun #define DITHER_DOWN_MODE(x)	((x) << 2)
153*4882a593Smuzhiyun #define DITHER_DOWN_MODE_SEL(x)	((x) << 3)
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun #define FRAC_16_16(mult, div)    (((mult) << 16) / (div))
156*4882a593Smuzhiyun #define SCL_FT_DEFAULT_FIXPOINT_SHIFT	12
157*4882a593Smuzhiyun #define SCL_MAX_VSKIPLINES		4
158*4882a593Smuzhiyun #define MIN_SCL_FT_AFTER_VSKIP		1
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun #define VOP_PLANE_NO_SCALING	BIT(16)
161*4882a593Smuzhiyun 
scl_cal_scale(int src,int dst,int shift)162*4882a593Smuzhiyun static inline uint16_t scl_cal_scale(int src, int dst, int shift)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun 	return ((src * 2 - 3) << (shift - 1)) / (dst - 1);
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun 
scl_cal_scale2(int src,int dst)167*4882a593Smuzhiyun static inline uint16_t scl_cal_scale2(int src, int dst)
168*4882a593Smuzhiyun {
169*4882a593Smuzhiyun 	return ((src - 1) << 12) / (dst - 1);
170*4882a593Smuzhiyun }
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun #define GET_SCL_FT_BILI_DN(src, dst)	scl_cal_scale(src, dst, 12)
173*4882a593Smuzhiyun #define GET_SCL_FT_BILI_UP(src, dst)	scl_cal_scale(src, dst, 16)
174*4882a593Smuzhiyun #define GET_SCL_FT_BIC(src, dst)	scl_cal_scale(src, dst, 16)
175*4882a593Smuzhiyun 
scl_get_bili_dn_vskip(int src_h,int dst_h,int vskiplines)176*4882a593Smuzhiyun static inline uint16_t scl_get_bili_dn_vskip(int src_h, int dst_h,
177*4882a593Smuzhiyun 					     int vskiplines)
178*4882a593Smuzhiyun {
179*4882a593Smuzhiyun 	int act_height;
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun 	act_height = (src_h + vskiplines - 1) / vskiplines;
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	return GET_SCL_FT_BILI_DN(act_height, dst_h);
184*4882a593Smuzhiyun }
185*4882a593Smuzhiyun 
scl_get_scl_mode(int src,int dst)186*4882a593Smuzhiyun static inline enum scale_mode scl_get_scl_mode(int src, int dst)
187*4882a593Smuzhiyun {
188*4882a593Smuzhiyun 	if (src < dst)
189*4882a593Smuzhiyun 		return SCALE_UP;
190*4882a593Smuzhiyun 	else if (src > dst)
191*4882a593Smuzhiyun 		return SCALE_DOWN;
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 	return SCALE_NONE;
194*4882a593Smuzhiyun }
195*4882a593Smuzhiyun 
scl_get_vskiplines(uint32_t srch,uint32_t dsth)196*4882a593Smuzhiyun static inline int scl_get_vskiplines(uint32_t srch, uint32_t dsth)
197*4882a593Smuzhiyun {
198*4882a593Smuzhiyun 	uint32_t vskiplines;
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun 	for (vskiplines = SCL_MAX_VSKIPLINES; vskiplines > 1; vskiplines /= 2)
201*4882a593Smuzhiyun 		if (srch >= vskiplines * dsth * MIN_SCL_FT_AFTER_VSKIP)
202*4882a593Smuzhiyun 			break;
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun 	return vskiplines;
205*4882a593Smuzhiyun }
206*4882a593Smuzhiyun 
scl_vop_cal_lb_mode(int width,bool is_yuv)207*4882a593Smuzhiyun static inline int scl_vop_cal_lb_mode(int width, bool is_yuv)
208*4882a593Smuzhiyun {
209*4882a593Smuzhiyun 	int lb_mode;
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun 	if (width > 2560)
212*4882a593Smuzhiyun 		lb_mode = LB_RGB_3840X2;
213*4882a593Smuzhiyun 	else if (width > 1920)
214*4882a593Smuzhiyun 		lb_mode = LB_RGB_2560X4;
215*4882a593Smuzhiyun 	else if (!is_yuv)
216*4882a593Smuzhiyun 		lb_mode = LB_RGB_1920X5;
217*4882a593Smuzhiyun 	else if (width > 1280)
218*4882a593Smuzhiyun 		lb_mode = LB_YUV_3840X5;
219*4882a593Smuzhiyun 	else
220*4882a593Smuzhiyun 		lb_mode = LB_YUV_2560X8;
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun 	return lb_mode;
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun struct vop_reg_data {
226*4882a593Smuzhiyun 	uint32_t offset;
227*4882a593Smuzhiyun 	uint32_t value;
228*4882a593Smuzhiyun };
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun struct vop_reg {
231*4882a593Smuzhiyun 	uint32_t mask;
232*4882a593Smuzhiyun 	uint32_t offset:17;
233*4882a593Smuzhiyun 	uint32_t shift:5;
234*4882a593Smuzhiyun 	uint32_t begin_minor:4;
235*4882a593Smuzhiyun 	uint32_t end_minor:4;
236*4882a593Smuzhiyun 	uint32_t reserved:2;
237*4882a593Smuzhiyun 	uint32_t major:3;
238*4882a593Smuzhiyun 	uint32_t write_mask:1;
239*4882a593Smuzhiyun };
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun struct vop_ctrl {
242*4882a593Smuzhiyun 	struct vop_reg standby;
243*4882a593Smuzhiyun 	struct vop_reg axi_outstanding_max_num;
244*4882a593Smuzhiyun 	struct vop_reg axi_max_outstanding_en;
245*4882a593Smuzhiyun 	struct vop_reg htotal_pw;
246*4882a593Smuzhiyun 	struct vop_reg hact_st_end;
247*4882a593Smuzhiyun 	struct vop_reg vtotal_pw;
248*4882a593Smuzhiyun 	struct vop_reg vact_st_end;
249*4882a593Smuzhiyun 	struct vop_reg vact_st_end_f1;
250*4882a593Smuzhiyun 	struct vop_reg vs_st_end_f1;
251*4882a593Smuzhiyun 	struct vop_reg hpost_st_end;
252*4882a593Smuzhiyun 	struct vop_reg vpost_st_end;
253*4882a593Smuzhiyun 	struct vop_reg vpost_st_end_f1;
254*4882a593Smuzhiyun 	struct vop_reg post_scl_factor;
255*4882a593Smuzhiyun 	struct vop_reg post_scl_ctrl;
256*4882a593Smuzhiyun 	struct vop_reg dsp_interlace;
257*4882a593Smuzhiyun 	struct vop_reg global_regdone_en;
258*4882a593Smuzhiyun 	struct vop_reg auto_gate_en;
259*4882a593Smuzhiyun 	struct vop_reg post_lb_mode;
260*4882a593Smuzhiyun 	struct vop_reg dsp_layer_sel;
261*4882a593Smuzhiyun 	struct vop_reg overlay_mode;
262*4882a593Smuzhiyun 	struct vop_reg core_dclk_div;
263*4882a593Smuzhiyun 	struct vop_reg dclk_ddr;
264*4882a593Smuzhiyun 	struct vop_reg p2i_en;
265*4882a593Smuzhiyun 	struct vop_reg hdmi_dclk_out_en;
266*4882a593Smuzhiyun 	struct vop_reg rgb_en;
267*4882a593Smuzhiyun 	struct vop_reg lvds_en;
268*4882a593Smuzhiyun 	struct vop_reg edp_en;
269*4882a593Smuzhiyun 	struct vop_reg hdmi_en;
270*4882a593Smuzhiyun 	struct vop_reg mipi_en;
271*4882a593Smuzhiyun 	struct vop_reg data01_swap;
272*4882a593Smuzhiyun 	struct vop_reg mipi_dual_channel_en;
273*4882a593Smuzhiyun 	struct vop_reg dp_en;
274*4882a593Smuzhiyun 	struct vop_reg dclk_pol;
275*4882a593Smuzhiyun 	struct vop_reg pin_pol;
276*4882a593Smuzhiyun 	struct vop_reg rgb_dclk_pol;
277*4882a593Smuzhiyun 	struct vop_reg rgb_pin_pol;
278*4882a593Smuzhiyun 	struct vop_reg lvds_dclk_pol;
279*4882a593Smuzhiyun 	struct vop_reg lvds_pin_pol;
280*4882a593Smuzhiyun 	struct vop_reg hdmi_dclk_pol;
281*4882a593Smuzhiyun 	struct vop_reg hdmi_pin_pol;
282*4882a593Smuzhiyun 	struct vop_reg edp_dclk_pol;
283*4882a593Smuzhiyun 	struct vop_reg edp_pin_pol;
284*4882a593Smuzhiyun 	struct vop_reg mipi_dclk_pol;
285*4882a593Smuzhiyun 	struct vop_reg mipi_pin_pol;
286*4882a593Smuzhiyun 	struct vop_reg dp_dclk_pol;
287*4882a593Smuzhiyun 	struct vop_reg dp_pin_pol;
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun 	struct vop_reg dither_up;
290*4882a593Smuzhiyun 	struct vop_reg dither_down;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	struct vop_reg sw_dac_sel;
293*4882a593Smuzhiyun 	struct vop_reg tve_sw_mode;
294*4882a593Smuzhiyun 	struct vop_reg tve_dclk_pol;
295*4882a593Smuzhiyun 	struct vop_reg tve_dclk_en;
296*4882a593Smuzhiyun 	struct vop_reg sw_genlock;
297*4882a593Smuzhiyun 	struct vop_reg sw_uv_offset_en;
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun 	struct vop_reg dsp_out_yuv;
300*4882a593Smuzhiyun 	struct vop_reg dsp_data_swap;
301*4882a593Smuzhiyun 	struct vop_reg dsp_bg_swap;
302*4882a593Smuzhiyun 	struct vop_reg dsp_rb_swap;
303*4882a593Smuzhiyun 	struct vop_reg dsp_rg_swap;
304*4882a593Smuzhiyun 	struct vop_reg dsp_delta_swap;
305*4882a593Smuzhiyun 	struct vop_reg dsp_dummy_swap;
306*4882a593Smuzhiyun 	struct vop_reg dsp_ccir656_avg;
307*4882a593Smuzhiyun 	struct vop_reg dsp_black;
308*4882a593Smuzhiyun 	struct vop_reg dsp_blank;
309*4882a593Smuzhiyun 	struct vop_reg dsp_outzero;
310*4882a593Smuzhiyun 	struct vop_reg dsp_lut_en;
311*4882a593Smuzhiyun 	struct vop_reg update_gamma_lut;
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun 	struct vop_reg out_mode;
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 	struct vop_reg xmirror;
316*4882a593Smuzhiyun 	struct vop_reg ymirror;
317*4882a593Smuzhiyun 	struct vop_reg dsp_background;
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun 	/* CABC */
320*4882a593Smuzhiyun 	struct vop_reg cabc_total_num;
321*4882a593Smuzhiyun 	struct vop_reg cabc_config_mode;
322*4882a593Smuzhiyun 	struct vop_reg cabc_stage_up_mode;
323*4882a593Smuzhiyun 	struct vop_reg cabc_scale_cfg_value;
324*4882a593Smuzhiyun 	struct vop_reg cabc_scale_cfg_enable;
325*4882a593Smuzhiyun 	struct vop_reg cabc_global_dn_limit_en;
326*4882a593Smuzhiyun 	struct vop_reg cabc_lut_en;
327*4882a593Smuzhiyun 	struct vop_reg cabc_en;
328*4882a593Smuzhiyun 	struct vop_reg cabc_handle_en;
329*4882a593Smuzhiyun 	struct vop_reg cabc_stage_up;
330*4882a593Smuzhiyun 	struct vop_reg cabc_stage_down;
331*4882a593Smuzhiyun 	struct vop_reg cabc_global_dn;
332*4882a593Smuzhiyun 	struct vop_reg cabc_calc_pixel_num;
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun 	struct vop_reg win_gate[4];
335*4882a593Smuzhiyun 	struct vop_reg win_channel[4];
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun 	/* BCSH */
338*4882a593Smuzhiyun 	struct vop_reg bcsh_brightness;
339*4882a593Smuzhiyun 	struct vop_reg bcsh_contrast;
340*4882a593Smuzhiyun 	struct vop_reg bcsh_sat_con;
341*4882a593Smuzhiyun 	struct vop_reg bcsh_sin_hue;
342*4882a593Smuzhiyun 	struct vop_reg bcsh_cos_hue;
343*4882a593Smuzhiyun 	struct vop_reg bcsh_r2y_csc_mode;
344*4882a593Smuzhiyun 	struct vop_reg bcsh_r2y_en;
345*4882a593Smuzhiyun 	struct vop_reg bcsh_y2r_csc_mode;
346*4882a593Smuzhiyun 	struct vop_reg bcsh_y2r_en;
347*4882a593Smuzhiyun 	struct vop_reg bcsh_color_bar;
348*4882a593Smuzhiyun 	struct vop_reg bcsh_out_mode;
349*4882a593Smuzhiyun 	struct vop_reg bcsh_en;
350*4882a593Smuzhiyun 	struct vop_reg reg_done_frm;
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun 	/* MCU OUTPUT */
353*4882a593Smuzhiyun 	struct vop_reg mcu_pix_total;
354*4882a593Smuzhiyun 	struct vop_reg mcu_cs_pst;
355*4882a593Smuzhiyun 	struct vop_reg mcu_cs_pend;
356*4882a593Smuzhiyun 	struct vop_reg mcu_rw_pst;
357*4882a593Smuzhiyun 	struct vop_reg mcu_rw_pend;
358*4882a593Smuzhiyun 	struct vop_reg mcu_clk_sel;
359*4882a593Smuzhiyun 	struct vop_reg mcu_hold_mode;
360*4882a593Smuzhiyun 	struct vop_reg mcu_frame_st;
361*4882a593Smuzhiyun 	struct vop_reg mcu_rs;
362*4882a593Smuzhiyun 	struct vop_reg mcu_bypass;
363*4882a593Smuzhiyun 	struct vop_reg mcu_type;
364*4882a593Smuzhiyun 	struct vop_reg mcu_rw_bypass_port;
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun 	/* bt1120 */
367*4882a593Smuzhiyun 	struct vop_reg bt1120_yc_swap;
368*4882a593Smuzhiyun 	struct vop_reg bt1120_en;
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun 	/* bt656 */
371*4882a593Smuzhiyun 	struct vop_reg bt656_en;
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun 	struct vop_reg cfg_done;
374*4882a593Smuzhiyun };
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun struct vop_scl_extension {
377*4882a593Smuzhiyun 	struct vop_reg cbcr_vsd_mode;
378*4882a593Smuzhiyun 	struct vop_reg cbcr_vsu_mode;
379*4882a593Smuzhiyun 	struct vop_reg cbcr_hsd_mode;
380*4882a593Smuzhiyun 	struct vop_reg cbcr_ver_scl_mode;
381*4882a593Smuzhiyun 	struct vop_reg cbcr_hor_scl_mode;
382*4882a593Smuzhiyun 	struct vop_reg yrgb_vsd_mode;
383*4882a593Smuzhiyun 	struct vop_reg yrgb_vsu_mode;
384*4882a593Smuzhiyun 	struct vop_reg yrgb_hsd_mode;
385*4882a593Smuzhiyun 	struct vop_reg yrgb_ver_scl_mode;
386*4882a593Smuzhiyun 	struct vop_reg yrgb_hor_scl_mode;
387*4882a593Smuzhiyun 	struct vop_reg line_load_mode;
388*4882a593Smuzhiyun 	struct vop_reg cbcr_axi_gather_num;
389*4882a593Smuzhiyun 	struct vop_reg yrgb_axi_gather_num;
390*4882a593Smuzhiyun 	struct vop_reg vsd_cbcr_gt2;
391*4882a593Smuzhiyun 	struct vop_reg vsd_cbcr_gt4;
392*4882a593Smuzhiyun 	struct vop_reg vsd_yrgb_gt2;
393*4882a593Smuzhiyun 	struct vop_reg vsd_yrgb_gt4;
394*4882a593Smuzhiyun 	struct vop_reg bic_coe_sel;
395*4882a593Smuzhiyun 	struct vop_reg cbcr_axi_gather_en;
396*4882a593Smuzhiyun 	struct vop_reg yrgb_axi_gather_en;
397*4882a593Smuzhiyun 	struct vop_reg lb_mode;
398*4882a593Smuzhiyun };
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun struct vop_scl_regs {
401*4882a593Smuzhiyun 	const struct vop_scl_extension *ext;
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun 	struct vop_reg scale_yrgb_x;
404*4882a593Smuzhiyun 	struct vop_reg scale_yrgb_y;
405*4882a593Smuzhiyun 	struct vop_reg scale_cbcr_x;
406*4882a593Smuzhiyun 	struct vop_reg scale_cbcr_y;
407*4882a593Smuzhiyun };
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun struct vop_win {
410*4882a593Smuzhiyun 	const struct vop_scl_regs *scl;
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun 	struct vop_reg gate;
413*4882a593Smuzhiyun 	struct vop_reg enable;
414*4882a593Smuzhiyun 	struct vop_reg format;
415*4882a593Smuzhiyun 	struct vop_reg interlace_read;
416*4882a593Smuzhiyun 	struct vop_reg ymirror;
417*4882a593Smuzhiyun 	struct vop_reg rb_swap;
418*4882a593Smuzhiyun 	struct vop_reg act_info;
419*4882a593Smuzhiyun 	struct vop_reg dsp_info;
420*4882a593Smuzhiyun 	struct vop_reg dsp_st;
421*4882a593Smuzhiyun 	struct vop_reg yrgb_mst;
422*4882a593Smuzhiyun 	struct vop_reg uv_mst;
423*4882a593Smuzhiyun 	struct vop_reg yrgb_vir;
424*4882a593Smuzhiyun 	struct vop_reg uv_vir;
425*4882a593Smuzhiyun 	struct vop_reg alpha_mode;
426*4882a593Smuzhiyun 	struct vop_reg alpha_en;
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun 	struct vop_reg dst_alpha_ctl;
429*4882a593Smuzhiyun 	struct vop_reg src_alpha_ctl;
430*4882a593Smuzhiyun };
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun struct vop_line_flag {
433*4882a593Smuzhiyun 	struct vop_reg line_flag_num[2];
434*4882a593Smuzhiyun };
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun struct vop_grf_ctrl {
437*4882a593Smuzhiyun 	struct vop_reg grf_dclk_inv;
438*4882a593Smuzhiyun };
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun struct vop_csc_table {
441*4882a593Smuzhiyun 	const uint32_t *r2y_bt601;
442*4882a593Smuzhiyun 	const uint32_t *r2y_bt601_12_235;
443*4882a593Smuzhiyun 	const uint32_t *r2y_bt709;
444*4882a593Smuzhiyun 	const uint32_t *r2y_bt2020;
445*4882a593Smuzhiyun };
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun struct vop_csc {
448*4882a593Smuzhiyun 	struct vop_reg y2r_en;
449*4882a593Smuzhiyun 	struct vop_reg r2r_en;
450*4882a593Smuzhiyun 	struct vop_reg r2y_en;
451*4882a593Smuzhiyun 
452*4882a593Smuzhiyun 	uint32_t y2r_offset;
453*4882a593Smuzhiyun 	uint32_t r2r_offset;
454*4882a593Smuzhiyun 	uint32_t r2y_offset;
455*4882a593Smuzhiyun };
456*4882a593Smuzhiyun 
457*4882a593Smuzhiyun #define VOP_FEATURE_OUTPUT_10BIT	BIT(0)
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun struct vop_data {
460*4882a593Smuzhiyun 	uint32_t version;
461*4882a593Smuzhiyun 	const struct vop_ctrl *ctrl;
462*4882a593Smuzhiyun 	const struct vop_win *win;
463*4882a593Smuzhiyun 	const struct vop_line_flag *line_flag;
464*4882a593Smuzhiyun 	const struct vop_grf_ctrl *grf_ctrl;
465*4882a593Smuzhiyun 	const struct vop_csc_table *csc_table;
466*4882a593Smuzhiyun 	const struct vop_csc *win_csc;
467*4882a593Smuzhiyun 	int win_offset;
468*4882a593Smuzhiyun 	int reg_len;
469*4882a593Smuzhiyun 	u64 feature;
470*4882a593Smuzhiyun 	struct vop_rect max_output;
471*4882a593Smuzhiyun };
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun struct vop {
474*4882a593Smuzhiyun 	u32 *regsbak;
475*4882a593Smuzhiyun 	void *regs;
476*4882a593Smuzhiyun 	void *grf;
477*4882a593Smuzhiyun 
478*4882a593Smuzhiyun 	uint32_t version;
479*4882a593Smuzhiyun 	const struct vop_ctrl *ctrl;
480*4882a593Smuzhiyun 	const struct vop_win *win;
481*4882a593Smuzhiyun 	const struct vop_line_flag *line_flag;
482*4882a593Smuzhiyun 	const struct vop_grf_ctrl *grf_ctrl;
483*4882a593Smuzhiyun 	const struct vop_csc_table *csc_table;
484*4882a593Smuzhiyun 	const struct vop_csc *win_csc;
485*4882a593Smuzhiyun 	int win_offset;
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun 	struct gpio_desc mcu_rs_gpio;
488*4882a593Smuzhiyun };
489*4882a593Smuzhiyun 
vop_writel(struct vop * vop,uint32_t offset,uint32_t v)490*4882a593Smuzhiyun static inline void vop_writel(struct vop *vop, uint32_t offset, uint32_t v)
491*4882a593Smuzhiyun {
492*4882a593Smuzhiyun 	writel(v, vop->regs + offset);
493*4882a593Smuzhiyun 	vop->regsbak[offset >> 2] = v;
494*4882a593Smuzhiyun }
495*4882a593Smuzhiyun 
vop_readl(struct vop * vop,uint32_t offset)496*4882a593Smuzhiyun static inline uint32_t vop_readl(struct vop *vop, uint32_t offset)
497*4882a593Smuzhiyun {
498*4882a593Smuzhiyun 	return readl(vop->regs + offset);
499*4882a593Smuzhiyun }
500*4882a593Smuzhiyun 
vop_read_reg(struct vop * vop,uint32_t base,const struct vop_reg * reg)501*4882a593Smuzhiyun static inline uint32_t vop_read_reg(struct vop *vop, uint32_t base,
502*4882a593Smuzhiyun 				    const struct vop_reg *reg)
503*4882a593Smuzhiyun {
504*4882a593Smuzhiyun 	return (vop_readl(vop, base + reg->offset) >> reg->shift) & reg->mask;
505*4882a593Smuzhiyun }
506*4882a593Smuzhiyun 
vop_mask_write(struct vop * vop,uint32_t offset,uint32_t mask,uint32_t shift,uint32_t v,bool write_mask)507*4882a593Smuzhiyun static inline void vop_mask_write(struct vop *vop, uint32_t offset,
508*4882a593Smuzhiyun 				  uint32_t mask, uint32_t shift, uint32_t v,
509*4882a593Smuzhiyun 				  bool write_mask)
510*4882a593Smuzhiyun {
511*4882a593Smuzhiyun 	if (!mask)
512*4882a593Smuzhiyun 		return;
513*4882a593Smuzhiyun 
514*4882a593Smuzhiyun 	if (write_mask) {
515*4882a593Smuzhiyun 		v = ((v & mask) << shift) | (mask << (shift + 16));
516*4882a593Smuzhiyun 	} else {
517*4882a593Smuzhiyun 		uint32_t cached_val = vop->regsbak[offset >> 2];
518*4882a593Smuzhiyun 
519*4882a593Smuzhiyun 		v = (cached_val & ~(mask << shift)) | ((v & mask) << shift);
520*4882a593Smuzhiyun 		vop->regsbak[offset >> 2] = v;
521*4882a593Smuzhiyun 	}
522*4882a593Smuzhiyun 
523*4882a593Smuzhiyun 	writel(v, vop->regs + offset);
524*4882a593Smuzhiyun }
525*4882a593Smuzhiyun 
vop_cfg_done(struct vop * vop)526*4882a593Smuzhiyun static inline void vop_cfg_done(struct vop *vop)
527*4882a593Smuzhiyun {
528*4882a593Smuzhiyun 	VOP_CTRL_SET(vop, cfg_done, 1);
529*4882a593Smuzhiyun }
530*4882a593Smuzhiyun 
vop_grf_writel(struct vop * vop,struct vop_reg reg,u32 v)531*4882a593Smuzhiyun static inline void vop_grf_writel(struct vop *vop, struct vop_reg reg, u32 v)
532*4882a593Smuzhiyun {
533*4882a593Smuzhiyun 	u32 val = 0;
534*4882a593Smuzhiyun 
535*4882a593Smuzhiyun 	if (VOP_REG_SUPPORT(vop, reg)) {
536*4882a593Smuzhiyun 		val = (v << reg.shift) | (reg.mask << (reg.shift + 16));
537*4882a593Smuzhiyun 		writel(val, vop->grf + reg.offset);
538*4882a593Smuzhiyun 	}
539*4882a593Smuzhiyun }
540*4882a593Smuzhiyun 
541*4882a593Smuzhiyun /**
542*4882a593Smuzhiyun  * drm_format_horz_chroma_subsampling - get the horizontal chroma subsampling factor
543*4882a593Smuzhiyun  * @format: pixel format (DRM_FORMAT_*)
544*4882a593Smuzhiyun  *
545*4882a593Smuzhiyun  * Returns:
546*4882a593Smuzhiyun  * The horizontal chroma subsampling factor for the
547*4882a593Smuzhiyun  * specified pixel format.
548*4882a593Smuzhiyun  */
drm_format_horz_chroma_subsampling(uint32_t format)549*4882a593Smuzhiyun static inline int drm_format_horz_chroma_subsampling(uint32_t format)
550*4882a593Smuzhiyun {
551*4882a593Smuzhiyun 	/* uboot only support RGB format */
552*4882a593Smuzhiyun 	return 1;
553*4882a593Smuzhiyun }
554*4882a593Smuzhiyun 
555*4882a593Smuzhiyun /**
556*4882a593Smuzhiyun  * drm_format_vert_chroma_subsampling - get the vertical chroma subsampling factor
557*4882a593Smuzhiyun  * @format: pixel format (DRM_FORMAT_*)
558*4882a593Smuzhiyun  *
559*4882a593Smuzhiyun  * Returns:
560*4882a593Smuzhiyun  * The vertical chroma subsampling factor for the
561*4882a593Smuzhiyun  * specified pixel format.
562*4882a593Smuzhiyun  */
drm_format_vert_chroma_subsampling(uint32_t format)563*4882a593Smuzhiyun static inline int drm_format_vert_chroma_subsampling(uint32_t format)
564*4882a593Smuzhiyun {
565*4882a593Smuzhiyun 	/* uboot only support RGB format */
566*4882a593Smuzhiyun 	return 1;
567*4882a593Smuzhiyun }
568*4882a593Smuzhiyun 
569*4882a593Smuzhiyun #endif
570