coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
mainboard.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <bl31.h>
4 #include <bootmode.h>
5 #include <console/console.h>
6 #include <delay.h>
7 #include <device/device.h>
8 #include <device/mmio.h>
10 #include <edid.h>
11 #include <framebuffer_info.h>
12 #include <gpio.h>
13 #include <soc/ddp.h>
14 #include <soc/dpm.h>
15 #include <soc/dsi.h>
16 #include <soc/gpio.h>
17 #include <soc/gpio_common.h>
18 #include <soc/i2c.h>
19 #include <soc/msdc.h>
20 #include <soc/mtcmos.h>
21 #include <soc/regulator.h>
22 #include <soc/spm.h>
23 #include <soc/usb.h>
24 
25 #include "gpio.h"
26 
27 #include <arm-trusted-firmware/include/export/plat/mediatek/common/plat_params_exp.h>
28 
29 #define MSDC0_BASE 0x11f60000
30 #define MSDC0_TOP_BASE 0x11f50000
31 
32 #define MSDC0_DRV_MASK 0x3fffffff
33 #define MSDC1_DRV_MASK 0x3ffff000
34 #define MSDC0_DRV_VALUE 0x24924924
35 #define MSDC1_DRV_VALUE 0x1b6db000
36 
37 #define MSDC1_GPIO_MODE0_BASE 0x10005360
38 #define MSDC1_GPIO_MODE0_MASK 0x77777000
39 #define MSDC1_GPIO_MODE0_VALUE 0x11111000
40 
41 #define MSDC1_GPIO_MODE1_BASE 0x10005370
42 #define MSDC1_GPIO_MODE1_MASK 0x7
43 #define MSDC1_GPIO_MODE1_VALUE 0x1
44 
45 /* GPIO names */
46 #define GPIO_EDPBRDG_INT_ODL GPIO(EINT6) /* 6 */
47 #define GPIO_EDPBRDG_PWREN GPIO(DSI_TE) /* 41 */
48 #define GPIO_EDPBRDG_RST_ODL GPIO(LCM_RST) /* 42 */
49 #define GPIO_EN_PP3300_EDP_DX GPIO(PERIPHERAL_EN1) /* 127 */
50 #define GPIO_EN_PP1800_EDPBRDG_DX GPIO(PERIPHERAL_EN2) /* 128 */
51 #define GPIO_EN_PP1000_EDPBRDG GPIO(PERIPHERAL_EN3) /* 129 */
52 #define GPIO_EN_PP3300_DISPLAY_DX GPIO(CAM_CLK3) /* 136 */
53 #define GPIO_AP_EDP_BKLTEN GPIO(KPROW1) /* 152 */
54 #define GPIO_BL_PWM_1V8 GPIO(DISP_PWM) /* 40 */
55 
56 static void register_reset_to_bl31(void)
57 {
58  static struct bl_aux_param_gpio param_reset = {
59  .h = { .type = BL_AUX_PARAM_MTK_RESET_GPIO },
60  .gpio = { .polarity = ARM_TF_GPIO_LEVEL_HIGH },
61  };
62 
63  param_reset.gpio.index = GPIO_RESET.id;
64  register_bl31_aux_param(&param_reset.h);
65 }
66 
67 /* Override hs_da_trail for ANX7625 */
69 {
70  timing->da_hs_trail += 9;
71 }
72 
73 /* Set up backlight control pins as output pin and power-off by default */
75 {
76  /* Disable backlight before turning on bridge */
80 
81  /* Turn on bridge */
86  mdelay(14);
88  mdelay(10);
90 }
91 
92 static bool configure_display(void)
93 {
94  struct edid edid;
95  const u8 i2c_bus = 3;
96 
97  printk(BIOS_INFO, "%s: Starting display init\n", __func__);
98 
101 
102  if (anx7625_init(i2c_bus)) {
103  printk(BIOS_ERR, "%s: Can't init ANX7625 bridge\n", __func__);
104  return false;
105  }
106 
108  printk(BIOS_ERR, "%s: Can't get panel's edid\n", __func__);
109  return false;
110  }
111 
112  const char *name = edid.ascii_string;
113  if (name[0] == '\0')
114  name = "unknown name";
115  printk(BIOS_INFO, "%s: '%s %s' %dx%d@%dHz\n", __func__,
117  edid.mode.refresh);
118 
121 
123  mtk_ddp_init();
124  u32 mipi_dsi_flags = (MIPI_DSI_MODE_VIDEO |
129 
130  if (mtk_dsi_init(mipi_dsi_flags, MIPI_DSI_FMT_RGB888, 4, &edid, NULL) < 0) {
131  printk(BIOS_ERR, "%s: Failed in DSI init\n", __func__);
132  return false;
133  }
134 
135  if (anx7625_dp_start(i2c_bus, &edid) < 0) {
136  printk(BIOS_ERR, "%s: Can't start display via ANX7625\n", __func__);
137  return false;
138  }
139 
142  return true;
143 }
144 
145 static void configure_audio(void)
146 {
147  /* Audio PWR */
149 
150  /* SoC I2S */
151  gpio_set_mode(GPIO(I2S3_MCK), PAD_I2S3_MCK_FUNC_I2S3_MCK);
152  gpio_set_mode(GPIO(I2S3_BCK), PAD_I2S3_BCK_FUNC_I2S3_BCK);
153  gpio_set_mode(GPIO(I2S3_LRCK), PAD_I2S3_LRCK_FUNC_I2S3_LRCK);
154  gpio_set_mode(GPIO(I2S3_DO), PAD_I2S3_DO_FUNC_I2S3_DO);
155 }
156 
157 static void mainboard_init(struct device *dev)
158 {
161  configure_audio();
162  setup_usb_host();
163 
165 
166  if (dpm_init())
167  printk(BIOS_ERR, "dpm init fail, system can't do DVFS switch\n");
168 
169  if (spm_init())
170  printk(BIOS_ERR, "spm init fail, system suspend may stuck\n");
171 
172  if (display_init_required())
174  else
175  printk(BIOS_INFO, "%s: Skipped display init\n", __func__);
176 }
177 
178 static void mainboard_enable(struct device *dev)
179 {
180  dev->ops->init = &mainboard_init;
181 }
182 
185 };
struct chip_operations mainboard_ops
Definition: mainboard.c:19
int anx7625_init(uint8_t bus)
Definition: anx7625.c:866
int anx7625_dp_get_edid(uint8_t bus, struct edid *out)
Definition: anx7625.c:845
int anx7625_dp_start(uint8_t bus, const struct edid *edid)
Definition: anx7625.c:828
const char * name
Definition: mmu.c:92
void register_bl31_aux_param(struct bl_aux_param_header *param)
Definition: bl31.c:54
int display_init_required(void)
Definition: bootmode.c:22
#define printk(level,...)
Definition: stdlib.h:16
void mdelay(unsigned int msecs)
Definition: delay.c:2
int dpm_init(void)
Definition: dpm.c:33
@ GPIO
Definition: chip.h:84
@ MIPI_DSI_FMT_RGB888
Definition: dsi_common.h:13
@ MIPI_DSI_MODE_LINE_END
Definition: dsi_common.h:45
@ MIPI_DSI_MODE_EOT_PACKET
Definition: dsi_common.h:39
@ MIPI_DSI_MODE_VIDEO_SYNC_PULSE
Definition: dsi_common.h:25
@ MIPI_DSI_MODE_VIDEO
Definition: dsi_common.h:21
@ MIPI_DSI_MODE_LPM
Definition: dsi_common.h:43
struct fb_info * fb_new_framebuffer_info_from_edid(const struct edid *edid, uintptr_t fb_addr)
Definition: edid_fill_fb.c:162
static void mainboard_init(struct device *dev)
Definition: mainboard.c:157
static void configure_backlight_and_bridge(void)
Definition: mainboard.c:74
#define GPIO_BL_PWM_1V8
Definition: mainboard.c:54
static void configure_audio(void)
Definition: mainboard.c:145
#define GPIO_AP_EDP_BKLTEN
Definition: mainboard.c:53
#define GPIO_EN_PP1800_EDPBRDG_DX
Definition: mainboard.c:50
#define GPIO_EN_PP3300_EDP_DX
Definition: mainboard.c:49
static bool configure_display(void)
Definition: mainboard.c:92
void mtk_dsi_override_phy_timing(struct mtk_phy_timing *timing)
Definition: mainboard.c:68
#define GPIO_EDPBRDG_PWREN
Definition: mainboard.c:47
#define GPIO_EN_PP1000_EDPBRDG
Definition: mainboard.c:51
#define GPIO_EDPBRDG_RST_ODL
Definition: mainboard.c:48
static void mainboard_enable(struct device *dev)
Definition: mainboard.c:178
#define GPIO_EN_PP3300_DISPLAY_DX
Definition: mainboard.c:52
static void register_reset_to_bl31(void)
Definition: mainboard.c:56
void edid_set_framebuffer_bits_per_pixel(struct edid *edid, int fb_bpp, int row_byte_alignment)
Definition: edid.c:1667
void gpio_output(gpio_t gpio, int value)
Definition: gpio.c:194
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
#define GPIO_RESET
Definition: gpio.h:16
int mtk_dsi_init(u32 mode_flags, u32 format, u32 lanes, const struct edid *edid, const u8 *init_commands)
Definition: dsi.c:360
void setup_usb_host(void)
Definition: usb.c:153
void mtk_msdc_configure_sdcard(void)
Definition: msdc.c:66
void mtk_msdc_configure_emmc(bool is_early_init)
Definition: msdc.c:36
void mtk_ddp_init(void)
Definition: ddp.c:61
void mtk_ddp_mode_set(const struct edid *edid)
Definition: ddp.c:66
int spm_init(void)
Definition: spm.c:298
void mtcmos_audio_power_on(void)
Definition: mtcmos.c:52
void mtcmos_display_power_on(void)
Definition: mtcmos.c:44
void mtcmos_protect_display_bus(void)
Definition: mtcmos.c:14
void gpio_set_mode(gpio_t gpio, int mode)
Definition: gpio.c:45
void mtk_i2c_bus_init(uint8_t bus)
Definition: i2c.c:65
#define NULL
Definition: stddef.h:19
uint32_t u32
Definition: stdint.h:51
unsigned long uintptr_t
Definition: stdint.h:21
uint8_t u8
Definition: stdint.h:45
void(* enable_dev)(struct device *dev)
Definition: device.h:24
void(* init)(struct device *dev)
Definition: device.h:42
Definition: device.h:107
struct device_operations * ops
Definition: device.h:143
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
char ascii_string[EDID_ASCII_STRING_LENGTH+1]
Definition: edid.h:85
char manufacturer_name[3+1]
Definition: edid.h:86
struct edid_mode mode
Definition: edid.h:72
Definition: i2c.c:65