coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
ddp.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 /*
4  * This file is created based on MT8186 Functional Specification
5  * Chapter number: 6.9
6  */
7 
8 #include <console/console.h>
9 #include <edid.h>
10 #include <soc/addressmap.h>
11 #include <soc/ddp.h>
12 
14 {
15  /*
16  * Main path:
17  * OVL0->RDMA0->COLOR0->CCORR0->AAL0->GAMMA->POSTMASK0->DITHER->DSI0
18  */
20  DISP_OVL0_MOUT_EN, DISP_OVL0_MOUT_TO_RDMA0);
22  DISP_RDMA0_SEL_IN, DISP_RDMA0_FROM_OVL0);
24  DISP_MMSYS_OVL0_CON, DISP_OVL0_GO_BLEND);
26  DISP_RDMA0_SOUT_SEL, DISP_RDMA0_SOUT_TO_COLOR0);
28  DISP_DITHER0_MOUT_EN, DISP_DITHER0_MOUT_TO_DSI0);
30  DISP_DSI0_SEL_IN, DISP_DSI0_FROM_DITHER0);
31 }
32 
33 static void disp_config_main_path_mutex(void)
34 {
36 
37  /* Clock source from DSI0 */
40  write32(&disp_mutex->mutex[0].en, BIT(0));
41 }
42 
43 static void ovl_layer_smi_id_en(u32 idx)
44 {
45  SET32_BITFIELDS(&disp_ovl[idx]->datapath_con,
46  SMI_ID_EN, SMI_ID_EN_VAL);
47 }
48 
50 {
51  struct disp_ccorr_regs *const regs = disp_ccorr;
52 
53  write32(&regs->size, width << 16 | height);
54 
55  /* Disable relay mode */
56  SET32_BITFIELDS(&regs->cfg, PQ_CFG_RELAY_MODE, 0);
57  SET32_BITFIELDS(&regs->cfg, PQ_CFG_ENGINE_EN, PQ_ENGINE_EN);
58 
59  write32(&regs->en, PQ_EN);
60 }
61 
62 static void aal_config(u32 width, u32 height)
63 {
64  struct disp_aal_regs *const regs = disp_aal;
65 
66  write32(&regs->size, width << 16 | height);
67  write32(&regs->output_size, width << 16 | height);
68 
69  /* Enable relay mode */
70  SET32_BITFIELDS(&regs->cfg, PQ_CFG_RELAY_MODE, PQ_RELAY_MODE);
71  SET32_BITFIELDS(&regs->cfg, PQ_CFG_ENGINE_EN, 0);
72 
73  write32(&regs->en, PQ_EN);
74 }
75 
77 {
78  struct disp_gamma_regs *const regs = disp_gamma;
79 
80  write32(&regs->size, width << 16 | height);
81 
82  /* Disable relay mode */
83  SET32_BITFIELDS(&regs->cfg, PQ_CFG_RELAY_MODE, 0);
84 
85  write32(&regs->en, PQ_EN);
86 }
87 
89 {
90  struct disp_postmask_regs *const regs = disp_postmask;
91 
92  write32(&regs->size, width << 16 | height);
93 
94  /* Enable relay mode */
95  SET32_BITFIELDS(&regs->cfg, PQ_CFG_RELAY_MODE, PQ_RELAY_MODE);
96 
97  write32(&regs->en, PQ_EN);
98 }
99 
101 {
102  struct disp_dither_regs *const regs = disp_dither;
103 
104  write32(&regs->size, width << 16 | height);
105 
106  /* Enable relay mode */
107  SET32_BITFIELDS(&regs->cfg, PQ_CFG_RELAY_MODE, PQ_RELAY_MODE);
108 
109  write32(&regs->en, PQ_EN);
110 }
111 
112 static void main_disp_path_setup(u32 width, u32 height, u32 vrefresh)
113 {
114  u32 pixel_clk = width * height * vrefresh;
115 
116  /* One ovl in main path */
117  ovl_set_roi(0, width, height, 0xff0000ff);
119  rdma_config(width, height, pixel_clk, 5 * KiB);
128 }
129 
130 static void disp_clock_on(void)
131 {
134 }
135 
136 void mtk_ddp_init(void)
137 {
138  disp_clock_on();
139 
140  /* Turn off M4U port */
142 }
143 
144 void mtk_ddp_mode_set(const struct edid *edid)
145 {
146  u32 fmt = OVL_INFMT_RGBA8888;
148  u32 width = edid->mode.ha;
149  u32 height = edid->mode.va;
150  u32 vrefresh = edid->mode.refresh;
151 
152  printk(BIOS_INFO, "%s: display resolution: %ux%u@%u bpp %u\n",
153  __func__, width, height, vrefresh, bpp);
154 
155  if (!vrefresh) {
156  vrefresh = 60;
157  printk(BIOS_INFO, "%s: invalid vrefresh; setting to %u\n",
158  __func__, vrefresh);
159  }
160 
161  main_disp_path_setup(width, height, vrefresh);
162  rdma_start();
163  ovl_layer_config(fmt, bpp, width, height);
164 }
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
static int width
Definition: bochs.c:42
#define KiB
Definition: helpers.h:75
void color_start(u32 width, u32 height)
Definition: ddp.c:47
void rdma_config(u32 width, u32 height, u32 pixel_clk, u32 fifo_size)
Definition: ddp.c:23
void ovl_set_roi(u32 idx, u32 width, u32 height, u32 color)
Definition: ddp.c:12
void rdma_start(void)
Definition: ddp.c:18
void ovl_layer_config(u32 fmt, u32 bpp, u32 width, u32 height)
Definition: ddp.c:56
#define printk(level,...)
Definition: stdlib.h:16
@ OVL_INFMT_RGBA8888
Definition: ddp_common.h:123
static struct disp_ovl_regs *const disp_ovl[2]
Definition: ddp_common.h:61
#define BIT(nr)
Definition: ec_commands.h:45
#define SET32_BITFIELDS(addr,...)
Definition: mmio.h:201
#define clrbits32(addr, clear)
Definition: mmio.h:26
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
void mtk_ddp_init(void)
Definition: ddp.c:61
void mtk_ddp_mode_set(const struct edid *edid)
Definition: ddp.c:66
@ MUTEX_MOD_MAIN_PATH
Definition: ddp.h:240
static struct disp_mutex_regs *const disp_mutex
Definition: ddp.h:231
static struct mmsys_cfg_regs *const mmsys_cfg
Definition: ddp.h:133
static struct disp_pq_regs *const disp_ccorr
Definition: ddp.h:168
static struct disp_pq_regs *const disp_aal
Definition: ddp.h:170
static struct disp_pq_regs *const disp_gamma
Definition: ddp.h:172
@ CG_CON0_DISP_ALL
Definition: ddp.h:65
static struct disp_pq_regs *const disp_dither
Definition: ddp.h:174
@ MUTEX_SOF_DSI0
Definition: ddp.h:147
static void ovl_layer_smi_id_en(u32 idx)
Definition: ddp.c:43
static void gamma_config(u32 width, u32 height)
Definition: ddp.c:76
static void dither_config(u32 width, u32 height)
Definition: ddp.c:100
static void main_disp_path_setup(u32 width, u32 height, u32 vrefresh)
Definition: ddp.c:112
static void aal_config(u32 width, u32 height)
Definition: ddp.c:62
static void postmask_config(u32 width, u32 height)
Definition: ddp.c:88
static void disp_config_main_path_connection(void)
Definition: ddp.c:13
static void disp_clock_on(void)
Definition: ddp.c:130
static void ccorr_config(u32 width, u32 height)
Definition: ddp.c:49
static void disp_config_main_path_mutex(void)
Definition: ddp.c:33
#define PQ_ENGINE_EN
Definition: ddp.h:247
#define DISP_OVL0_MOUT_TO_RDMA0
Definition: ddp.h:211
@ CG_CON2_DISP_ALL
Definition: ddp.h:195
#define SMI_LARB_PORT_L0_OVL_RDMA0
Definition: ddp.h:16
static struct disp_postmask_regs *const disp_postmask
Definition: ddp.h:254
#define DISP_RDMA0_SOUT_TO_COLOR0
Definition: ddp.h:214
#define SMI_ID_EN_VAL
Definition: ddp.h:218
#define DISP_OVL0_GO_BLEND
Definition: ddp.h:213
#define DISP_DSI0_FROM_DITHER0
Definition: ddp.h:216
#define DISP_RDMA0_FROM_OVL0
Definition: ddp.h:212
#define DISP_DITHER0_MOUT_TO_DSI0
Definition: ddp.h:215
#define PQ_RELAY_MODE
Definition: ddp.h:246
#define PQ_EN
Definition: ddp.h:245
@ SMI_LARB0
Definition: addressmap.h:62
uint32_t u32
Definition: stdint.h:51
struct disp_mutex_regs::@798 mutex[6]
unsigned int refresh
Definition: edid.h:24
unsigned int va
Definition: edid.h:30
unsigned int ha
Definition: edid.h:25
Definition: edid.h:49
unsigned int framebuffer_bits_per_pixel
Definition: edid.h:58
struct edid_mode mode
Definition: edid.h:72
u32 disp_rdma0_sel_in
Definition: ddp.h:42
u32 disp_dither0_mout_en
Definition: ddp.h:25
u32 mmsys_cg_con0
Definition: ddp.h:63
u32 mmsys_ovl_con
Definition: ddp.h:33
u32 disp_ovl0_mout_en
Definition: ddp.h:25
u32 mmsys_cg_con2
Definition: ddp.h:28
u32 disp_rdma0_sout_sel
Definition: ddp.h:35
u32 disp_dsi0_sel_in
Definition: ddp.h:44
#define height