From e5888da8de5b098271e95953846b313f25a42d63 Mon Sep 17 00:00:00 2001 From: Nico Huber Date: Thu, 18 May 2023 13:51:18 +0200 Subject: [PATCH] nb/intel/gm45/gma: Probe PCI resource once and first The PCI resource should only be probed as part of the device .init process. We can simply do that first and know that we can use the global `gtt_res` from then on. This simplifies the signature of gm45_get_lvds_edid_str(), and makes changes to the API user (lenovo/x200) necessary. Change-Id: I6c96f715abfa56dcb1cd89fde0fbaef3f1cb63ae Signed-off-by: Nico Huber Reviewed-on: https://review.coreboot.org/c/coreboot/+/75376 Tested-by: build bot (Jenkins) Reviewed-by: Felix Singer --- src/mainboard/lenovo/x200/blc.c | 3 +-- src/northbridge/intel/gm45/gm45.h | 2 +- src/northbridge/intel/gm45/gma.c | 19 +++++++++++-------- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/mainboard/lenovo/x200/blc.c b/src/mainboard/lenovo/x200/blc.c index 330f1bcdaf..655be567e6 100644 --- a/src/mainboard/lenovo/x200/blc.c +++ b/src/mainboard/lenovo/x200/blc.c @@ -38,8 +38,7 @@ int get_blc_values(const struct blc_pwm_t **entries) const char *mainboard_vbt_filename(void) { - struct device *gma = pcidev_path_on_root(PCI_DEVFN(0x2, 0)); - u16 pwm_freq = gma ? get_blc_pwm_freq_value(gm45_get_lvds_edid_str(gma)) : 0; + u16 pwm_freq = get_blc_pwm_freq_value(gm45_get_lvds_edid_str()); if (pwm_freq == 0) { printk(BIOS_DEBUG, diff --git a/src/northbridge/intel/gm45/gm45.h b/src/northbridge/intel/gm45/gm45.h index c85a16ce59..d30ebe32e2 100644 --- a/src/northbridge/intel/gm45/gm45.h +++ b/src/northbridge/intel/gm45/gm45.h @@ -449,7 +449,7 @@ u16 get_blc_pwm_freq_value(const char *edid_ascii_string); #include #include -const char *gm45_get_lvds_edid_str(struct device *dev); +const char *gm45_get_lvds_edid_str(void); struct acpi_rsdp; unsigned long northbridge_write_acpi_tables(const struct device *device, unsigned long start, diff --git a/src/northbridge/intel/gm45/gma.c b/src/northbridge/intel/gm45/gma.c index 6759e743f5..ef7b872b58 100644 --- a/src/northbridge/intel/gm45/gma.c +++ b/src/northbridge/intel/gm45/gma.c @@ -143,7 +143,7 @@ static void gma_pm_init_post_vbios(struct device *const dev, reg8)); } -const char *gm45_get_lvds_edid_str(struct device *dev) +const char *gm45_get_lvds_edid_str(void) { u8 *mmio; u8 edid_data_lvds[128]; @@ -152,10 +152,10 @@ const char *gm45_get_lvds_edid_str(struct device *dev) if (edid_str[0]) return edid_str; - if (!gtt_res) - gtt_res = probe_resource(dev, PCI_BASE_ADDRESS_0); - if (!gtt_res) + if (!gtt_res) { + printk(BIOS_ERR, "Never call %s() outside dev.init() context.\n", __func__); return NULL; + } mmio = res2mmio(gtt_res, 0, 0); printk(BIOS_DEBUG, "LVDS EDID\n"); @@ -176,15 +176,18 @@ static void gma_func0_init(struct device *dev) const struct northbridge_intel_gm45_config *const conf = dev->chip_info; const char *edid_str; + /* Probe MMIO resource first. It's needed even for + intel_gma_init_igd_opregion() which may call back. */ + gtt_res = probe_resource(dev, PCI_BASE_ADDRESS_0); + if (!gtt_res) + return; + intel_gma_init_igd_opregion(); - edid_str = gm45_get_lvds_edid_str(dev); + edid_str = gm45_get_lvds_edid_str(); if (!edid_str) printk(BIOS_ERR, "Failed to obtain LVDS EDID string!\n"); - /* gtt_res should have been inited in gm45_get_lvds_edid_str() */ - if (!gtt_res) - return; mmio = res2mmio(gtt_res, 0, 0); /*