summaryrefslogtreecommitdiff
path: root/src/northbridge
diff options
context:
space:
mode:
authorNico Huber <nico.h@gmx.de>2023-05-18 13:51:18 +0200
committerFelix Singer <service+coreboot-gerrit@felixsinger.de>2023-05-21 19:50:24 +0000
commite5888da8de5b098271e95953846b313f25a42d63 (patch)
tree2994ba60f6c97590ad1e18c57f6cdf70ac4d3018 /src/northbridge
parent9405541b1aebb501969370afcf876bf5052c7152 (diff)
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 <nico.h@gmx.de> Reviewed-on: https://review.coreboot.org/c/coreboot/+/75376 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Felix Singer <service+coreboot-gerrit@felixsinger.de>
Diffstat (limited to 'src/northbridge')
-rw-r--r--src/northbridge/intel/gm45/gm45.h2
-rw-r--r--src/northbridge/intel/gm45/gma.c19
2 files changed, 12 insertions, 9 deletions
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 <device/device.h>
#include <edid.h>
-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);
/*