summaryrefslogtreecommitdiff
path: root/src/device
diff options
context:
space:
mode:
Diffstat (limited to 'src/device')
-rw-r--r--src/device/Kconfig12
-rw-r--r--src/device/pci_device.c50
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;