diff options
-rw-r--r-- | src/mainboard/google/geralt/Makefile.inc | 1 | ||||
-rw-r--r-- | src/mainboard/google/geralt/display.c | 74 | ||||
-rw-r--r-- | src/mainboard/google/geralt/display.h | 8 | ||||
-rw-r--r-- | src/mainboard/google/geralt/mainboard.c | 4 | ||||
-rw-r--r-- | src/mainboard/google/geralt/panel.c | 52 | ||||
-rw-r--r-- | src/mainboard/google/geralt/panel.h | 14 | ||||
-rw-r--r-- | src/mainboard/google/geralt/panel_geralt.c | 3 | ||||
-rw-r--r-- | src/soc/mediatek/common/display.c | 116 | ||||
-rw-r--r-- | src/soc/mediatek/common/include/soc/display.h | 32 | ||||
-rw-r--r-- | src/soc/mediatek/mt8188/Makefile.inc | 1 | ||||
-rw-r--r-- | src/soc/mediatek/mt8188/include/soc/ddp.h | 10 |
11 files changed, 156 insertions, 159 deletions
diff --git a/src/mainboard/google/geralt/Makefile.inc b/src/mainboard/google/geralt/Makefile.inc index 2b1f313ec9..e954309e2a 100644 --- a/src/mainboard/google/geralt/Makefile.inc +++ b/src/mainboard/google/geralt/Makefile.inc @@ -20,7 +20,6 @@ romstage-y += sdram_configs.c ramstage-y += memlayout.ld ramstage-y += boardid.c ramstage-y += chromeos.c -ramstage-y += display.c ramstage-y += mainboard.c ramstage-y += panel.c ramstage-y += regulator.c diff --git a/src/mainboard/google/geralt/display.c b/src/mainboard/google/geralt/display.c deleted file mode 100644 index 68a0a22231..0000000000 --- a/src/mainboard/google/geralt/display.c +++ /dev/null @@ -1,74 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ - -#include <console/console.h> -#include <delay.h> -#include <edid.h> -#include <framebuffer_info.h> -#include <gpio.h> -#include <soc/ddp.h> -#include <soc/dptx.h> -#include <soc/dsi.h> -#include <soc/gpio_common.h> -#include <soc/mtcmos.h> - -#include "display.h" -#include "gpio.h" -#include "panel.h" - -int configure_display(void) -{ - struct edid edid; - struct fb_info *info; - const char *name; - struct panel_description *panel = get_active_panel(); - if (!panel) - return -1; - - printk(BIOS_INFO, "%s: Starting display initialization\n", __func__); - - mtcmos_display_power_on(); - mtcmos_protect_display_bus(); - - panel->configure_panel_backlight(); - panel->power_on(); - - mtk_ddp_init(); - - if (panel->disp_path == DISP_PATH_EDP) { - mdelay(200); - if (mtk_edp_init(&edid) < 0) { - printk(BIOS_ERR, "%s: Failed to initialize eDP\n", __func__); - return -1; - } - - } else { - u32 mipi_dsi_flags = (MIPI_DSI_MODE_VIDEO | - MIPI_DSI_MODE_VIDEO_SYNC_PULSE | - MIPI_DSI_MODE_LPM | - MIPI_DSI_MODE_EOT_PACKET); - - edid = panel->s->edid; - - if (mtk_dsi_init(mipi_dsi_flags, MIPI_DSI_FMT_RGB888, 4, &edid, - panel->s->init) < 0) { - printk(BIOS_ERR, "%s: Failed in DSI init\n", __func__); - return -1; - } - } - - name = edid.ascii_string; - if (name[0] == '\0') - name = "unknown name"; - printk(BIOS_INFO, "%s: '%s %s' %dx%d@%dHz\n", __func__, - edid.manufacturer_name, name, edid.mode.ha, edid.mode.va, - edid.mode.refresh); - - edid_set_framebuffer_bits_per_pixel(&edid, 32, 0); - - mtk_ddp_mode_set(&edid, panel->disp_path); - info = fb_new_framebuffer_info_from_edid(&edid, (uintptr_t)0); - if (info) - fb_set_orientation(info, LB_FB_ORIENTATION_BOTTOM_UP); - - return 0; -} diff --git a/src/mainboard/google/geralt/display.h b/src/mainboard/google/geralt/display.h deleted file mode 100644 index 29153b303c..0000000000 --- a/src/mainboard/google/geralt/display.h +++ /dev/null @@ -1,8 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ - -#ifndef __MAINBOARD_GOOGLE_GERALT_DISPLAY_H__ -#define __MAINBOARD_GOOGLE_GERALT_DISPLAY_H__ - -int configure_display(void); - -#endif diff --git a/src/mainboard/google/geralt/mainboard.c b/src/mainboard/google/geralt/mainboard.c index 6bb8380a64..3f9ab5d0f6 100644 --- a/src/mainboard/google/geralt/mainboard.c +++ b/src/mainboard/google/geralt/mainboard.c @@ -3,13 +3,13 @@ #include <bootmode.h> #include <device/device.h> #include <soc/bl31.h> +#include <soc/display.h> #include <soc/i2c.h> #include <soc/msdc.h> #include <soc/mt6359p.h> #include <soc/mtcmos.h> #include <soc/usb.h> -#include "display.h" #include "gpio.h" #define AFE_SE_SECURE_CON (AUDIO_BASE + 0x17a8) @@ -44,7 +44,7 @@ static void mainboard_init(struct device *dev) mt6359p_init_pmif_arb(); if (display_init_required()) { - if (configure_display() < 0) + if (mtk_display_init() < 0) printk(BIOS_ERR, "%s: Failed to init display\n", __func__); } else { printk(BIOS_INFO, "%s: Skipped display initialization\n", __func__); diff --git a/src/mainboard/google/geralt/panel.c b/src/mainboard/google/geralt/panel.c index e25b5cbedd..202eda7b7d 100644 --- a/src/mainboard/google/geralt/panel.c +++ b/src/mainboard/google/geralt/panel.c @@ -12,30 +12,6 @@ #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 __weak *get_panel_description(uint32_t panel_id) { printk(BIOS_WARNING, "%s: %s: the panel configuration is not ready\n", @@ -46,33 +22,7 @@ struct panel_description __weak *get_panel_description(uint32_t panel_id) 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); - if (!panel->s) - return NULL; - - 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; + return get_panel_description(active_panel_id); } void configure_mipi_pwm_backlight(void) diff --git a/src/mainboard/google/geralt/panel.h b/src/mainboard/google/geralt/panel.h index 71cecdf5e6..3d0fafdaed 100644 --- a/src/mainboard/google/geralt/panel.h +++ b/src/mainboard/google/geralt/panel.h @@ -3,23 +3,11 @@ #ifndef __MAINBOARD_GOOGLE_GERALT_PANEL_H__ #define __MAINBOARD_GOOGLE_GERALT_PANEL_H__ -#include <boot/coreboot_tables.h> -#include <mipi/panel.h> -#include <soc/ddp.h> - -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; - bool pwm_ctrl_gpio; -}; +#include <soc/display.h> void configure_mipi_pwm_backlight(void); void fill_lp_backlight_gpios(struct lb_gpios *gpios); 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 index 2ca95bece5..6eed3fb122 100644 --- a/src/mainboard/google/geralt/panel_geralt.c +++ b/src/mainboard/google/geralt/panel_geralt.c @@ -52,7 +52,8 @@ static struct panel_description panels[] = { [1] = { .name = "BOE_TV110C9M_LL0", .power_on = power_on_mipi_boe_tv110c9m_ll0, - .configure_panel_backlight = configure_mipi_pwm_backlight, + .configure_backlight = configure_mipi_pwm_backlight, + .orientation = LB_FB_ORIENTATION_BOTTOM_UP, .disp_path = DISP_PATH_MIPI, .pwm_ctrl_gpio = true, }, diff --git a/src/soc/mediatek/common/display.c b/src/soc/mediatek/common/display.c new file mode 100644 index 0000000000..72b7fe04bd --- /dev/null +++ b/src/soc/mediatek/common/display.c @@ -0,0 +1,116 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include <cbfs.h> +#include <console/console.h> +#include <delay.h> +#include <edid.h> +#include <framebuffer_info.h> +#include <soc/ddp.h> +#include <soc/display.h> +#include <soc/dptx.h> +#include <soc/dsi.h> +#include <soc/mtcmos.h> +#include <string.h> + +static struct panel_serializable_data *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 NULL; + } + + snprintf(cbfs_name, sizeof(cbfs_name), "panel-%s", desc->name); + if (cbfs_load(cbfs_name, buffer.raw, sizeof(buffer))) + return &buffer.s; + + printk(BIOS_ERR, "Missing %s in CBFS.\n", cbfs_name); + return NULL; +} + +int mtk_display_init(void) +{ + struct edid edid; + struct fb_info *info; + const char *name; + struct panel_description *panel = get_active_panel(); + + if (!panel || panel->disp_path == DISP_PATH_NONE) { + printk(BIOS_ERR, "%s: Failed to get the active panel\n", __func__); + return -1; + } + + printk(BIOS_INFO, "%s: Starting display initialization\n", __func__); + + mtcmos_display_power_on(); + mtcmos_protect_display_bus(); + + if (panel->configure_backlight) + panel->configure_backlight(); + if (panel->power_on) + panel->power_on(); + + mtk_ddp_init(); + + if (panel->disp_path == DISP_PATH_EDP) { + mdelay(200); + if (mtk_edp_init(&edid) < 0) { + printk(BIOS_ERR, "%s: Failed to initialize eDP\n", __func__); + return -1; + } + } else { + + struct panel_serializable_data *mipi_data = NULL; + + if (panel->get_edid) { + if (panel->get_edid(&edid) < 0) + return -1; + } else { + mipi_data = get_mipi_cmd_from_cbfs(panel); + if (!mipi_data) + return -1; + edid = mipi_data->edid; + } + + u32 mipi_dsi_flags = (MIPI_DSI_MODE_VIDEO | + MIPI_DSI_MODE_VIDEO_SYNC_PULSE | + MIPI_DSI_MODE_LPM | + MIPI_DSI_MODE_EOT_PACKET); + + if (mtk_dsi_init(mipi_dsi_flags, MIPI_DSI_FMT_RGB888, 4, &edid, + mipi_data ? mipi_data->init : NULL) < 0) { + printk(BIOS_ERR, "%s: Failed in DSI init\n", __func__); + return -1; + } + + if (panel->post_power_on && panel->post_power_on(&edid) < 0) { + printk(BIOS_ERR, "%s: Failed to post power on bridge\n", __func__); + return -1; + } + } + + name = edid.ascii_string; + if (name[0] == '\0') + name = "unknown name"; + printk(BIOS_INFO, "%s: '%s %s' %dx%d@%dHz\n", __func__, + edid.manufacturer_name, name, edid.mode.ha, edid.mode.va, + edid.mode.refresh); + + edid_set_framebuffer_bits_per_pixel(&edid, 32, 0); + + mtk_ddp_mode_set(&edid, panel->disp_path); + info = fb_new_framebuffer_info_from_edid(&edid, (uintptr_t)0); + if (info) + fb_set_orientation(info, panel->orientation); + + return 0; +} diff --git a/src/soc/mediatek/common/include/soc/display.h b/src/soc/mediatek/common/include/soc/display.h new file mode 100644 index 0000000000..61bc21fc98 --- /dev/null +++ b/src/soc/mediatek/common/include/soc/display.h @@ -0,0 +1,32 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#ifndef __SOC_MEDIATEK_COMMON_DISPLAY_H__ +#define __SOC_MEDIATEK_COMMON_DISPLAY_H__ + +#include <commonlib/coreboot_tables.h> +#include <mipi/panel.h> + +enum disp_path_sel { + DISP_PATH_NONE = 0, + DISP_PATH_EDP, + DISP_PATH_MIPI, +}; + +struct panel_description { + const char *name; + void (*configure_backlight)(void); + void (*power_on)(void); + int (*get_edid)(struct edid *edid); + int (*post_power_on)(const struct edid *edid); + enum lb_fb_orientation orientation; + enum disp_path_sel disp_path; + bool pwm_ctrl_gpio; +}; + +int mtk_display_init(void); +struct panel_description *get_active_panel(void); + +void mtk_ddp_init(void); +void mtk_ddp_mode_set(const struct edid *edid, enum disp_path_sel path); + +#endif diff --git a/src/soc/mediatek/mt8188/Makefile.inc b/src/soc/mediatek/mt8188/Makefile.inc index 6a643b0057..4731fab14c 100644 --- a/src/soc/mediatek/mt8188/Makefile.inc +++ b/src/soc/mediatek/mt8188/Makefile.inc @@ -37,6 +37,7 @@ ramstage-y += cpu_input_gating.c ramstage-y += ../common/ddp.c ddp.c ramstage-y += ../common/devapc.c devapc.c ramstage-y += ../common/dfd.c +ramstage-y += ../common/display.c ramstage-y += ../common/dp/dp_intf.c ../common/dp/dptx.c ../common/dp/dptx_hal.c dp_intf.c ramstage-y += ../common/dpm.c ramstage-$(CONFIG_DPM_FOUR_CHANNEL) += ../common/dpm_4ch.c diff --git a/src/soc/mediatek/mt8188/include/soc/ddp.h b/src/soc/mediatek/mt8188/include/soc/ddp.h index da14a2c4e7..94fdb810a7 100644 --- a/src/soc/mediatek/mt8188/include/soc/ddp.h +++ b/src/soc/mediatek/mt8188/include/soc/ddp.h @@ -5,6 +5,7 @@ #include <soc/addressmap.h> #include <soc/ddp_common.h> +#include <soc/display.h> #include <types.h> #define MAIN_PATH_OVL_NR 1 @@ -282,13 +283,4 @@ enum { SMI_LARB_PORT_L0_OVL_RDMA0 = 0xF88, }; -enum disp_path_sel { - DISP_PATH_NONE = 0, - DISP_PATH_EDP, - DISP_PATH_MIPI, -}; - -void mtk_ddp_init(void); -void mtk_ddp_mode_set(const struct edid *edid, enum disp_path_sel); - #endif |