aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/devices/pci_device.c13
-rw-r--r--src/vendorcode/google/chromeos/chromeos.h2
-rw-r--r--src/vendorcode/google/chromeos/vbnv.c22
3 files changed, 31 insertions, 6 deletions
diff --git a/src/devices/pci_device.c b/src/devices/pci_device.c
index 7fa738448d..94f68ea1ab 100644
--- a/src/devices/pci_device.c
+++ b/src/devices/pci_device.c
@@ -656,6 +656,10 @@ void pci_dev_set_subsystem(struct device *dev, unsigned vendor, unsigned device)
((device & 0xffff) << 16) | (vendor & 0xffff));
}
+#if CONFIG_CHROMEOS
+int oprom_is_loaded = 0;
+#endif
+
/** Default handler: only runs the relevant PCI BIOS. */
void pci_dev_init(struct device *dev)
{
@@ -675,8 +679,11 @@ void pci_dev_init(struct device *dev)
* 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())
+ if (!developer_mode_enabled() && !recovery_mode_enabled() &&
+ !vboot_wants_oprom()) {
+ printk(BIOS_DEBUG, "Not loading VGA Option ROM\n");
return;
+ }
#endif
rom = pci_rom_probe(dev);
@@ -696,6 +703,10 @@ void pci_dev_init(struct device *dev)
return;
#endif
run_bios(dev, (unsigned long)ram);
+#if CONFIG_CHROMEOS
+ oprom_is_loaded = 1;
+ printk(BIOS_DEBUG, "VGA Option ROM has been loaded\n");
+#endif
#endif /* CONFIG_PCI_ROM_RUN || CONFIG_VGA_ROM_RUN */
}
diff --git a/src/vendorcode/google/chromeos/chromeos.h b/src/vendorcode/google/chromeos/chromeos.h
index ec0f3b733a..37630a69bc 100644
--- a/src/vendorcode/google/chromeos/chromeos.h
+++ b/src/vendorcode/google/chromeos/chromeos.h
@@ -29,6 +29,8 @@ void save_chromeos_gpios(void);
/* functions implemented in vbnv.c: */
int get_recovery_mode_from_vbnv(void);
+int vboot_wants_oprom(void);
+extern int oprom_is_loaded;
/* functions implemented in chromeos.c: */
int developer_mode_enabled(void);
diff --git a/src/vendorcode/google/chromeos/vbnv.c b/src/vendorcode/google/chromeos/vbnv.c
index 2129461fc1..3f333f7211 100644
--- a/src/vendorcode/google/chromeos/vbnv.c
+++ b/src/vendorcode/google/chromeos/vbnv.c
@@ -38,6 +38,8 @@
#define BOOT_OFFSET 1
#define BOOT_DEBUG_RESET_MODE 0x80
+#define BOOT_DISABLE_DEV_REQUEST 0x40
+#define BOOT_OPROM_NEEDED 0x20
#define BOOT_TRY_B_COUNT_MASK 0x0F
#define RECOVERY_OFFSET 2
@@ -45,11 +47,7 @@
#define DEV_FLAGS_OFFSET 4
#define DEV_BOOT_USB_MASK 0x01
-
-#define FIRMWARE_FLAGS_OFFSET 5
-#define FIRMWARE_TEST_ERR_FUNC_MASK 0x38
-#define FIRMWARE_TEST_ERR_FUNC_SHIFT 3
-#define FIRMWARE_TEST_ERR_NUM_MASK 0x07
+#define DEV_BOOT_SIGNED_ONLY_MASK 0x02
#define KERNEL_FIELD_OFFSET 11
#define CRC_OFFSET 15
@@ -107,3 +105,17 @@ int get_recovery_mode_from_vbnv(void)
vbnv_setup();
return vbnv[RECOVERY_OFFSET];
}
+
+int vboot_wants_oprom(void)
+{
+ if (!vbnv_initialized)
+ vbnv_setup();
+
+ /* FIXME(crosbug.com/p/8789). The following commented-out line does the
+ * right thing, assuming that vboot has requested the option ROM and
+ * rebooted if it finds that it's needed but not loaded. At the moment,
+ * it doesn't yet do that, so we must always say we want it. */
+
+ /* return (vbnv[BOOT_OFFSET] & BOOT_OPROM_NEEDED) ? 1 : 0; */
+ return 1;
+}