summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/security/vboot/Kconfig9
-rw-r--r--src/security/vboot/bootmode.c15
2 files changed, 24 insertions, 0 deletions
diff --git a/src/security/vboot/Kconfig b/src/security/vboot/Kconfig
index 2d5b20f50d..9d90d1ee92 100644
--- a/src/security/vboot/Kconfig
+++ b/src/security/vboot/Kconfig
@@ -256,6 +256,15 @@ config CBFS_MCACHE_RW_PERCENTAGE
will automatically be 0 (meaning the whole MCACHE is used for RO).
Do NOT change this value for vboot RW updates!
+config VBOOT_CLEAR_RECOVERY_IN_RAMSTAGE
+ bool "Clear the recovery request at the end of ramstage"
+ default n
+ help
+ If this option is enabled, the recovery request will be cleared and
+ saved to VBNV storage at the end of ramstage. This is useful for
+ platforms without vboot-integrated payloads, to avoid being stuck in
+ the recovery mode.
+
config VBOOT_ENABLE_CBFS_FALLBACK
bool
default n
diff --git a/src/security/vboot/bootmode.c b/src/security/vboot/bootmode.c
index 44149af048..745af63f04 100644
--- a/src/security/vboot/bootmode.c
+++ b/src/security/vboot/bootmode.c
@@ -52,6 +52,21 @@ static void do_clear_recovery_mode_switch(void *unused)
BOOT_STATE_INIT_ENTRY(BS_WRITE_TABLES, BS_ON_ENTRY,
do_clear_recovery_mode_switch, NULL);
+#if CONFIG(VBOOT_CLEAR_RECOVERY_IN_RAMSTAGE)
+static void vboot_clear_recovery_request(void *unused)
+{
+ struct vb2_context *ctx;
+
+ ctx = vboot_get_context();
+ vb2api_clear_recovery(ctx);
+ save_vbnv(ctx->nvdata);
+}
+
+/* This has to be called before back_up_vbnv_cmos, so BS_ON_ENTRY is used here. */
+BOOT_STATE_INIT_ENTRY(BS_POST_DEVICE, BS_ON_ENTRY,
+ vboot_clear_recovery_request, NULL);
+#endif
+
int __weak get_recovery_mode_retrain_switch(void)
{
return 0;