diff options
-rw-r--r-- | src/device/Kconfig | 12 | ||||
-rw-r--r-- | src/device/pci_device.c | 50 |
2 files changed, 52 insertions, 10 deletions
diff --git a/src/device/Kconfig b/src/device/Kconfig index 932b4de540..ab7a5775d1 100644 --- a/src/device/Kconfig +++ b/src/device/Kconfig @@ -70,6 +70,18 @@ config S3_VGA_ROM_RUN If unsure, say N when using SeaBIOS as payload, Y otherwise. +config ALWAYS_LOAD_OPROM + def_bool n + depends on VGA_ROM_RUN + help + Always load option roms if any are found. The decision to run + the rom is still determined at runtime, but the distinction + between loading and not running comes into play for CHROMEOS. + + An example where this is required is that VBT (video bios tables) + are needed for the kernel's display driver to know how a piece of + hardware is configured to be used. + config ON_DEVICE_ROM_RUN bool "Run Option ROMs on PCI devices" default n if PAYLOAD_SEABIOS diff --git a/src/device/pci_device.c b/src/device/pci_device.c index aa0d954480..ca3604611d 100644 --- a/src/device/pci_device.c +++ b/src/device/pci_device.c @@ -23,6 +23,7 @@ * Copyright 1997 -- 1999 Martin Mares <mj@atrey.karlin.mff.cuni.cz> */ +#include <kconfig.h> #include <console/console.h> #include <stdlib.h> #include <stdint.h> @@ -663,15 +664,13 @@ void pci_dev_set_subsystem(struct device *dev, unsigned vendor, unsigned device) int oprom_is_loaded = 0; #endif -/** Default handler: only runs the relevant PCI BIOS. */ -void pci_dev_init(struct device *dev) -{ #if CONFIG_VGA_ROM_RUN - struct rom_header *rom, *ram; +static int should_run_oprom(struct device *dev) +{ + static int should_run = -1; - /* Only execute VGA ROMs. */ - if (((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA)) - return; + if (should_run >= 0) + return should_run; #if CONFIG_CHROMEOS /* In ChromeOS we want to boot blazingly fast. Therefore @@ -680,19 +679,47 @@ void pci_dev_init(struct device *dev) */ if (!developer_mode_enabled() && !recovery_mode_enabled() && !vboot_wants_oprom()) { - printk(BIOS_DEBUG, "Not loading VGA Option ROM\n"); - return; + printk(BIOS_DEBUG, "Not running VGA Option ROM\n"); + should_run = 0; + return should_run; } #endif + should_run = 1; + + return should_run; +} +static int should_load_oprom(struct device *dev) +{ #if CONFIG_HAVE_ACPI_RESUME && !CONFIG_S3_VGA_ROM_RUN /* If S3_VGA_ROM_RUN is disabled, skip running VGA option * ROMs when coming out of an S3 resume. */ if ((acpi_slp_type == 3) && ((dev->class >> 8) == PCI_CLASS_DISPLAY_VGA)) - return; + return 0; #endif + if (IS_ENABLED(CONFIG_ALWAYS_LOAD_OPROM)) + return 1; + if (should_run_oprom(dev)) + return 1; + + return 0; +} +#endif /* CONFIG_VGA_ROM_RUN */ + +/** Default handler: only runs the relevant PCI BIOS. */ +void pci_dev_init(struct device *dev) +{ +#if CONFIG_VGA_ROM_RUN + struct rom_header *rom, *ram; + + /* Only execute VGA ROMs. */ + if (((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA)) + return; + + if (!should_load_oprom(dev)) + return; rom = pci_rom_probe(dev); if (rom == NULL) @@ -702,6 +729,9 @@ void pci_dev_init(struct device *dev) if (ram == NULL) return; + if (!should_run_oprom(dev)) + return; + run_bios(dev, (unsigned long)ram); #if CONFIG_CHROMEOS oprom_is_loaded = 1; |