coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
vop.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <device/mmio.h>
4 #include <soc/addressmap.h>
5 #include <soc/clock.h>
6 #include <soc/edp.h>
7 #include <soc/vop.h>
8 
9 static struct rockchip_vop_regs * const vop_regs[] = {
12 };
13 
14 void rkvop_enable(u32 vop_id, u32 fbbase)
15 {
16  struct rockchip_vop_regs *preg = vop_regs[vop_id];
17 
18  write32(&preg->win0_yrgb_mst, fbbase);
19 
20  /* On RK3288, the reg_cfg_done[1:31] is reserved and read-only,
21  * but it's fine to write to it
22  */
23  write32(&preg->reg_cfg_done, 0xffff); /* enable reg config */
24 }
25 
26 void rkvop_prepare(u32 vop_id, const struct edid *edid)
27 {
28  u32 lb_mode;
29  u32 rgb_mode;
30  u32 hactive = edid->mode.ha;
31  u32 vactive = edid->mode.va;
32  u32 hsync_len = edid->mode.hspw;
33  u32 hback_porch = edid->mode.hbl - edid->mode.hso - edid->mode.hspw;
34  u32 vsync_len = edid->mode.vspw;
35  u32 vback_porch = edid->mode.vbl - edid->mode.vso - edid->mode.vspw;
36  u32 xpos = 0, ypos = 0;
37  struct rockchip_vop_regs *preg = vop_regs[vop_id];
38 
39  write32(&preg->win0_act_info,
40  V_ACT_WIDTH(hactive - 1) | V_ACT_HEIGHT(vactive - 1));
41 
42  write32(&preg->win0_dsp_st, V_DSP_XST(xpos + hsync_len + hback_porch) |
43  V_DSP_YST(ypos + vsync_len + vback_porch));
44 
45  write32(&preg->win0_dsp_info, V_DSP_WIDTH(hactive - 1) |
46  V_DSP_HEIGHT(vactive - 1));
47 
49  V_WIN0_KEY_EN(0) |
50  V_WIN0_KEY_COLOR(0));
51 
53  case 16:
54  rgb_mode = RGB565;
55  write32(&preg->win0_vir, V_RGB565_VIRWIDTH(hactive));
56  break;
57  case 24:
58  rgb_mode = RGB888;
59  write32(&preg->win0_vir, V_RGB888_VIRWIDTH(hactive));
60  break;
61  case 32:
62  default:
63  rgb_mode = ARGB8888;
64  write32(&preg->win0_vir, V_ARGB888_VIRWIDTH(hactive));
65  break;
66  }
67 
68  if (hactive > 2560)
69  lb_mode = LB_RGB_3840X2;
70  else if (hactive > 1920)
71  lb_mode = LB_RGB_2560X4;
72  else if (hactive > 1280)
73  lb_mode = LB_RGB_1920X5;
74  else
75  lb_mode = LB_RGB_1280X8;
76 
77  clrsetbits32(&preg->win0_ctrl0,
79  V_WIN0_LB_MODE(lb_mode) |
80  V_WIN0_DATA_FMT(rgb_mode) | V_WIN0_EN(1));
81 }
82 
83 void rkvop_mode_set(u32 vop_id, const struct edid *edid, u32 mode)
84 {
85  u32 hactive = edid->mode.ha;
86  u32 vactive = edid->mode.va;
87  u32 hfront_porch = edid->mode.hso;
88  u32 hsync_len = edid->mode.hspw;
89  u32 hback_porch = edid->mode.hbl - edid->mode.hso - edid->mode.hspw;
90  u32 vfront_porch = edid->mode.vso;
91  u32 vsync_len = edid->mode.vspw;
92  u32 vback_porch = edid->mode.vbl - edid->mode.vso - edid->mode.vspw;
93  u32 dsp_out_mode;
94  struct rockchip_vop_regs *preg = vop_regs[vop_id];
95 
96  switch (mode) {
97 
98  case VOP_MODE_HDMI:
99  clrsetbits32(&preg->sys_ctrl,
101  dsp_out_mode = 15;
102  break;
103  case VOP_MODE_MIPI:
105  V_MIPI_OUT_EN(1));
106  dsp_out_mode = 0;
107  break;
108  case VOP_MODE_DUAL_MIPI:
110  V_MIPI_OUT_EN(1) | V_DUAL_MIPI_EN(1));
111  dsp_out_mode = 0;
112  break;
113  case VOP_MODE_EDP:
114  default:
115  clrsetbits32(&preg->sys_ctrl,
117  dsp_out_mode = 15;
118  break;
119  }
120 
121  clrsetbits32(&preg->dsp_ctrl0,
124  V_DSP_OUT_MODE(dsp_out_mode) |
125  V_DSP_HSYNC_POL(edid->mode.phsync == '+') |
126  V_DSP_VSYNC_POL(edid->mode.pvsync == '+'));
127 
128  write32(&preg->dsp_htotal_hs_end, V_HSYNC(hsync_len) |
129  V_HORPRD(hsync_len + hback_porch + hactive + hfront_porch));
130 
131  write32(&preg->dsp_hact_st_end,
132  V_HEAP(hsync_len + hback_porch + hactive) |
133  V_HASP(hsync_len + hback_porch));
134 
135  write32(&preg->dsp_vtotal_vs_end, V_VSYNC(vsync_len) |
136  V_VERPRD(vsync_len + vback_porch + vactive + vfront_porch));
137 
138  write32(&preg->dsp_vact_st_end,
139  V_VAEP(vsync_len + vback_porch + vactive) |
140  V_VASP(vsync_len + vback_porch));
141 
143  V_HEAP(hsync_len + hback_porch + hactive) |
144  V_HASP(hsync_len + hback_porch));
145 
147  V_VAEP(vsync_len + vback_porch + vactive) |
148  V_VASP(vsync_len + vback_porch));
149 
150  /* On RK3288, the reg_cfg_done[1:31] is reserved and read-only,
151  * but it's fine to write to it
152  */
153  write32(&preg->reg_cfg_done, 0xffff); /* enable reg config */
154 }
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
#define clrsetbits32(addr, clear, set)
Definition: mmio.h:16
#define VOP_BIG_BASE
Definition: addressmap.h:68
#define VOP_LIT_BASE
Definition: addressmap.h:69
uint32_t u32
Definition: stdint.h:51
unsigned int hbl
Definition: edid.h:26
unsigned int va
Definition: edid.h:30
unsigned int vspw
Definition: edid.h:33
unsigned char phsync
Definition: edid.h:35
unsigned int ha
Definition: edid.h:25
unsigned int vso
Definition: edid.h:32
unsigned int hso
Definition: edid.h:27
unsigned char pvsync
Definition: edid.h:36
unsigned int hspw
Definition: edid.h:28
unsigned int vbl
Definition: edid.h:31
Definition: edid.h:49
unsigned int framebuffer_bits_per_pixel
Definition: edid.h:58
struct edid_mode mode
Definition: edid.h:72
u32 win0_yrgb_mst
Definition: vop.h:37
u32 win0_dsp_info
Definition: vop.h:40
u32 win0_ctrl0
Definition: vop.h:33
u32 dsp_htotal_hs_end
Definition: vop.h:78
u32 dsp_hact_st_end
Definition: vop.h:79
u32 win0_dsp_st
Definition: vop.h:41
u32 win0_color_key
Definition: vop.h:35
u32 post_dsp_hact_info
Definition: vop.h:72
u32 win0_act_info
Definition: vop.h:39
u32 win0_vir
Definition: vop.h:36
u32 sys_ctrl
Definition: vop.h:11
u32 reg_cfg_done
Definition: vop.h:9
u32 dsp_ctrl0
Definition: vop.h:13
u32 dsp_vtotal_vs_end
Definition: vop.h:80
u32 dsp_vact_st_end
Definition: vop.h:81
u32 post_dsp_vact_info
Definition: vop.h:73
void rkvop_mode_set(u32 vop_id, const struct edid *edid, u32 mode)
Definition: vop.c:83
void rkvop_prepare(u32 vop_id, const struct edid *edid)
Definition: vop.c:26
static struct rockchip_vop_regs *const vop_regs[]
Definition: vop.c:9
void rkvop_enable(u32 vop_id, u32 fbbase)
Definition: vop.c:14
#define V_MIPI_OUT_EN(x)
Definition: vop.h:146
#define V_DSP_WIDTH(x)
Definition: vop.h:348
#define V_WIN0_KEY_COLOR(x)
Definition: vop.h:334
#define V_VASP(x)
Definition: vop.h:368
#define V_HDMI_OUT_EN(x)
Definition: vop.h:149
#define M_DSP_OUT_MODE
Definition: vop.h:197
#define V_DSP_OUT_MODE(x)
Definition: vop.h:219
#define V_HEAP(x)
Definition: vop.h:365
@ RGB565
Definition: vop.h:90
@ RGB888
Definition: vop.h:89
@ ARGB8888
Definition: vop.h:88
#define V_RGB888_VIRWIDTH(x)
Definition: vop.h:338
#define V_WIN0_EN(x)
Definition: vop.h:284
#define V_VAEP(x)
Definition: vop.h:367
@ VOP_MODE_HDMI
Definition: vop.h:108
@ VOP_MODE_DUAL_MIPI
Definition: vop.h:110
@ VOP_MODE_EDP
Definition: vop.h:107
@ VOP_MODE_MIPI
Definition: vop.h:109
#define M_WIN0_KEY_EN
Definition: vop.h:330
#define M_WIN0_EN
Definition: vop.h:268
#define M_WIN0_DATA_FMT
Definition: vop.h:267
#define M_DSP_VSYNC_POL
Definition: vop.h:195
#define V_DSP_XST(x)
Definition: vop.h:352
#define V_HORPRD(x)
Definition: vop.h:361
#define V_RGB565_VIRWIDTH(x)
Definition: vop.h:339
#define M_ALL_OUT_EN
Definition: vop.h:131
#define M_WIN0_LB_MODE
Definition: vop.h:265
#define V_DSP_HEIGHT(x)
Definition: vop.h:347
#define M_WIN0_KEY_COLOR
Definition: vop.h:331
#define V_ACT_WIDTH(x)
Definition: vop.h:344
#define V_ARGB888_VIRWIDTH(x)
Definition: vop.h:337
@ LB_RGB_1920X5
Definition: vop.h:98
@ LB_RGB_3840X2
Definition: vop.h:96
@ LB_RGB_1280X8
Definition: vop.h:99
@ LB_RGB_2560X4
Definition: vop.h:97
#define V_HASP(x)
Definition: vop.h:366
#define V_VERPRD(x)
Definition: vop.h:363
#define V_DSP_YST(x)
Definition: vop.h:351
#define V_DSP_HSYNC_POL(x)
Definition: vop.h:218
#define V_WIN0_KEY_EN(x)
Definition: vop.h:333
#define M_DSP_HSYNC_POL
Definition: vop.h:196
#define V_WIN0_DATA_FMT(x)
Definition: vop.h:283
#define V_ACT_HEIGHT(x)
Definition: vop.h:343
#define V_WIN0_LB_MODE(x)
Definition: vop.h:281
#define V_DSP_VSYNC_POL(x)
Definition: vop.h:217
#define V_DUAL_MIPI_EN(x)
Definition: vop.h:147
#define V_HSYNC(x)
Definition: vop.h:360
#define V_EDP_OUT_EN(x)
Definition: vop.h:148
#define V_VSYNC(x)
Definition: vop.h:362