coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
mdss.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <device/mmio.h>
4 #include <console/console.h>
5 #include <edid.h>
6 #include <soc/display/mdssreg.h>
7 
8 #define MDSS_MDP_MAX_PREFILL_FETCH 24
9 
10 static void mdss_source_pipe_config(struct edid *edid)
11 {
12  uint32_t img_size, out_size, stride;
13  uint32_t fb_off = 0;
14  uint32_t flip_bits = 0;
15  uint32_t src_xy = 0;
16  uint32_t dst_xy = 0;
17 
18  /* write active region size*/
19  img_size = (edid->mode.va << 16) | edid->mode.ha;
20  out_size = img_size;
21  stride = (edid->mode.ha * edid->framebuffer_bits_per_pixel/8);
22 
23  if (!fb_off) { /* left */
24  dst_xy = (edid->mode.vborder << 16) | edid->mode.hborder;
25  src_xy = dst_xy;
26  } else { /* right */
27  dst_xy = (edid->mode.vborder << 16);
28  src_xy = (edid->mode.vborder << 16) | fb_off;
29  }
30 
31  printk(BIOS_INFO, "%s: src=%x fb_off=%x src_xy=%x dst_xy=%x\n",
32  __func__, out_size, fb_off, src_xy, dst_xy);
33 
35  write32(&mdp_sspp->sspp_src_size, out_size);
36  write32(&mdp_sspp->sspp_out_size, out_size);
37  write32(&mdp_sspp->sspp_src_xy, src_xy);
38  write32(&mdp_sspp->sspp_out_xy, dst_xy);
39 
40  /* Tight Packing 4bpp Alpha 8-bit A R B G */
41  write32(&mdp_sspp->sspp_src_format, 0x000236ff);
43 
44  flip_bits |= BIT(31);
48  write32(&mdp_sspp->sspp_src_op_mode, flip_bits);
49 }
50 
51 static void mdss_vbif_setup(void)
52 {
55 }
56 
57 static void mdss_intf_tg_setup(struct edid *edid)
58 {
59  uint32_t hsync_period, vsync_period;
60  uint32_t hsync_start_x, hsync_end_x;
61  uint32_t display_hctl, hsync_ctl, display_vstart, display_vend;
62 
63  hsync_period = edid->mode.ha + edid->mode.hbl;
64  vsync_period = edid->mode.va + edid->mode.vbl;
65  hsync_start_x = edid->mode.hbl - edid->mode.hso;
66  hsync_end_x = hsync_period - edid->mode.hso - 1;
67  display_vstart = (edid->mode.vbl - edid->mode.vso) * hsync_period;
68  display_vend = ((vsync_period - edid->mode.vso) * hsync_period) - 1;
69  hsync_ctl = (hsync_period << 16) | edid->mode.hspw;
70  display_hctl = (hsync_end_x << 16) | hsync_start_x;
71 
72  write32(&mdp_intf->intf_hsync_ctl, hsync_ctl);
74  vsync_period * hsync_period);
76  edid->mode.vspw * hsync_period);
77  write32(&mdp_intf->intf_disp_hctl, display_hctl);
78  write32(&mdp_intf->intf_disp_v_start_f0, display_vstart);
79  write32(&mdp_intf->intf_disp_v_end_f0, display_vend);
82 }
83 
85 {
86  uint32_t v_total, h_total, fetch_start, vfp_start;
87  uint32_t prefetch_avail, prefetch_needed;
88  uint32_t fetch_enable = BIT(31);
89 
90  /*
91  * MDP programmable fetch is for MDP with rev >= 1.05.
92  * Programmable fetch is not needed if vertical back porch
93  * plus vertical pulse width plus extra line for the extra h_total
94  * added during fetch start is >= 24.
95  */
97  return;
98 
99  /*
100  * Fetch should always be outside the active lines. If the fetching
101  * is programmed within active region, hardware behavior is unknown.
102  */
103  v_total = edid->mode.va + edid->mode.vbl;
104  h_total = edid->mode.ha + edid->mode.hbl;
105  vfp_start = edid->mode.va + edid->mode.vbl - edid->mode.vso;
106  prefetch_avail = v_total - vfp_start;
107  prefetch_needed = MDSS_MDP_MAX_PREFILL_FETCH - edid->mode.vbl + edid->mode.vso;
108 
109  /*
110  * In some cases, vertical front porch is too high. In such cases limit
111  * the mdp fetch lines as the last (25 - vbp - vpw) lines of
112  * vertical front porch.
113  */
114  if (prefetch_avail > prefetch_needed)
115  prefetch_avail = prefetch_needed;
116 
117  fetch_start = (v_total - prefetch_avail) * h_total + h_total + 1;
118  write32(&mdp_intf->intf_prof_fetch_start, fetch_start);
119  write32(&mdp_intf->intf_config, fetch_enable);
120 }
121 
122 static void mdss_layer_mixer_setup(struct edid *edid)
123 {
124  uint32_t mdp_rgb_size;
125  uint32_t left_staging_level;
126 
127  /* write active region size*/
128  mdp_rgb_size = (edid->mode.va << 16) | edid->mode.ha;
129 
130  write32(&mdp_layer_mixer->layer_out_size, mdp_rgb_size);
132  for (int i = 0; i < 6; i++) {
135  }
136 
137  /* Enable border fill */
138  left_staging_level = BIT(24);
139  left_staging_level |= BIT(1);
140 
141  /* Base layer for layer mixer 0 */
142  write32(&mdp_ctl->ctl_layer0, left_staging_level);
143 }
144 
146 {
147  /*
148  * VBIF remapper registers are used for translating internal display hardware
149  * priority level (from 0 to 7) into system fabric priority level.
150  * These remapper settings are defined for all the clients which corresponds
151  * to the xin clients connected to SSPP on VBIF.
152  */
165 }
166 
168 {
171  mdss_vbif_setup();
175 
176  /* Select Video Mode Interface */
177  write32(&mdp_ctl->ctl_top, 0x0);
178 
179  /* PPB0 to INTF1 */
181  write32(&mdp_intf->intf_mux, 0x0F0000);
182 }
183 
185 {
186  uint32_t ctl0_reg_val;
187 
188  ctl0_reg_val = VIG_0 | LAYER_MIXER_0 | CTL | INTF;
190  write32(&mdp_ctl->ctl_flush, ctl0_reg_val);
191 }
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
#define printk(level,...)
Definition: stdlib.h:16
#define BIT(nr)
Definition: ec_commands.h:45
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
void mdp_dsi_video_config(struct edid *edid)
Definition: mdss.c:167
static void mdss_vbif_setup(void)
Definition: mdss.c:51
static void mdss_intf_fetch_start_config(struct edid *edid)
Definition: mdss.c:84
static void mdss_vbif_qos_remapper_setup(void)
Definition: mdss.c:145
void mdp_dsi_video_on(void)
Definition: mdss.c:184
#define MDSS_MDP_MAX_PREFILL_FETCH
Definition: mdss.c:8
static void mdss_source_pipe_config(struct edid *edid)
Definition: mdss.c:10
static void mdss_intf_tg_setup(struct edid *edid)
Definition: mdss.c:57
static void mdss_layer_mixer_setup(struct edid *edid)
Definition: mdss.c:122
@ CTL
Definition: mdssreg.h:364
@ VIG_0
Definition: mdssreg.h:381
@ INTF
Definition: mdssreg.h:351
@ LAYER_MIXER_0
Definition: mdssreg.h:375
static struct vbif_rt_regs *const vbif_rt
Definition: mdssreg.h:458
static struct mdp_layer_mixer_regs *const mdp_layer_mixer
Definition: mdssreg.h:456
static struct mdp_ctl_regs *const mdp_ctl
Definition: mdssreg.h:455
static struct mdp_intf_regs *const mdp_intf
Definition: mdssreg.h:454
static struct mdp_sspp_regs *const mdp_sspp
Definition: mdssreg.h:457
unsigned int uint32_t
Definition: stdint.h:14
unsigned int hbl
Definition: edid.h:26
unsigned int va
Definition: edid.h:30
unsigned int vspw
Definition: edid.h:33
unsigned int ha
Definition: edid.h:25
unsigned int hborder
Definition: edid.h:29
unsigned int vso
Definition: edid.h:32
unsigned int hso
Definition: edid.h:27
unsigned int hspw
Definition: edid.h:28
unsigned int vbl
Definition: edid.h:31
unsigned int vborder
Definition: edid.h:34
Definition: edid.h:49
unsigned int framebuffer_bits_per_pixel
Definition: edid.h:58
struct edid_mode mode
Definition: edid.h:72
uint32_t ctl_intf_flush
Definition: mdssreg.h:260
uint32_t ctl_flush
Definition: mdssreg.h:255
uint32_t ctl_layer0
Definition: mdssreg.h:251
uint32_t ctl_top
Definition: mdssreg.h:254
uint32_t ctl_intf_active
Definition: mdssreg.h:258
uint32_t intf_disp_hctl
Definition: mdssreg.h:234
uint32_t intf_vysnc_pulse_width_f0
Definition: mdssreg.h:224
uint32_t intf_prof_fetch_start
Definition: mdssreg.h:241
uint32_t intf_disp_v_end_f0
Definition: mdssreg.h:228
uint32_t intf_vysnc_period_f0
Definition: mdssreg.h:222
uint32_t intf_disp_v_start_f0
Definition: mdssreg.h:226
uint32_t intf_underflow_color
Definition: mdssreg.h:237
uint32_t intf_config
Definition: mdssreg.h:220
uint32_t intf_mux
Definition: mdssreg.h:243
uint32_t intf_hsync_ctl
Definition: mdssreg.h:221
uint32_t intf_panel_format
Definition: mdssreg.h:239
uint32_t layer_blend_const_alpha
Definition: mdssreg.h:275
struct mdp_layer_mixer_regs::@1422 layer_blend[6]
uint32_t layer_op_mode
Definition: mdssreg.h:268
uint32_t layer_out_size
Definition: mdssreg.h:269
uint32_t layer_blend_op
Definition: mdssreg.h:274
uint32_t sspp_src_ystride0
Definition: mdssreg.h:293
uint32_t sspp_src_xy
Definition: mdssreg.h:286
uint32_t sspp_out_xy
Definition: mdssreg.h:288
uint32_t sspp_src_format
Definition: mdssreg.h:296
uint32_t sspp_out_size
Definition: mdssreg.h:287
uint32_t sspp_src_size
Definition: mdssreg.h:284
uint32_t sspp_sw_pic_ext_c3_req_pixels
Definition: mdssreg.h:304
uint32_t sspp_src_unpack_pattern
Definition: mdssreg.h:297
uint32_t sspp_src_op_mode
Definition: mdssreg.h:298
uint32_t sspp_sw_pic_ext_c1c2_req_pixels
Definition: mdssreg.h:302
uint32_t sspp_sw_pic_ext_c0_req_pixels
Definition: mdssreg.h:300
uint32_t vbif_out_axi_amemtype_conf0
Definition: mdssreg.h:313
uint32_t vbif_xinl_qos_rp_remap
Definition: mdssreg.h:317
uint32_t vbif_out_axi_amemtype_conf1
Definition: mdssreg.h:314
struct vbif_rt_regs::@1423 qos_rp_remap[8]
struct vbif_rt_regs::@1424 qos_lvl_remap[8]
uint32_t vbif_xinl_qos_lvl_remap
Definition: mdssreg.h:321