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
65fc8b0d66SDamon Ding #define VOP_GRF_SET(vop, grf, reg, v) \
663a06149eSSandy Huang do { \
67fc8b0d66SDamon Ding if (vop->data->grf) { \
68fc8b0d66SDamon 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,
142df0a5c43SDamon Ding CSC_BT2020L,
143df0a5c43SDamon Ding CSC_BT709L_13BIT,
144df0a5c43SDamon Ding CSC_BT709F_13BIT,
145df0a5c43SDamon Ding CSC_BT2020L_13BIT,
146df0a5c43SDamon Ding CSC_BT2020F_13BIT,
14779feefb1SSandy Huang };
14879feefb1SSandy Huang
14972f233a9SDamon Ding enum vop_pol {
15072f233a9SDamon Ding HSYNC_POSITIVE = 0,
15172f233a9SDamon Ding VSYNC_POSITIVE = 1,
15272f233a9SDamon Ding DEN_NEGATIVE = 2,
15372f233a9SDamon Ding DCLK_INVERT = 3
15472f233a9SDamon Ding };
15572f233a9SDamon Ding
15679feefb1SSandy Huang #define DSP_BG_SWAP 0x1
15779feefb1SSandy Huang #define DSP_RB_SWAP 0x2
15879feefb1SSandy Huang #define DSP_RG_SWAP 0x4
15979feefb1SSandy Huang #define DSP_DELTA_SWAP 0x8
16079feefb1SSandy Huang
161186f8572SMark Yao #define PRE_DITHER_DOWN_EN(x) ((x) << 0)
162186f8572SMark Yao #define DITHER_DOWN_EN(x) ((x) << 1)
163186f8572SMark Yao #define DITHER_DOWN_MODE(x) ((x) << 2)
164186f8572SMark Yao #define DITHER_DOWN_MODE_SEL(x) ((x) << 3)
165186f8572SMark Yao
166186f8572SMark Yao #define FRAC_16_16(mult, div) (((mult) << 16) / (div))
167186f8572SMark Yao #define SCL_FT_DEFAULT_FIXPOINT_SHIFT 12
168186f8572SMark Yao #define SCL_MAX_VSKIPLINES 4
169186f8572SMark Yao #define MIN_SCL_FT_AFTER_VSKIP 1
170186f8572SMark Yao
1714c765862SDamon Ding #define VOP_PLANE_NO_SCALING BIT(16)
1724c765862SDamon Ding
scl_cal_scale(int src,int dst,int shift)173186f8572SMark Yao static inline uint16_t scl_cal_scale(int src, int dst, int shift)
174186f8572SMark Yao {
175186f8572SMark Yao return ((src * 2 - 3) << (shift - 1)) / (dst - 1);
176186f8572SMark Yao }
177186f8572SMark Yao
scl_cal_scale2(int src,int dst)178186f8572SMark Yao static inline uint16_t scl_cal_scale2(int src, int dst)
179186f8572SMark Yao {
180186f8572SMark Yao return ((src - 1) << 12) / (dst - 1);
181186f8572SMark Yao }
182186f8572SMark Yao
183186f8572SMark Yao #define GET_SCL_FT_BILI_DN(src, dst) scl_cal_scale(src, dst, 12)
184186f8572SMark Yao #define GET_SCL_FT_BILI_UP(src, dst) scl_cal_scale(src, dst, 16)
185186f8572SMark Yao #define GET_SCL_FT_BIC(src, dst) scl_cal_scale(src, dst, 16)
186186f8572SMark Yao
scl_get_bili_dn_vskip(int src_h,int dst_h,int vskiplines)187186f8572SMark Yao static inline uint16_t scl_get_bili_dn_vskip(int src_h, int dst_h,
188186f8572SMark Yao int vskiplines)
189186f8572SMark Yao {
190186f8572SMark Yao int act_height;
191186f8572SMark Yao
192186f8572SMark Yao act_height = (src_h + vskiplines - 1) / vskiplines;
193186f8572SMark Yao
194186f8572SMark Yao return GET_SCL_FT_BILI_DN(act_height, dst_h);
195186f8572SMark Yao }
196186f8572SMark Yao
scl_get_scl_mode(int src,int dst)197186f8572SMark Yao static inline enum scale_mode scl_get_scl_mode(int src, int dst)
198186f8572SMark Yao {
199186f8572SMark Yao if (src < dst)
200186f8572SMark Yao return SCALE_UP;
201186f8572SMark Yao else if (src > dst)
202186f8572SMark Yao return SCALE_DOWN;
203186f8572SMark Yao
204186f8572SMark Yao return SCALE_NONE;
205186f8572SMark Yao }
206186f8572SMark Yao
scl_get_vskiplines(uint32_t srch,uint32_t dsth)207186f8572SMark Yao static inline int scl_get_vskiplines(uint32_t srch, uint32_t dsth)
208186f8572SMark Yao {
209186f8572SMark Yao uint32_t vskiplines;
210186f8572SMark Yao
211186f8572SMark Yao for (vskiplines = SCL_MAX_VSKIPLINES; vskiplines > 1; vskiplines /= 2)
212186f8572SMark Yao if (srch >= vskiplines * dsth * MIN_SCL_FT_AFTER_VSKIP)
213186f8572SMark Yao break;
214186f8572SMark Yao
215186f8572SMark Yao return vskiplines;
216186f8572SMark Yao }
217186f8572SMark Yao
scl_vop_cal_lb_mode(int width,bool is_yuv)218186f8572SMark Yao static inline int scl_vop_cal_lb_mode(int width, bool is_yuv)
219186f8572SMark Yao {
220186f8572SMark Yao int lb_mode;
221186f8572SMark Yao
222186f8572SMark Yao if (width > 2560)
223186f8572SMark Yao lb_mode = LB_RGB_3840X2;
224186f8572SMark Yao else if (width > 1920)
225186f8572SMark Yao lb_mode = LB_RGB_2560X4;
226186f8572SMark Yao else if (!is_yuv)
227186f8572SMark Yao lb_mode = LB_RGB_1920X5;
228186f8572SMark Yao else if (width > 1280)
229186f8572SMark Yao lb_mode = LB_YUV_3840X5;
230186f8572SMark Yao else
231186f8572SMark Yao lb_mode = LB_YUV_2560X8;
232186f8572SMark Yao
233186f8572SMark Yao return lb_mode;
234186f8572SMark Yao }
235186f8572SMark Yao
236186f8572SMark Yao struct vop_reg_data {
237186f8572SMark Yao uint32_t offset;
238186f8572SMark Yao uint32_t value;
239186f8572SMark Yao };
240186f8572SMark Yao
241186f8572SMark Yao struct vop_reg {
242186f8572SMark Yao uint32_t mask;
24310a896e2SChaoyi Chen uint32_t offset:19;
244186f8572SMark Yao uint32_t shift:5;
245186f8572SMark Yao uint32_t begin_minor:4;
246186f8572SMark Yao uint32_t end_minor:4;
247186f8572SMark Yao uint32_t major:3;
248186f8572SMark Yao uint32_t write_mask:1;
249186f8572SMark Yao };
250186f8572SMark Yao
251186f8572SMark Yao struct vop_ctrl {
252186f8572SMark Yao struct vop_reg standby;
2532b34f307SMark Yao struct vop_reg axi_outstanding_max_num;
2542b34f307SMark Yao struct vop_reg axi_max_outstanding_en;
255186f8572SMark Yao struct vop_reg htotal_pw;
256186f8572SMark Yao struct vop_reg hact_st_end;
257186f8572SMark Yao struct vop_reg vtotal_pw;
258186f8572SMark Yao struct vop_reg vact_st_end;
259186f8572SMark Yao struct vop_reg vact_st_end_f1;
260186f8572SMark Yao struct vop_reg vs_st_end_f1;
261186f8572SMark Yao struct vop_reg hpost_st_end;
262186f8572SMark Yao struct vop_reg vpost_st_end;
263186f8572SMark Yao struct vop_reg vpost_st_end_f1;
264186f8572SMark Yao struct vop_reg post_scl_factor;
265186f8572SMark Yao struct vop_reg post_scl_ctrl;
266186f8572SMark Yao struct vop_reg dsp_interlace;
26772f233a9SDamon Ding struct vop_reg dsp_interlace_pol;
268186f8572SMark Yao struct vop_reg global_regdone_en;
269186f8572SMark Yao struct vop_reg auto_gate_en;
270186f8572SMark Yao struct vop_reg post_lb_mode;
271186f8572SMark Yao struct vop_reg dsp_layer_sel;
272186f8572SMark Yao struct vop_reg overlay_mode;
273186f8572SMark Yao struct vop_reg core_dclk_div;
274186f8572SMark Yao struct vop_reg dclk_ddr;
275186f8572SMark Yao struct vop_reg p2i_en;
27679feefb1SSandy Huang struct vop_reg hdmi_dclk_out_en;
277186f8572SMark Yao struct vop_reg rgb_en;
2787130fbf6SSandy Huang struct vop_reg lvds_en;
279186f8572SMark Yao struct vop_reg edp_en;
280186f8572SMark Yao struct vop_reg hdmi_en;
281186f8572SMark Yao struct vop_reg mipi_en;
282186f8572SMark Yao struct vop_reg data01_swap;
283186f8572SMark Yao struct vop_reg mipi_dual_channel_en;
284186f8572SMark Yao struct vop_reg dp_en;
2857130fbf6SSandy Huang struct vop_reg dclk_pol;
286186f8572SMark Yao struct vop_reg pin_pol;
2877130fbf6SSandy Huang struct vop_reg rgb_dclk_pol;
288186f8572SMark Yao struct vop_reg rgb_pin_pol;
2897130fbf6SSandy Huang struct vop_reg lvds_dclk_pol;
2907130fbf6SSandy Huang struct vop_reg lvds_pin_pol;
2917130fbf6SSandy Huang struct vop_reg hdmi_dclk_pol;
292186f8572SMark Yao struct vop_reg hdmi_pin_pol;
2937130fbf6SSandy Huang struct vop_reg edp_dclk_pol;
294186f8572SMark Yao struct vop_reg edp_pin_pol;
2957130fbf6SSandy Huang struct vop_reg mipi_dclk_pol;
296186f8572SMark Yao struct vop_reg mipi_pin_pol;
2977130fbf6SSandy Huang struct vop_reg dp_dclk_pol;
298186f8572SMark Yao struct vop_reg dp_pin_pol;
299186f8572SMark Yao
300186f8572SMark Yao struct vop_reg dither_up;
301186f8572SMark Yao struct vop_reg dither_down;
302186f8572SMark Yao
30309b01f9eSAlgea Cao struct vop_reg sw_dac_sel;
30409b01f9eSAlgea Cao struct vop_reg tve_sw_mode;
30509b01f9eSAlgea Cao struct vop_reg tve_dclk_pol;
30609b01f9eSAlgea Cao struct vop_reg tve_dclk_en;
30709b01f9eSAlgea Cao struct vop_reg sw_genlock;
30809b01f9eSAlgea Cao struct vop_reg sw_uv_offset_en;
30909b01f9eSAlgea Cao
310186f8572SMark Yao struct vop_reg dsp_out_yuv;
311186f8572SMark Yao struct vop_reg dsp_data_swap;
31232328971SDamon Ding struct vop_reg dsp_bg_swap;
31332328971SDamon Ding struct vop_reg dsp_rb_swap;
31432328971SDamon Ding struct vop_reg dsp_rg_swap;
31532328971SDamon Ding struct vop_reg dsp_delta_swap;
31632328971SDamon Ding struct vop_reg dsp_dummy_swap;
3170c4bb35cSDamon Ding struct vop_reg yuv_clip;
318186f8572SMark Yao struct vop_reg dsp_ccir656_avg;
319186f8572SMark Yao struct vop_reg dsp_black;
320186f8572SMark Yao struct vop_reg dsp_blank;
321186f8572SMark Yao struct vop_reg dsp_outzero;
322186f8572SMark Yao struct vop_reg dsp_lut_en;
323186f8572SMark Yao struct vop_reg update_gamma_lut;
324186f8572SMark Yao
325186f8572SMark Yao struct vop_reg out_mode;
326186f8572SMark Yao
327186f8572SMark Yao struct vop_reg xmirror;
328186f8572SMark Yao struct vop_reg ymirror;
329186f8572SMark Yao struct vop_reg dsp_background;
330186f8572SMark Yao
3317130fbf6SSandy Huang /* CABC */
3327130fbf6SSandy Huang struct vop_reg cabc_total_num;
3337130fbf6SSandy Huang struct vop_reg cabc_config_mode;
3347130fbf6SSandy Huang struct vop_reg cabc_stage_up_mode;
3357130fbf6SSandy Huang struct vop_reg cabc_scale_cfg_value;
3367130fbf6SSandy Huang struct vop_reg cabc_scale_cfg_enable;
3377130fbf6SSandy Huang struct vop_reg cabc_global_dn_limit_en;
3387130fbf6SSandy Huang struct vop_reg cabc_lut_en;
3397130fbf6SSandy Huang struct vop_reg cabc_en;
3407130fbf6SSandy Huang struct vop_reg cabc_handle_en;
3417130fbf6SSandy Huang struct vop_reg cabc_stage_up;
3427130fbf6SSandy Huang struct vop_reg cabc_stage_down;
3437130fbf6SSandy Huang struct vop_reg cabc_global_dn;
3447130fbf6SSandy Huang struct vop_reg cabc_calc_pixel_num;
3457130fbf6SSandy Huang
3462b34f307SMark Yao struct vop_reg win_gate[4];
3472b34f307SMark Yao struct vop_reg win_channel[4];
3482b34f307SMark Yao
3497130fbf6SSandy Huang /* BCSH */
3507130fbf6SSandy Huang struct vop_reg bcsh_brightness;
3517130fbf6SSandy Huang struct vop_reg bcsh_contrast;
3527130fbf6SSandy Huang struct vop_reg bcsh_sat_con;
3537130fbf6SSandy Huang struct vop_reg bcsh_sin_hue;
3547130fbf6SSandy Huang struct vop_reg bcsh_cos_hue;
3557130fbf6SSandy Huang struct vop_reg bcsh_r2y_csc_mode;
3567130fbf6SSandy Huang struct vop_reg bcsh_r2y_en;
3577130fbf6SSandy Huang struct vop_reg bcsh_y2r_csc_mode;
3587130fbf6SSandy Huang struct vop_reg bcsh_y2r_en;
3597130fbf6SSandy Huang struct vop_reg bcsh_color_bar;
3607130fbf6SSandy Huang struct vop_reg bcsh_out_mode;
3617130fbf6SSandy Huang struct vop_reg bcsh_en;
362b0dbe9a0SSandy Huang struct vop_reg reg_done_frm;
3637130fbf6SSandy Huang
3647130fbf6SSandy Huang /* MCU OUTPUT */
3657130fbf6SSandy Huang struct vop_reg mcu_pix_total;
3667130fbf6SSandy Huang struct vop_reg mcu_cs_pst;
3677130fbf6SSandy Huang struct vop_reg mcu_cs_pend;
3687130fbf6SSandy Huang struct vop_reg mcu_rw_pst;
3697130fbf6SSandy Huang struct vop_reg mcu_rw_pend;
3707130fbf6SSandy Huang struct vop_reg mcu_clk_sel;
3717130fbf6SSandy Huang struct vop_reg mcu_hold_mode;
3727130fbf6SSandy Huang struct vop_reg mcu_frame_st;
3737130fbf6SSandy Huang struct vop_reg mcu_rs;
3747130fbf6SSandy Huang struct vop_reg mcu_bypass;
3757130fbf6SSandy Huang struct vop_reg mcu_type;
3767130fbf6SSandy Huang struct vop_reg mcu_rw_bypass_port;
377*b899f9ccSChaoyi Chen struct vop_reg mcu_force_rdn;
3787130fbf6SSandy Huang
37954f7137bSDamon Ding /* bt1120 */
38072f233a9SDamon Ding struct vop_reg bt1120_uv_swap;
38154f7137bSDamon Ding struct vop_reg bt1120_yc_swap;
38254f7137bSDamon Ding struct vop_reg bt1120_en;
38354f7137bSDamon Ding
38454f7137bSDamon Ding /* bt656 */
38554f7137bSDamon Ding struct vop_reg bt656_en;
3862b34f307SMark Yao
387186f8572SMark Yao struct vop_reg cfg_done;
38872f233a9SDamon Ding
38972f233a9SDamon Ding /* ebc vop */
39072f233a9SDamon Ding struct vop_reg enable;
39172f233a9SDamon Ding struct vop_reg inf_out_en;
39272f233a9SDamon Ding struct vop_reg out_dresetn;
393186f8572SMark Yao };
394186f8572SMark Yao
395186f8572SMark Yao struct vop_scl_extension {
396186f8572SMark Yao struct vop_reg cbcr_vsd_mode;
397186f8572SMark Yao struct vop_reg cbcr_vsu_mode;
398186f8572SMark Yao struct vop_reg cbcr_hsd_mode;
399186f8572SMark Yao struct vop_reg cbcr_ver_scl_mode;
400186f8572SMark Yao struct vop_reg cbcr_hor_scl_mode;
401186f8572SMark Yao struct vop_reg yrgb_vsd_mode;
402186f8572SMark Yao struct vop_reg yrgb_vsu_mode;
403186f8572SMark Yao struct vop_reg yrgb_hsd_mode;
404186f8572SMark Yao struct vop_reg yrgb_ver_scl_mode;
405186f8572SMark Yao struct vop_reg yrgb_hor_scl_mode;
406186f8572SMark Yao struct vop_reg line_load_mode;
407186f8572SMark Yao struct vop_reg cbcr_axi_gather_num;
408186f8572SMark Yao struct vop_reg yrgb_axi_gather_num;
409186f8572SMark Yao struct vop_reg vsd_cbcr_gt2;
410186f8572SMark Yao struct vop_reg vsd_cbcr_gt4;
411186f8572SMark Yao struct vop_reg vsd_yrgb_gt2;
412186f8572SMark Yao struct vop_reg vsd_yrgb_gt4;
413186f8572SMark Yao struct vop_reg bic_coe_sel;
414186f8572SMark Yao struct vop_reg cbcr_axi_gather_en;
415186f8572SMark Yao struct vop_reg yrgb_axi_gather_en;
416186f8572SMark Yao struct vop_reg lb_mode;
417186f8572SMark Yao };
418186f8572SMark Yao
419186f8572SMark Yao struct vop_scl_regs {
420186f8572SMark Yao const struct vop_scl_extension *ext;
421186f8572SMark Yao
422186f8572SMark Yao struct vop_reg scale_yrgb_x;
423186f8572SMark Yao struct vop_reg scale_yrgb_y;
424186f8572SMark Yao struct vop_reg scale_cbcr_x;
425186f8572SMark Yao struct vop_reg scale_cbcr_y;
426186f8572SMark Yao };
427186f8572SMark Yao
428186f8572SMark Yao struct vop_win {
429186f8572SMark Yao const struct vop_scl_regs *scl;
430186f8572SMark Yao
431a144d23dSAndy Yan struct vop_reg gate;
432186f8572SMark Yao struct vop_reg enable;
433186f8572SMark Yao struct vop_reg format;
43454f7137bSDamon Ding struct vop_reg interlace_read;
435186f8572SMark Yao struct vop_reg ymirror;
436186f8572SMark Yao struct vop_reg rb_swap;
437186f8572SMark Yao struct vop_reg act_info;
438186f8572SMark Yao struct vop_reg dsp_info;
439186f8572SMark Yao struct vop_reg dsp_st;
440186f8572SMark Yao struct vop_reg yrgb_mst;
441186f8572SMark Yao struct vop_reg uv_mst;
442186f8572SMark Yao struct vop_reg yrgb_vir;
443186f8572SMark Yao struct vop_reg uv_vir;
444186f8572SMark Yao struct vop_reg alpha_mode;
445186f8572SMark Yao struct vop_reg alpha_en;
446186f8572SMark Yao
447186f8572SMark Yao struct vop_reg dst_alpha_ctl;
448186f8572SMark Yao struct vop_reg src_alpha_ctl;
449186f8572SMark Yao };
450186f8572SMark Yao
451186f8572SMark Yao struct vop_line_flag {
452186f8572SMark Yao struct vop_reg line_flag_num[2];
453186f8572SMark Yao };
454186f8572SMark Yao
4553a06149eSSandy Huang struct vop_grf_ctrl {
4563a06149eSSandy Huang struct vop_reg grf_dclk_inv;
45772f233a9SDamon Ding struct vop_reg grf_vopl_sel;
45872f233a9SDamon Ding struct vop_reg grf_edp_ch_sel;
45972f233a9SDamon Ding struct vop_reg grf_hdmi_ch_sel;
46072f233a9SDamon Ding struct vop_reg grf_mipi_ch_sel;
46172f233a9SDamon Ding struct vop_reg grf_hdmi_pin_pol;
46272f233a9SDamon Ding struct vop_reg grf_hdmi_1to4_en;
46372f233a9SDamon Ding struct vop_reg grf_mipi_mode;
46472f233a9SDamon Ding struct vop_reg grf_mipi_pin_pol;
46572f233a9SDamon Ding struct vop_reg grf_mipi_1to4_en;
4663a06149eSSandy Huang };
4673a06149eSSandy Huang
468b7618fd3SSandy Huang struct vop_csc_table {
469b7618fd3SSandy Huang const uint32_t *r2y_bt601;
470b7618fd3SSandy Huang const uint32_t *r2y_bt601_12_235;
471b7618fd3SSandy Huang const uint32_t *r2y_bt709;
472b7618fd3SSandy Huang const uint32_t *r2y_bt2020;
473b7618fd3SSandy Huang };
474b7618fd3SSandy Huang
475b7618fd3SSandy Huang struct vop_csc {
476b7618fd3SSandy Huang struct vop_reg y2r_en;
477b7618fd3SSandy Huang struct vop_reg r2r_en;
478b7618fd3SSandy Huang struct vop_reg r2y_en;
479b7618fd3SSandy Huang
480b7618fd3SSandy Huang uint32_t y2r_offset;
481b7618fd3SSandy Huang uint32_t r2r_offset;
482b7618fd3SSandy Huang uint32_t r2y_offset;
483b7618fd3SSandy Huang };
484b7618fd3SSandy Huang
485186f8572SMark Yao #define VOP_FEATURE_OUTPUT_10BIT BIT(0)
486186f8572SMark Yao
487186f8572SMark Yao struct vop_data {
488186f8572SMark Yao uint32_t version;
489186f8572SMark Yao const struct vop_ctrl *ctrl;
490186f8572SMark Yao const struct vop_win *win;
491186f8572SMark Yao const struct vop_line_flag *line_flag;
4923a06149eSSandy Huang const struct vop_grf_ctrl *grf_ctrl;
49372f233a9SDamon Ding const struct vop_grf_ctrl *vo0_grf_ctrl;
494b7618fd3SSandy Huang const struct vop_csc_table *csc_table;
495b7618fd3SSandy Huang const struct vop_csc *win_csc;
496186f8572SMark Yao int win_offset;
497186f8572SMark Yao int reg_len;
498186f8572SMark Yao u64 feature;
4992735489aSSandy Huang struct vop_rect max_output;
500186f8572SMark Yao };
501186f8572SMark Yao
502186f8572SMark Yao struct vop {
503186f8572SMark Yao u32 *regsbak;
504186f8572SMark Yao void *regs;
505fc8b0d66SDamon Ding void *grf_ctrl;
50672f233a9SDamon Ding void *vo0_grf_ctrl;
507186f8572SMark Yao
508186f8572SMark Yao uint32_t version;
509186f8572SMark Yao const struct vop_ctrl *ctrl;
510186f8572SMark Yao const struct vop_win *win;
511186f8572SMark Yao const struct vop_line_flag *line_flag;
512b7618fd3SSandy Huang const struct vop_csc_table *csc_table;
513b7618fd3SSandy Huang const struct vop_csc *win_csc;
514fc8b0d66SDamon Ding const struct vop_data *data;
515186f8572SMark Yao int win_offset;
5166b898587SDamon Ding
5176b898587SDamon Ding struct gpio_desc mcu_rs_gpio;
518186f8572SMark Yao };
519186f8572SMark Yao
vop_writel(struct vop * vop,uint32_t offset,uint32_t v)520186f8572SMark Yao static inline void vop_writel(struct vop *vop, uint32_t offset, uint32_t v)
521186f8572SMark Yao {
522186f8572SMark Yao writel(v, vop->regs + offset);
523186f8572SMark Yao vop->regsbak[offset >> 2] = v;
524186f8572SMark Yao }
525186f8572SMark Yao
vop_readl(struct vop * vop,uint32_t offset)526186f8572SMark Yao static inline uint32_t vop_readl(struct vop *vop, uint32_t offset)
527186f8572SMark Yao {
528186f8572SMark Yao return readl(vop->regs + offset);
529186f8572SMark Yao }
530186f8572SMark Yao
vop_read_reg(struct vop * vop,uint32_t base,const struct vop_reg * reg)531186f8572SMark Yao static inline uint32_t vop_read_reg(struct vop *vop, uint32_t base,
532186f8572SMark Yao const struct vop_reg *reg)
533186f8572SMark Yao {
534186f8572SMark Yao return (vop_readl(vop, base + reg->offset) >> reg->shift) & reg->mask;
535186f8572SMark Yao }
536186f8572SMark Yao
vop_mask_write(struct vop * vop,uint32_t offset,uint32_t mask,uint32_t shift,uint32_t v,bool write_mask)537186f8572SMark Yao static inline void vop_mask_write(struct vop *vop, uint32_t offset,
538186f8572SMark Yao uint32_t mask, uint32_t shift, uint32_t v,
539186f8572SMark Yao bool write_mask)
540186f8572SMark Yao {
541186f8572SMark Yao if (!mask)
542186f8572SMark Yao return;
543186f8572SMark Yao
544186f8572SMark Yao if (write_mask) {
545186f8572SMark Yao v = ((v & mask) << shift) | (mask << (shift + 16));
546186f8572SMark Yao } else {
547186f8572SMark Yao uint32_t cached_val = vop->regsbak[offset >> 2];
548186f8572SMark Yao
549186f8572SMark Yao v = (cached_val & ~(mask << shift)) | ((v & mask) << shift);
550186f8572SMark Yao vop->regsbak[offset >> 2] = v;
551186f8572SMark Yao }
552186f8572SMark Yao
553186f8572SMark Yao writel(v, vop->regs + offset);
554186f8572SMark Yao }
555186f8572SMark Yao
vop_cfg_done(struct vop * vop)556186f8572SMark Yao static inline void vop_cfg_done(struct vop *vop)
557186f8572SMark Yao {
558186f8572SMark Yao VOP_CTRL_SET(vop, cfg_done, 1);
559186f8572SMark Yao }
560186f8572SMark Yao
vop_grf_writel(void * regmap,struct vop_reg reg,u32 v)561fc8b0d66SDamon Ding static inline void vop_grf_writel(void *regmap, struct vop_reg reg, u32 v)
5623a06149eSSandy Huang {
5633a06149eSSandy Huang u32 val = 0;
5643a06149eSSandy Huang
565fc8b0d66SDamon Ding if (reg.mask) {
5663a06149eSSandy Huang val = (v << reg.shift) | (reg.mask << (reg.shift + 16));
567fc8b0d66SDamon Ding writel(val, regmap + reg.offset);
5683a06149eSSandy Huang }
5693a06149eSSandy Huang }
5703a06149eSSandy Huang
571186f8572SMark Yao /**
572186f8572SMark Yao * drm_format_horz_chroma_subsampling - get the horizontal chroma subsampling factor
573186f8572SMark Yao * @format: pixel format (DRM_FORMAT_*)
574186f8572SMark Yao *
575186f8572SMark Yao * Returns:
576186f8572SMark Yao * The horizontal chroma subsampling factor for the
577186f8572SMark Yao * specified pixel format.
578186f8572SMark Yao */
drm_format_horz_chroma_subsampling(uint32_t format)579186f8572SMark Yao static inline int drm_format_horz_chroma_subsampling(uint32_t format)
580186f8572SMark Yao {
581186f8572SMark Yao /* uboot only support RGB format */
582186f8572SMark Yao return 1;
583186f8572SMark Yao }
584186f8572SMark Yao
585186f8572SMark Yao /**
586186f8572SMark Yao * drm_format_vert_chroma_subsampling - get the vertical chroma subsampling factor
587186f8572SMark Yao * @format: pixel format (DRM_FORMAT_*)
588186f8572SMark Yao *
589186f8572SMark Yao * Returns:
590186f8572SMark Yao * The vertical chroma subsampling factor for the
591186f8572SMark Yao * specified pixel format.
592186f8572SMark Yao */
drm_format_vert_chroma_subsampling(uint32_t format)593186f8572SMark Yao static inline int drm_format_vert_chroma_subsampling(uint32_t format)
594186f8572SMark Yao {
595186f8572SMark Yao /* uboot only support RGB format */
596186f8572SMark Yao return 1;
597186f8572SMark Yao }
598186f8572SMark Yao
599186f8572SMark Yao #endif
600