Kyösti Mälkki (kyosti.malkki(a)gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/5594
-gerrit
commit df50e3b56ede96d8a4b55135aa9fc4097c9b5fc2
Author: Aaron Durbin <adurbin(a)chromium.org>
Date: Tue Mar 4 10:21:31 2014 -0600
device: provide option to always load PCI option roms
Certain kernel drivers require the presence of option rom
contents because the board's static configuration information
is located within the blob. Therefore, allow a chipset/board to
instruct the pci device handling code to always load but not
necessarily run the option rom.
BUG=chrome-os-partner:25885
BRANCH=baytrail
TEST=Both enabling and not enabling this option shows expected behavior.
Change-Id: Ib0f65ffaf1a861b543573a062c291f4ba491ffe0
Signed-off-by: Aaron Durbin <adurbin(a)chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/188720
Reviewed-by: Duncan Laurie <dlaurie(a)chromium.org>
Signed-off-by: Kyösti Mälkki <kyosti.malkki(a)gmail.com>
---
src/device/Kconfig | 12 ++++++++++++
src/device/pci_device.c | 50 +++++++++++++++++++++++++++++++++++++++----------
2 files changed, 52 insertions(+), 10 deletions(-)
diff --git a/src/device/Kconfig b/src/device/Kconfig
index 932b4de..ab7a577 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 aa0d954..ca36046 100644
--- a/src/device/pci_device.c
+++ b/src/device/pci_device.c
@@ -23,6 +23,7 @@
* Copyright 1997 -- 1999 Martin Mares <mj(a)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;
Kyösti Mälkki (kyosti.malkki(a)gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/5595
-gerrit
commit ea324684e812c63eabc4c93594e91e5130be4967
Author: Kyösti Mälkki <kyosti.malkki(a)gmail.com>
Date: Sun Dec 22 00:22:49 2013 +0200
device: Conditionally bypass oprom execution
Builds with CHROMEOS can bypass VGA oprom when boot is not in
developer or recovery modes. Have the same functionality available
without CHROMEOS but with BOOTMODE_STRAPS.
Change-Id: I97644364305dc05aad78a744599476ccc58db163
Signed-off-by: Kyösti Mälkki <kyosti.malkki(a)gmail.com>
---
src/device/pci_device.c | 20 +++++++++-----------
1 file changed, 9 insertions(+), 11 deletions(-)
diff --git a/src/device/pci_device.c b/src/device/pci_device.c
index dfc0898..f09fcaa 100644
--- a/src/device/pci_device.c
+++ b/src/device/pci_device.c
@@ -669,20 +669,18 @@ static int should_run_oprom(struct device *dev)
if (should_run >= 0)
return should_run;
-#if CONFIG_CHROMEOS
- /* In ChromeOS we want to boot blazingly fast. Therefore
- * we don't run (VGA) option ROMs, unless we have to print
+ /* Don't run VGA option ROMs, unless we have to print
* something on the screen before the kernel is loaded.
*/
- if (!developer_mode_enabled() && !recovery_mode_enabled() &&
- !vboot_wants_oprom()) {
- printk(BIOS_DEBUG, "Not running VGA Option ROM\n");
- should_run = 0;
- return should_run;
- }
-#endif
- should_run = 1;
+ should_run = !IS_ENABLED(CONFIG_BOOTMODE_STRAPS) ||
+ developer_mode_enabled() || recovery_mode_enabled();
+#if CONFIG_CHROMEOS
+ if (!should_run)
+ should_run = vboot_wants_oprom();
+#endif
+ if (!should_run)
+ printk(BIOS_DEBUG, "Not running VGA Option ROM\n");
return should_run;
}