diff options
author | Joel Kitching <kitching@google.com> | 2019-04-12 11:45:32 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-05-03 07:02:32 -0700 |
commit | e7edff6653e16ed915c3ad12234d133d1ef4dcc9 (patch) | |
tree | c8e8d39ed37ebe1ef339bb0e46b74124293f6238 | |
parent | 6a72e23120a99fab124395d83ba2d511a1a6664e (diff) | |
download | vboot-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.c | 17 | ||||
-rw-r--r-- | firmware/2lib/include/2api.h | 13 | ||||
-rw-r--r-- | firmware/2lib/include/2struct.h | 3 | ||||
-rw-r--r-- | tests/vb2_api_tests.c | 39 |
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) |