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:
Tim Wawrzynczak 2019-12-06 09:28:29 -07:00 committed by Patrick Georgi
parent 57aa8e37dc
commit 14dd073e80
1 changed files with 32 additions and 2 deletions

View File

@ -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);