diff options
author | Joel Kitching <kitching@google.com> | 2021-07-01 05:29:16 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-07-19 09:21:08 +0000 |
commit | 2d3af1227d6c74733f4e16da424ffaabdfcd23d4 (patch) | |
tree | c316b7cc46ddf876db9267872b84487d03637006 | |
parent | e33704be83614838400368ce5853becab9b88f4f (diff) | |
download | vboot-2d3af1227d6c74733f4e16da424ffaabdfcd23d4.tar.gz |
vboot: add MINIOS_PRIORITY flag to nvstorage
Flag decides whether MINIOS-A or MINIOS-B is booted.
BUG=b:186682292
TEST=make clean && make runtests
TEST=Deploy and run `crossystem minios_priority` commands
BRANCH=none
Signed-off-by: Joel Kitching <kitching@google.com>
Change-Id: I11460bf1522cde8e98e680b0f00a417e2b4ef9a1
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/2998513
Tested-by: Joel Kitching <kitching@chromium.org>
Commit-Queue: Joel Kitching <kitching@chromium.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
-rw-r--r-- | firmware/2lib/2nvstorage.c | 7 | ||||
-rw-r--r-- | firmware/2lib/include/2nvstorage.h | 2 | ||||
-rw-r--r-- | firmware/2lib/include/2nvstorage_fields.h | 5 | ||||
-rw-r--r-- | host/lib/crossystem.c | 10 | ||||
-rw-r--r-- | utility/crossystem.c | 8 |
5 files changed, 26 insertions, 6 deletions
diff --git a/firmware/2lib/2nvstorage.c b/firmware/2lib/2nvstorage.c index 1cd5ba25..0f28404b 100644 --- a/firmware/2lib/2nvstorage.c +++ b/firmware/2lib/2nvstorage.c @@ -209,6 +209,9 @@ uint32_t vb2_nv_get(struct vb2_context *ctx, enum vb2_nv_param param) return GETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_POST_EC_SYNC_DELAY); + case VB2_NV_MINIOS_PRIORITY: + return GETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_MINIOS_PRIORITY); + case VB2_NV_DEPRECATED_DEV_BOOT_FASTBOOT_FULL_CAP: case VB2_NV_DEPRECATED_FASTBOOT_UNLOCK_IN_FW: case VB2_NV_DEPRECATED_ENABLE_ALT_OS_REQUEST: @@ -416,6 +419,10 @@ void vb2_nv_set(struct vb2_context *ctx, SETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_POST_EC_SYNC_DELAY); break; + case VB2_NV_MINIOS_PRIORITY: + SETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_MINIOS_PRIORITY); + break; + case VB2_NV_DEPRECATED_DEV_BOOT_FASTBOOT_FULL_CAP: case VB2_NV_DEPRECATED_FASTBOOT_UNLOCK_IN_FW: case VB2_NV_DEPRECATED_ENABLE_ALT_OS_REQUEST: diff --git a/firmware/2lib/include/2nvstorage.h b/firmware/2lib/include/2nvstorage.h index 2f40b233..fe758230 100644 --- a/firmware/2lib/include/2nvstorage.h +++ b/firmware/2lib/include/2nvstorage.h @@ -125,6 +125,8 @@ enum vb2_nv_param { VB2_NV_POST_EC_SYNC_DELAY, /* Request booting of diagnostic rom. 0=no, 1=yes. */ VB2_NV_DIAG_REQUEST, + /* Priority of miniOS partition to load: 0=MINIOS-A, 1=MINIOS-B. */ + VB2_NV_MINIOS_PRIORITY, }; /* Firmware result codes for VB2_NV_FW_RESULT and VB2_NV_FW_PREV_RESULT */ diff --git a/firmware/2lib/include/2nvstorage_fields.h b/firmware/2lib/include/2nvstorage_fields.h index 9575e87e..449b8fd3 100644 --- a/firmware/2lib/include/2nvstorage_fields.h +++ b/firmware/2lib/include/2nvstorage_fields.h @@ -79,7 +79,7 @@ enum vb2_nv_offset { #define VB2_NV_BOOT_DISABLE_DEV 0x40 #define VB2_NV_BOOT_DEBUG_RESET 0x80 -/* Fields in VB2_NV_OFFS_BOOT2 (unused = 0x00) */ +/* Fields in VB2_NV_OFFS_BOOT2 */ #define VB2_NV_BOOT2_RESULT_MASK 0x03 #define VB2_NV_BOOT2_TRIED 0x04 #define VB2_NV_BOOT2_TRY_NEXT 0x08 @@ -102,11 +102,12 @@ enum vb2_nv_offset { #define VB2_NV_TPM_CLEAR_OWNER_DONE 0x02 #define VB2_NV_TPM_REBOOTED 0x04 -/* Fields in VB2_NV_OFFS_MISC (unused = 0x80) */ +/* Fields in VB2_NV_OFFS_MISC (unused = 0xa0) */ #define VB2_NV_MISC_DEPRECATED_UNLOCK_FASTBOOT 0x01 #define VB2_NV_MISC_BOOT_ON_AC_DETECT 0x02 #define VB2_NV_MISC_TRY_RO_SYNC 0x04 #define VB2_NV_MISC_BATTERY_CUTOFF 0x08 +#define VB2_NV_MISC_MINIOS_PRIORITY 0x10 #define VB2_NV_MISC_POST_EC_SYNC_DELAY 0x40 #endif /* VBOOT_REFERENCE_2NVSTORAGE_FIELDS_H_ */ diff --git a/host/lib/crossystem.c b/host/lib/crossystem.c index 9d23091f..a2c2104a 100644 --- a/host/lib/crossystem.c +++ b/host/lib/crossystem.c @@ -532,6 +532,8 @@ const char *VbGetSystemPropertyString(const char *name, char *dest, return default_boot[v]; else return "unknown"; + } else if (!strcasecmp(name, "minios_priority")) { + return vb2_get_nv_storage(VB2_NV_MINIOS_PRIORITY) ? "B" : "A"; } return NULL; @@ -671,7 +673,13 @@ int VbSetSystemPropertyString(const char* name, const char* value) return vb2_set_nv_storage(VB2_NV_TRY_NEXT, 1); else return -1; - + } else if (!strcasecmp(name, "minios_priority")) { + if (!strcasecmp(value, "A")) + return vb2_set_nv_storage(VB2_NV_MINIOS_PRIORITY, 0); + else if (!strcasecmp(value, "B")) + return vb2_set_nv_storage(VB2_NV_MINIOS_PRIORITY, 1); + else + return -1; } else if (!strcasecmp(name, "fw_result")) { int i; diff --git a/utility/crossystem.c b/utility/crossystem.c index e5774ac2..7781e94e 100644 --- a/utility/crossystem.c +++ b/utility/crossystem.c @@ -53,11 +53,11 @@ const Param sys_param_list[] = { {"post_ec_sync_delay", CAN_WRITE, "Short delay after EC software sync (persistent, writable, eve only)"}, {"fw_prev_result", IS_STRING, "Firmware result of previous boot"}, - {"fw_prev_tried", IS_STRING, "Firmware tried on previous boot"}, + {"fw_prev_tried", IS_STRING, "Firmware tried on previous boot (A or B)"}, {"fw_result", IS_STRING|CAN_WRITE, "Firmware result this boot"}, - {"fw_tried", IS_STRING, "Firmware tried this boot"}, + {"fw_tried", IS_STRING, "Firmware tried this boot (A or B)"}, {"fw_try_count", CAN_WRITE, "Number of times to try fw_try_next"}, - {"fw_try_next", IS_STRING|CAN_WRITE, "Firmware to try next"}, + {"fw_try_next", IS_STRING|CAN_WRITE, "Firmware to try next (A or B)"}, {"fw_vboot2", 0, "1 if firmware was selected by vboot2 or 0 otherwise"}, {"fwb_tries", CAN_WRITE, "Try firmware B count"}, {"fwid", IS_STRING, "Active firmware ID"}, @@ -72,6 +72,8 @@ const Param sys_param_list[] = { {"loc_idx", CAN_WRITE, "Localization index for firmware screens"}, {"mainfw_act", IS_STRING, "Active main firmware"}, {"mainfw_type", IS_STRING, "Active main firmware type"}, + {"minios_priority", IS_STRING|CAN_WRITE, + "miniOS image to try first (A or B)"}, {"nvram_cleared", CAN_WRITE, "Have NV settings been lost? Write 0 to clear"}, {"display_request", CAN_WRITE, "Should we initialize the display at boot?"}, {"phase_enforcement", 0, |