From 4cec1a2770c1ac5257e704eda4117477d5d28d69 Mon Sep 17 00:00:00 2001 From: Werner Zeh Date: Fri, 11 Jun 2021 06:55:50 +0200 Subject: [PATCH] mb/siemens/mc_ehl: Add code to wait for legacy devices before PCI scan Boards based on mc_ehl have, just like some mc_apl variants, legacy devices on the PCI bus which take longer to boot. In order to ensure that they will be enumerated correctly wait for them to come up before PCI scan starts. TEST=Checked that the new message is visible in the log. Change-Id: If2f935b69ddaa9364566deacfada5e7d41fcdabd Signed-off-by: Werner Zeh Reviewed-on: https://review.coreboot.org/c/coreboot/+/56631 Reviewed-by: Mario Scheithauer Reviewed-by: Paul Menzel Tested-by: build bot (Jenkins) --- src/mainboard/siemens/mc_ehl/mainboard.c | 30 ++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/mainboard/siemens/mc_ehl/mainboard.c b/src/mainboard/siemens/mc_ehl/mainboard.c index fc7d31f29d..4cc5490f2a 100644 --- a/src/mainboard/siemens/mc_ehl/mainboard.c +++ b/src/mainboard/siemens/mc_ehl/mainboard.c @@ -1,12 +1,15 @@ /* SPDX-License-Identifier: GPL-2.0-only */ #include +#include #include #include #include #include #include #include +#include +#include #define MAX_PATH_DEPTH 12 #define MAX_NUM_MAPPINGS 10 @@ -83,6 +86,31 @@ enum cb_err mainboard_get_mac_address(struct device *dev, uint8_t mac[MAC_ADDR_L return CB_ERR; } +static void wait_for_legacy_dev(void *unused) +{ + uint32_t legacy_delay, us_since_boot; + struct stopwatch sw; + + /* Open main hwinfo block. */ + if (hwilib_find_blocks("hwinfo.hex") != CB_SUCCESS) + return; + + /* Get legacy delay parameter from hwinfo. */ + if (hwilib_get_field(LegacyDelay, (uint8_t *) &legacy_delay, + sizeof(legacy_delay)) != sizeof(legacy_delay)) + return; + + us_since_boot = get_us_since_boot(); + /* No need to wait if the time since boot is already long enough.*/ + if (us_since_boot > legacy_delay) + return; + stopwatch_init_msecs_expire(&sw, (legacy_delay - us_since_boot) / 1000); + printk(BIOS_NOTICE, "Wait remaining %d of %d us for legacy devices...", + legacy_delay - us_since_boot, legacy_delay); + stopwatch_wait_until_expired(&sw); + printk(BIOS_NOTICE, "done!\n"); +} + static void mainboard_init(void *chip_info) { const struct pad_config *pads; @@ -95,3 +123,5 @@ static void mainboard_init(void *chip_info) struct chip_operations mainboard_ops = { .init = mainboard_init, }; + +BOOT_STATE_INIT_ENTRY(BS_DEV_ENUMERATE, BS_ON_ENTRY, wait_for_legacy_dev, NULL);