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;