summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBill Richardson <wfrichar@chromium.org>2012-06-26 16:33:56 -0700
committerGerrit <chrome-bot@google.com>2012-06-27 17:40:40 -0700
commit17b8224ea582b2ba90b30a3e8e2d913e49c7818a (patch)
tree17458e3e00091416f4c09608b2e07e8848d6ed46
parent66b47ba37d3658cceecf30d25edc3becbb692c4a (diff)
downloadvboot-17b8224ea582b2ba90b30a3e8e2d913e49c7818a.tar.gz
Add bits to request and acknowledge Option ROM loading.
For fastest boot, we don't want to load the VGA Option ROM every time, but only when we need it. Coreboot does that loading, but it can't always know when it's needed (with keyboard-based dev-mode, coreboot can't tell if we're in dev-mode or not). By the time we get to U-Boot, it's too late, so we need two extra bits - one for vboot to tell coreboot to load the Option ROM and another for coreboot to let vboot know it's been done. BUG=chrome-os-partner:8789 TEST=manual The only visible change is that crossystem will now have an "oprom_needed" flag that can be set or cleared. Nothing actually pays attention to it yet, though. Signed-off-by: Bill Richardson <wfrichar@chromium.org> Change-Id: I521a6afdfb8ea17a8148b32eeb858844c981de9c Reviewed-on: https://gerrit.chromium.org/gerrit/26272 Reviewed-by: Randall Spangler <rspangler@chromium.org>
-rw-r--r--firmware/include/vboot_api.h2
-rw-r--r--firmware/include/vboot_nvstorage.h3
-rw-r--r--firmware/include/vboot_struct.h2
-rw-r--r--firmware/lib/vboot_api_init.c2
-rw-r--r--firmware/lib/vboot_nvstorage.c12
-rw-r--r--host/lib/crossystem.c4
-rw-r--r--utility/crossystem_main.c3
7 files changed, 26 insertions, 2 deletions
diff --git a/firmware/include/vboot_api.h b/firmware/include/vboot_api.h
index 8cb3620b..5f11313d 100644
--- a/firmware/include/vboot_api.h
+++ b/firmware/include/vboot_api.h
@@ -169,6 +169,8 @@ typedef struct VbCommonParams {
* virtual switch (kept in the TPM) instead. When this flag is set,
* VB_INIT_FLAG_DEV_SWITCH_ON is ignored. */
#define VB_INIT_FLAG_VIRTUAL_DEV_SWITCH 0x00000040
+/* Set when the VGA Option ROM has been loaded already. */
+#define VB_INIT_FLAG_OPROM_LOADED 0x00000080
/* Output flags for VbInitParams.out_flags. Used to indicate
* potential boot paths and configuration to the calling firmware
diff --git a/firmware/include/vboot_nvstorage.h b/firmware/include/vboot_nvstorage.h
index 4259d400..845a48a9 100644
--- a/firmware/include/vboot_nvstorage.h
+++ b/firmware/include/vboot_nvstorage.h
@@ -54,6 +54,9 @@ typedef enum VbNvParam {
/* Set by userspace to request that RO firmware disable dev-mode on the next
* boot. This is likely only possible if the dev-switch is virtual. */
VBNV_DISABLE_DEV_REQUEST,
+ /* Set and cleared by vboot to request that the video Option ROM be loaded at
+ * boot time, so that BIOS screens can be displayed. 0=no, 1=yes. */
+ VBNV_OPROM_NEEDED,
} VbNvParam;
diff --git a/firmware/include/vboot_struct.h b/firmware/include/vboot_struct.h
index d894e23d..cfd56717 100644
--- a/firmware/include/vboot_struct.h
+++ b/firmware/include/vboot_struct.h
@@ -233,6 +233,8 @@ typedef struct VbKernelPreambleHeader {
#define VBSD_BOOT_RO_NORMAL_SUPPORT 0x00000200
/* VbInit was told that the system has a virtual dev-switch */
#define VBSD_HONOR_VIRT_DEV_SWITCH 0x00000400
+/* VbInit was told that the VGA Option ROM was loaded at boot */
+#define VBSD_BOOT_OPROM_LOADED 0x00000800
/* Result codes for VbSharedDataHeader.check_fw_a_result (and b_result) */
#define VBSD_LF_CHECK_NOT_DONE 0
diff --git a/firmware/lib/vboot_api_init.c b/firmware/lib/vboot_api_init.c
index 78f451fd..4c5eb642 100644
--- a/firmware/lib/vboot_api_init.c
+++ b/firmware/lib/vboot_api_init.c
@@ -58,6 +58,8 @@ VbError_t VbInit(VbCommonParams* cparams, VbInitParams* iparams) {
shared->flags |= VBSD_BOOT_S3_RESUME;
if (iparams->flags & VB_INIT_FLAG_RO_NORMAL_SUPPORT)
shared->flags |= VBSD_BOOT_RO_NORMAL_SUPPORT;
+ if (iparams->flags & VB_INIT_FLAG_OPROM_LOADED)
+ shared->flags |= VBSD_BOOT_OPROM_LOADED;
is_s3_resume = (iparams->flags & VB_INIT_FLAG_S3_RESUME ? 1 : 0);
diff --git a/firmware/lib/vboot_nvstorage.c b/firmware/lib/vboot_nvstorage.c
index 79a28d7b..bde0b401 100644
--- a/firmware/lib/vboot_nvstorage.c
+++ b/firmware/lib/vboot_nvstorage.c
@@ -23,6 +23,7 @@
#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
@@ -119,6 +120,10 @@ int VbNvGet(VbNvContext* context, VbNvParam param, uint32_t* dest) {
*dest = (raw[BOOT_OFFSET] & BOOT_DISABLE_DEV_REQUEST ? 1 : 0);
return 0;
+ case VBNV_OPROM_NEEDED:
+ *dest = (raw[BOOT_OFFSET] & BOOT_OPROM_NEEDED ? 1 : 0);
+ return 0;
+
default:
return 1;
}
@@ -207,6 +212,13 @@ int VbNvSet(VbNvContext* context, VbNvParam param, uint32_t value) {
raw[BOOT_OFFSET] &= ~BOOT_DISABLE_DEV_REQUEST;
break;
+ case VBNV_OPROM_NEEDED:
+ if (value)
+ raw[BOOT_OFFSET] |= BOOT_OPROM_NEEDED;
+ else
+ raw[BOOT_OFFSET] &= ~BOOT_OPROM_NEEDED;
+ break;
+
default:
return 1;
}
diff --git a/host/lib/crossystem.c b/host/lib/crossystem.c
index d80f8430..80a3d3c2 100644
--- a/host/lib/crossystem.c
+++ b/host/lib/crossystem.c
@@ -381,6 +381,8 @@ int VbGetSystemPropertyInt(const char* name) {
value = VbGetNvStorage(VBNV_DEV_BOOT_USB);
} else if (!strcasecmp(name,"dev_boot_signed_only")) {
value = VbGetNvStorage(VBNV_DEV_BOOT_SIGNED_ONLY);
+ } else if (!strcasecmp(name,"oprom_needed")) {
+ value = VbGetNvStorage(VBNV_OPROM_NEEDED);
}
/* Other parameters */
else if (!strcasecmp(name,"cros_debug")) {
@@ -460,6 +462,8 @@ int VbSetSystemPropertyInt(const char* name, int value) {
return VbSetNvStorage(VBNV_DEV_BOOT_USB, value);
} else if (!strcasecmp(name,"dev_boot_signed_only")) {
return VbSetNvStorage(VBNV_DEV_BOOT_SIGNED_ONLY, value);
+ } else if (!strcasecmp(name,"oprom_needed")) {
+ return VbSetNvStorage(VBNV_OPROM_NEEDED, value);
}
return -1;
diff --git a/utility/crossystem_main.c b/utility/crossystem_main.c
index 2161583f..e7320c99 100644
--- a/utility/crossystem_main.c
+++ b/utility/crossystem_main.c
@@ -57,6 +57,7 @@ const Param sys_param_list[] = {
{"mainfw_act", IS_STRING, "Active main firmware"},
{"mainfw_type", IS_STRING, "Active main firmware type"},
{"nvram_cleared", CAN_WRITE, "Have NV settings been lost? Write 0 to clear"},
+ {"oprom_needed", CAN_WRITE, "Should we load the VGA Option ROM at boot?"},
{"platform_family", IS_STRING, "Platform family type"},
{"recovery_reason", 0, "Recovery mode reason for current boot"},
{"recovery_request", CAN_WRITE, "Recovery mode request (writable)"},
@@ -69,8 +70,6 @@ const Param sys_param_list[] = {
{"tpm_fwver", 0, "Firmware version stored in TPM", "0x%08x"},
{"tpm_kernver", 0, "Kernel version stored in TPM", "0x%08x"},
{"tried_fwb", 0, "Tried firmware B before A this boot"},
- {"vbtest_errfunc", CAN_WRITE, "Verified boot test error function (writable)"},
- {"vbtest_errno", CAN_WRITE, "Verified boot test error number (writable)"},
{"vdat_flags", 0, "Flags from VbSharedData", "0x%08x"},
{"vdat_lfdebug", IS_STRING|NO_PRINT_ALL,
"LoadFirmware() debug data (not in print-all)"},