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 <werner.zeh@siemens.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/56631
Reviewed-by: Mario Scheithauer <mario.scheithauer@siemens.com>
Reviewed-by: Paul Menzel <paulepanter@mailbox.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Werner Zeh 2021-06-11 06:55:50 +02:00 committed by Paul Fagerburg
parent c1adf40e11
commit 4cec1a2770
1 changed files with 30 additions and 0 deletions

View File

@ -1,12 +1,15 @@
/* SPDX-License-Identifier: GPL-2.0-only */ /* SPDX-License-Identifier: GPL-2.0-only */
#include <baseboard/variants.h> #include <baseboard/variants.h>
#include <bootstate.h>
#include <console/console.h> #include <console/console.h>
#include <device/device.h> #include <device/device.h>
#include <hwilib.h> #include <hwilib.h>
#include <i210.h> #include <i210.h>
#include <soc/gpio.h> #include <soc/gpio.h>
#include <string.h> #include <string.h>
#include <timer.h>
#include <timestamp.h>
#define MAX_PATH_DEPTH 12 #define MAX_PATH_DEPTH 12
#define MAX_NUM_MAPPINGS 10 #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; 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) static void mainboard_init(void *chip_info)
{ {
const struct pad_config *pads; const struct pad_config *pads;
@ -95,3 +123,5 @@ static void mainboard_init(void *chip_info)
struct chip_operations mainboard_ops = { struct chip_operations mainboard_ops = {
.init = mainboard_init, .init = mainboard_init,
}; };
BOOT_STATE_INIT_ENTRY(BS_DEV_ENUMERATE, BS_ON_ENTRY, wait_for_legacy_dev, NULL);