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@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/188720
Reviewed-by: Duncan Laurie <dlaurie@chromium.org>
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: http://review.coreboot.org/5594
Reviewed-by: Aaron Durbin <adurbin@google.com>
Tested-by: build bot (Jenkins)
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@atrey.karlin.mff.cuni.cz>
  */
 
+#include <kconfig.h>
 #include <console/console.h>
 #include <stdlib.h>
 #include <stdint.h>
@@ -663,6 +664,50 @@
 int oprom_is_loaded = 0;
 #endif
 
+#if CONFIG_VGA_ROM_RUN
+static int should_run_oprom(struct device *dev)
+{
+	static int should_run = -1;
+
+	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
+	 * 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;
+
+	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 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)
 {
@@ -673,26 +718,8 @@
 	if (((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA))
 		return;
 
-#if CONFIG_CHROMEOS
-	/* In ChromeOS we want to boot blazingly fast. Therefore
-	 * we 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 loading VGA Option ROM\n");
+	if (!should_load_oprom(dev))
 		return;
-	}
-#endif
-
-#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;
-#endif
 
 	rom = pci_rom_probe(dev);
 	if (rom == NULL)
@@ -702,6 +729,9 @@
 	if (ram == NULL)
 		return;
 
+	if (!should_run_oprom(dev))
+		return;
+
 	run_bios(dev, (unsigned long)ram);
 #if CONFIG_CHROMEOS
 	oprom_is_loaded = 1;