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> Reviewed-on: https://review.coreboot.org/c/coreboot/+/37562 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Julius Werner <jwerner@chromium.org>
This commit is contained in:
parent
57aa8e37dc
commit
14dd073e80
|
@ -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,38 @@ void vboot_sync_ec(void)
|
|||
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 VB2_SUCCESS:
|
||||
break;
|
||||
|
||||
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, 0))
|
||||
printk(BIOS_EMERG, "Failed to get EC to cold reboot\n");
|
||||
|
||||
halt();
|
||||
break;
|
||||
|
||||
/* Only for EC-EFS */
|
||||
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))
|
||||
printk(BIOS_EMERG, "Failed to get EC to cold reboot\n");
|
||||
|
||||
halt();
|
||||
break;
|
||||
|
||||
case VBERROR_REBOOT_REQUIRED:
|
||||
printk(BIOS_INFO, "Reboot requested. Doing warm reboot\n");
|
||||
vboot_reboot();
|
||||
break;
|
||||
|
||||
default:
|
||||
printk(BIOS_ERR, "EC software sync failed (%#x),"
|
||||
" rebooting\n", retval);
|
||||
vboot_reboot();
|
||||
break;
|
||||
}
|
||||
|
||||
timestamp_add_now(TS_END_EC_SYNC);
|
||||
|
|
Loading…
Reference in New Issue