Daisuke Nojiri has uploaded this change for review. ( https://review.coreboot.org/21711
Change subject: Fizz: Continue booting with EC in RW for EC-EFS ......................................................................
Fizz: Continue booting with EC in RW for EC-EFS
If EC does EFS, it jumps to RW in all cases except when recovery is requested manually. This patch makes Coreboot on EC-EFS systems check whether EC is running in RO or not only when recovery is requested manually.
BUG=b:66516882 BRANCH=none TEST=Boot Fizz.
Change-Id: I45a874b73c46ea88cb831485757d194faa9f4c99 Signed-off-by: Daisuke Nojiri dnojiri@chromium.org --- M src/ec/google/chromeec/ec.c M src/vboot/bootmode.c M src/vboot/vboot_common.h 3 files changed, 17 insertions(+), 2 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/11/21711/1
diff --git a/src/ec/google/chromeec/ec.c b/src/ec/google/chromeec/ec.c index 03d4c3b..1783281 100644 --- a/src/ec/google/chromeec/ec.c +++ b/src/ec/google/chromeec/ec.c @@ -668,6 +668,15 @@
static int ec_image_type; /* Cached EC image type (ro or rw). */
+static +int need_ec_in_ro(void) +{ + if (IS_ENABLED(CONFIG_VBOOT_EC_EFS)) + return vboot_recovery_mode_enabled_manually(); + else + return vboot_recovery_mode_enabled(); +} + void google_chromeec_init(void) { struct chromeec_command cec_cmd; @@ -698,8 +707,7 @@ }
if (cec_cmd.cmd_code || - (vboot_recovery_mode_enabled() && - (cec_resp.current_image != EC_IMAGE_RO))) { + (need_ec_in_ro() && (cec_resp.current_image != EC_IMAGE_RO))) { /* Reboot the EC and make it come back in RO mode */ printk(BIOS_DEBUG, "Rebooting with EC in RO mode:\n"); post_code(0); /* clear current post code */ diff --git a/src/vboot/bootmode.c b/src/vboot/bootmode.c index 1207448..23285dd 100644 --- a/src/vboot/bootmode.c +++ b/src/vboot/bootmode.c @@ -141,6 +141,11 @@ return !!vboot_check_recovery_request(); }
+int vboot_recovery_mode_enabled_manually(void) +{ + return vboot_check_recovery_request() == VB2_RECOVERY_RO_MANUAL; +} + int __attribute__((weak)) clear_recovery_mode_switch(void) { // Weak implementation. Nothing to do. diff --git a/src/vboot/vboot_common.h b/src/vboot/vboot_common.h index 8c92f7f..1636a5e 100644 --- a/src/vboot/vboot_common.h +++ b/src/vboot/vboot_common.h @@ -108,10 +108,12 @@ #if IS_ENABLED(CONFIG_VBOOT) int vboot_developer_mode_enabled(void); int vboot_recovery_mode_enabled(void); +int vboot_recovery_mode_enabled_manually(void); int vboot_recovery_mode_memory_retrain(void); #else /* !CONFIG_VBOOT */ static inline int vboot_developer_mode_enabled(void) { return 0; } static inline int vboot_recovery_mode_enabled(void) { return 0; } +static inline int vboot_recovery_mode_enabled_manually(void) { return 0; } static inline int vboot_recovery_mode_memory_retrain(void) { return 0; } #endif