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