Tim Wawrzynczak has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/37562 )
Change subject: EC sync: Properly handle VBERROR return codes from vb2api_ec_sync ......................................................................
EC sync: Properly handle VBERROR return codes from vb2api_ec_sync
Some return codes were missed when implementing this initially; the vboot logic can require the system to command the EC to reboot to its RO, switch RW slots or it can require a poweroff of the SoC. This patch appropriately handles these return codes.
BUG=b:145768046 BRANCH=firmware-hatch-12672.B TEST=ODM verified this patch fixes the issues seen.
Change-Id: I2748cf626d49c255cb0274cb336b072dcdf8cded Signed-off-by: Tim Wawrzynczak twawrzynczak@chromium.org --- M src/security/vboot/ec_sync.c 1 file changed, 37 insertions(+), 2 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/62/37562/1
diff --git a/src/security/vboot/ec_sync.c b/src/security/vboot/ec_sync.c index 8a3ba71..6ef2edb 100644 --- a/src/security/vboot/ec_sync.c +++ b/src/security/vboot/ec_sync.c @@ -16,6 +16,7 @@ #include <console/console.h> #include <delay.h> #include <ec/google/chromeec/ec.h> +#include <halt.h> #include <security/vboot/misc.h> #include <security/vboot/vbnv.h> #include <security/vboot/vboot_common.h> @@ -60,9 +61,43 @@ retval = vb2api_ec_sync(ctx); vboot_save_nvdata_only(ctx);
- if (retval != VB2_SUCCESS) { - printk(BIOS_ERR, "EC software sync failed (%#x), rebooting\n", retval); + switch (retval) { + case VBERROR_EC_REBOOT_TO_RO_REQUIRED: + printk(BIOS_INFO, "EC Reboot requested. Doing cold reboot\n"); + if (google_chromeec_reboot(0, EC_REBOOT_COLD, + EC_REBOOT_FLAG_ON_AP_SHUTDOWN)) + vboot_reboot(); + else + poweroff(); + break; + + case VBERROR_EC_REBOOT_TO_SWITCH_RW: + printk(BIOS_INFO, "Switch EC slot requested. Doing cold" + "reboot\n"); + if (google_chromeec_reboot(0, EC_REBOOT_COLD, + EC_REBOOT_FLAG_SWITCH_RW_SLOT)) + vboot_reboot(); + else + poweroff(); + break; + + case VBERROR_SHUTDOWN_REQUESTED: + printk(BIOS_INFO, "EC requests shutdown, halting\n"); + poweroff(); + break; + + case VBERROR_REBOOT_REQUIRED: + printk(BIOS_INFO, "Reboot requested. Doing warm reboot\n"); vboot_reboot(); + break; + + default: + if (retval != VB2_SUCCESS) { + printk(BIOS_ERR, "EC software sync failed (%#x)," + " rebooting\n", retval); + vboot_reboot(); + } + break; }
timestamp_add_now(TS_END_EC_SYNC);