summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Kitching <kitching@google.com>2019-04-12 11:45:32 +0800
committerchrome-bot <chrome-bot@chromium.org>2019-05-03 07:02:32 -0700
commite7edff6653e16ed915c3ad12234d133d1ef4dcc9 (patch)
treec8e8d39ed37ebe1ef339bb0e46b74124293f6238
parent6a72e23120a99fab124395d83ba2d511a1a6664e (diff)
downloadvboot-e7edff6653e16ed915c3ad12234d133d1ef4dcc9.tar.gz
vboot: implement DISPLAY_INIT context and SD flag
As part of go/vboot2-cleanup-oprom, introduce new context flag DISPLAY_INIT. The equivalent shared data flag DISPLAY_AVAILABLE is also introduced for downstream vboot to read. The context flag serves the dual purpose of: (1) the vboot caller (coreboot) telling vboot that "display will be initialized regardless", for cases when a mainboard/SoC cannot disable its display initialization code (see coreboot Kconfig VBOOT_MUST_REQUEST_DISPLAY, previously VBOOT_OPROM_MATTERS). (2) vboot telling the vboot caller (coreboot) that "display initialization should occur" for cases when vboot needs display enabled on this boot. BUG=b:124141368, chromium:948529 TEST=make clean && make runtests BRANCH=none Change-Id: If18bedf99c0f6e366c12d043377edb7bcdb35fdf Signed-off-by: Joel Kitching <kitching@google.com> Reviewed-on: https://chromium-review.googlesource.com/1564232 Commit-Ready: Joel Kitching <kitching@chromium.org> Tested-by: Joel Kitching <kitching@chromium.org> Reviewed-by: Julius Werner <jwerner@chromium.org>
-rw-r--r--firmware/2lib/2api.c17
-rw-r--r--firmware/2lib/include/2api.h13
-rw-r--r--firmware/2lib/include/2struct.h3
-rw-r--r--tests/vb2_api_tests.c39
4 files changed, 71 insertions, 1 deletions
diff --git a/firmware/2lib/2api.c b/firmware/2lib/2api.c
index 707f2027..1556c997 100644
--- a/firmware/2lib/2api.c
+++ b/firmware/2lib/2api.c
@@ -37,9 +37,11 @@ void vb2api_fail(struct vb2_context *ctx, uint8_t reason, uint8_t subcode)
int vb2api_fw_phase1(struct vb2_context *ctx)
{
int rv;
+ struct vb2_shared_data *sd;
/* Initialize the vboot context if it hasn't been yet */
vb2_init_context(ctx);
+ sd = vb2_get_sd(ctx);
/* Initialize NV context */
vb2_nv_init(ctx);
@@ -97,6 +99,21 @@ int vb2api_fw_phase1(struct vb2_context *ctx)
return rv;
}
+ /*
+ * Check for possible reasons to ask the firmware to make display
+ * available. sd->recovery_reason may have been set above by
+ * vb2_check_recovery. VB2_SD_FLAG_DEV_MODE_ENABLED may have been set
+ * above by vb2_check_dev_switch.
+ */
+ if (!(ctx->flags & VB2_CONTEXT_DISPLAY_INIT) &&
+ (vb2_nv_get(ctx, VB2_NV_OPROM_NEEDED) ||
+ sd->flags & VB2_SD_FLAG_DEV_MODE_ENABLED ||
+ sd->recovery_reason))
+ ctx->flags |= VB2_CONTEXT_DISPLAY_INIT;
+ /* Mark display as available for downstream vboot and vboot callers. */
+ if (ctx->flags & VB2_CONTEXT_DISPLAY_INIT)
+ sd->flags |= VB2_SD_FLAG_DISPLAY_AVAILABLE;
+
/* Return error if recovery is needed */
if (ctx->flags & VB2_CONTEXT_RECOVERY_MODE) {
/* Always clear RAM when entering recovery mode */
diff --git a/firmware/2lib/include/2api.h b/firmware/2lib/include/2api.h
index 5edbc506..68fb12bd 100644
--- a/firmware/2lib/include/2api.h
+++ b/firmware/2lib/include/2api.h
@@ -161,6 +161,19 @@ enum vb2_context_flags {
/* Allow vendor data to be set via the vendor data ui. */
VB2_CONTEXT_VENDOR_DATA_SETTABLE = (1 << 19),
+
+ /*
+ * Caller may set this before running vb2api_fw_phase1. In this case,
+ * it means: "Display is available on this boot. Please advertise
+ * as such to downstream vboot code and users."
+ *
+ * vboot may also set this before returning from vb2api_fw_phase1.
+ * In this case, it means: "Please initialize display so that it is
+ * available to downstream vboot code and users." This is used when
+ * vboot encounters some internally-generated request for display
+ * support.
+ */
+ VB2_CONTEXT_DISPLAY_INIT = (1 << 20),
};
/*
diff --git a/firmware/2lib/include/2struct.h b/firmware/2lib/include/2struct.h
index a67518c8..adff0d7b 100644
--- a/firmware/2lib/include/2struct.h
+++ b/firmware/2lib/include/2struct.h
@@ -49,6 +49,9 @@ enum vb2_shared_data_flags {
/* Software sync says EC / PD running RW */
VB2_SD_FLAG_ECSYNC_EC_IN_RW = (1 << 6),
VB2_SD_FLAG_ECSYNC_PD_IN_RW = (1 << 7),
+
+ /* Display is available on this boot */
+ VB2_SD_FLAG_DISPLAY_AVAILABLE = (1 << 8),
};
/* Flags for vb2_shared_data.status */
diff --git a/tests/vb2_api_tests.c b/tests/vb2_api_tests.c
index 64995591..8c31c2ec 100644
--- a/tests/vb2_api_tests.c
+++ b/tests/vb2_api_tests.c
@@ -34,7 +34,7 @@ static const uint8_t mock_hwid_digest[VB2_GBB_HWID_DIGEST_SIZE] = {
};
/* Mocked function data */
-
+static int force_dev_mode;
static int retval_vb2_fw_parse_gbb;
static int retval_vb2_check_dev_switch;
static int retval_vb2_check_tpm_clear;
@@ -61,6 +61,7 @@ static void reset_common_data(enum reset_type t)
vb2_secdata_create(&cc);
vb2_secdata_init(&cc);
+ force_dev_mode = 0;
retval_vb2_fw_parse_gbb = VB2_SUCCESS;
retval_vb2_check_dev_switch = VB2_SUCCESS;
retval_vb2_check_tpm_clear = VB2_SUCCESS;
@@ -79,6 +80,8 @@ int vb2_fw_parse_gbb(struct vb2_context *ctx)
int vb2_check_dev_switch(struct vb2_context *ctx)
{
+ if (force_dev_mode)
+ sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED;
return retval_vb2_check_dev_switch;
}
@@ -121,6 +124,10 @@ static void phase1_tests(void)
TEST_EQ(sd->recovery_reason, 0, " not recovery");
TEST_EQ(cc.flags & VB2_CONTEXT_RECOVERY_MODE, 0, " recovery flag");
TEST_EQ(cc.flags & VB2_CONTEXT_CLEAR_RAM, 0, " clear ram flag");
+ TEST_EQ(cc.flags & VB2_CONTEXT_DISPLAY_INIT,
+ 0, " display init context flag");
+ TEST_EQ(sd->flags & VB2_SD_FLAG_DISPLAY_AVAILABLE,
+ 0, " display available SD flag");
reset_common_data(FOR_MISC);
retval_vb2_fw_parse_gbb = VB2_ERROR_GBB_MAGIC;
@@ -146,6 +153,11 @@ static void phase1_tests(void)
"phase1 dev switch error in recovery");
TEST_EQ(sd->recovery_reason, VB2_RECOVERY_RO_UNSPECIFIED,
" recovery reason");
+ /* Check that DISPLAY_AVAILABLE gets set on recovery mode. */
+ TEST_NEQ(cc.flags & VB2_CONTEXT_DISPLAY_INIT,
+ 0, " display init context flag");
+ TEST_NEQ(sd->flags & VB2_SD_FLAG_DISPLAY_AVAILABLE,
+ 0, " display available SD flag");
reset_common_data(FOR_MISC);
cc.secdata[0] ^= 0x42;
@@ -235,6 +247,31 @@ static void phase1_tests(void)
1, " tpm reboot request");
TEST_EQ(vb2_nv_get(&cc, VB2_NV_RECOVERY_REQUEST), 0,
" recovery request cleared");
+
+ /* Cases for checking DISPLAY_INIT and DISPLAY_AVAILABLE. */
+ reset_common_data(FOR_MISC);
+ cc.flags |= VB2_CONTEXT_DISPLAY_INIT;
+ TEST_SUCC(vb2api_fw_phase1(&cc), "phase1 with DISPLAY_INIT");
+ TEST_NEQ(cc.flags & VB2_CONTEXT_DISPLAY_INIT,
+ 0, " display init context flag");
+ TEST_NEQ(sd->flags & VB2_SD_FLAG_DISPLAY_AVAILABLE,
+ 0, " display available SD flag");
+
+ reset_common_data(FOR_MISC);
+ vb2_nv_set(&cc, VB2_NV_OPROM_NEEDED, 1);
+ TEST_SUCC(vb2api_fw_phase1(&cc), "phase1 with OPROM_NEEDED");
+ TEST_NEQ(cc.flags & VB2_CONTEXT_DISPLAY_INIT,
+ 0, " display init context flag");
+ TEST_NEQ(sd->flags & VB2_SD_FLAG_DISPLAY_AVAILABLE,
+ 0, " display available SD flag");
+
+ reset_common_data(FOR_MISC);
+ force_dev_mode = 1;
+ TEST_SUCC(vb2api_fw_phase1(&cc), "phase1 in dev mode");
+ TEST_NEQ(cc.flags & VB2_CONTEXT_DISPLAY_INIT,
+ 0, " display init context flag");
+ TEST_NEQ(sd->flags & VB2_SD_FLAG_DISPLAY_AVAILABLE,
+ 0, " display available SD flag");
}
static void phase2_tests(void)