From 49465167a0050133315b54176d930f600ff12db5 Mon Sep 17 00:00:00 2001 From: Bo-Chen Chen Date: Wed, 30 Nov 2022 14:47:41 +0800 Subject: [PATCH] mb/google/geralt: Put MIPI panel data in panel_geralt.c There are eDP and MIPI panels supported in geralt. We put the panels' specified functions - `power_on()` and `configure_panel_backlight()` in panel_geralt.c. Also provide the common interface `get_active_panel()` in panel.c to generalize the display initialization. Since each board may support a different set of MIPI panels, we put the MIPI data in a separate file panel_geralt.c. BUG=b:244208960 TEST=emerge-geralt coreboot Change-Id: Ie928759e020a916f29f0364201a3cf202dc512c3 Signed-off-by: Bo-Chen Chen Reviewed-on: https://review.coreboot.org/c/coreboot/+/70404 Tested-by: build bot (Jenkins) Reviewed-by: Yidi Lin Reviewed-by: Yu-Ping Wu --- src/mainboard/google/geralt/Makefile.inc | 2 + src/mainboard/google/geralt/gpio.h | 2 + src/mainboard/google/geralt/panel.c | 67 ++++++++++++++++++++++ src/mainboard/google/geralt/panel.h | 13 +++++ src/mainboard/google/geralt/panel_geralt.c | 37 ++++++++++++ src/soc/mediatek/mt8188/include/soc/ddp.h | 3 +- 6 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 src/mainboard/google/geralt/panel.c create mode 100644 src/mainboard/google/geralt/panel_geralt.c diff --git a/src/mainboard/google/geralt/Makefile.inc b/src/mainboard/google/geralt/Makefile.inc index 006b4f2ad9..d2fda23b87 100644 --- a/src/mainboard/google/geralt/Makefile.inc +++ b/src/mainboard/google/geralt/Makefile.inc @@ -18,5 +18,7 @@ ramstage-y += boardid.c ramstage-y += chromeos.c ramstage-y += display.c ramstage-y += mainboard.c +ramstage-y += panel.c +ramstage-y += panel_geralt.c ramstage-y += regulator.c ramstage-y += reset.c diff --git a/src/mainboard/google/geralt/gpio.h b/src/mainboard/google/geralt/gpio.h index 1840f21860..5f55917664 100644 --- a/src/mainboard/google/geralt/gpio.h +++ b/src/mainboard/google/geralt/gpio.h @@ -18,6 +18,8 @@ #define GPIO_EDP_HPD_1V8 GPIO(GPIO17) #define GPIO_EN_PP3300_EDP_DISP_X GPIO(DSI1_LCM_RST) +#define GPIO_MIPI_PANEL_BL_PWM GPIO(DISP_PWM0) + void setup_chromeos_gpios(void); #endif diff --git a/src/mainboard/google/geralt/panel.c b/src/mainboard/google/geralt/panel.c new file mode 100644 index 0000000000..b5519432ef --- /dev/null +++ b/src/mainboard/google/geralt/panel.c @@ -0,0 +1,67 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include +#include +#include +#include +#include + +#include "gpio.h" +#include "panel.h" + +static void get_mipi_cmd_from_cbfs(struct panel_description *desc) +{ + /* + * The CBFS file name is panel-{MANUFACTURER}-${PANEL_NAME}, where MANUFACTURER is 3 + * characters and PANEL_NAME is usually 13 characters. + */ + char cbfs_name[64]; + static union { + u8 raw[4 * 1024]; /* Most panels only need < 2K. */ + struct panel_serializable_data s; + } buffer; + + if (!desc->name) { + printk(BIOS_ERR, "Missing panel CBFS file name.\n"); + return; + } + + snprintf(cbfs_name, sizeof(cbfs_name), "panel-%s", desc->name); + if (cbfs_load(cbfs_name, buffer.raw, sizeof(buffer))) + desc->s = &buffer.s; + else + printk(BIOS_ERR, "Missing %s in CBFS.\n", cbfs_name); +} + +struct panel_description *get_active_panel(void) +{ + uint32_t active_panel_id = panel_id(); + + struct panel_description *panel = get_panel_description(active_panel_id); + if (!panel || panel->disp_path == DISP_PATH_NONE) { + printk(BIOS_ERR, "%s: Panel %u is not supported.\n", __func__, active_panel_id); + return NULL; + } + + /* For eDP, we will get edid after eDP initialization is done, so we return directly. */ + if (panel->disp_path == DISP_PATH_EDP) { + printk(BIOS_INFO, "%s: Use eDP as the display\n", __func__); + return panel; + } + + /* We need to find init cmds for MIPI panel from CBFS */ + get_mipi_cmd_from_cbfs(panel); + assert(panel->s); + + const struct edid *edid = &panel->s->edid; + const char *name = edid->ascii_string; + if (name[0] == '\0') { + name = "unknown name"; + printk(BIOS_INFO, "%s: Found ID %u: '%s %s' %dx%d@%dHz\n", __func__, + active_panel_id, edid->manufacturer_name, name, edid->mode.ha, + edid->mode.va, edid->mode.refresh); + } + return panel; +} diff --git a/src/mainboard/google/geralt/panel.h b/src/mainboard/google/geralt/panel.h index e940094da0..40e880b6c6 100644 --- a/src/mainboard/google/geralt/panel.h +++ b/src/mainboard/google/geralt/panel.h @@ -3,6 +3,19 @@ #ifndef __MAINBOARD_GOOGLE_GERALT_PANEL_H__ #define __MAINBOARD_GOOGLE_GERALT_PANEL_H__ +#include +#include + +struct panel_description { + const char *name; + struct panel_serializable_data *s; + void (*power_on)(void); + void (*configure_panel_backlight)(void); + enum disp_path_sel disp_path; +}; + uint32_t panel_id(void); +struct panel_description *get_panel_description(uint32_t panel_id); +struct panel_description *get_active_panel(void); #endif diff --git a/src/mainboard/google/geralt/panel_geralt.c b/src/mainboard/google/geralt/panel_geralt.c new file mode 100644 index 0000000000..f8e612cc82 --- /dev/null +++ b/src/mainboard/google/geralt/panel_geralt.c @@ -0,0 +1,37 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include +#include + +#include "gpio.h" +#include "panel.h" + +static void configure_mipi_pwm_backlight(void) +{ + gpio_output(GPIO_AP_DISP_BKLTEN, 0); + gpio_output(GPIO_MIPI_PANEL_BL_PWM, 0); +} + +static void power_on_mipi_boe_nv110c9m_l60(void) +{ + /* TODO: Add the poweron for BOE_NV110C9M_L60 when we get BOE_NV110C9M_L60 */ +} + +static struct panel_description panels[] = { + [1] = { + .name = "BOE_NV110C9M_L60", + .power_on = power_on_mipi_boe_nv110c9m_l60, + .configure_panel_backlight = configure_mipi_pwm_backlight, + .disp_path = DISP_PATH_MIPI, + }, +}; + +struct panel_description *get_panel_description(uint32_t panel_id) +{ + if (panel_id >= ARRAY_SIZE(panels)) + return NULL; + + return &panels[panel_id]; +} diff --git a/src/soc/mediatek/mt8188/include/soc/ddp.h b/src/soc/mediatek/mt8188/include/soc/ddp.h index 475485eb62..da14a2c4e7 100644 --- a/src/soc/mediatek/mt8188/include/soc/ddp.h +++ b/src/soc/mediatek/mt8188/include/soc/ddp.h @@ -283,7 +283,8 @@ enum { }; enum disp_path_sel { - DISP_PATH_EDP = 0, + DISP_PATH_NONE = 0, + DISP_PATH_EDP, DISP_PATH_MIPI, };