summaryrefslogtreecommitdiff
path: root/src/security
diff options
context:
space:
mode:
authorTim Wawrzynczak <twawrzynczak@chromium.org>2019-12-06 09:28:29 -0700
committerPatrick Georgi <pgeorgi@google.com>2019-12-09 09:39:29 +0000
commit14dd073e80bc076a6416b613758a592d77521ba2 (patch)
treebc1e01d25f4704e216564aecabf0592113726383 /src/security
parent57aa8e37dc90e7ce53947d1743a0ed47b200982b (diff)
downloadcoreboot-14dd073e80bc076a6416b613758a592d77521ba2.tar.xz
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>
Diffstat (limited to 'src/security')
-rw-r--r--src/security/vboot/ec_sync.c34
1 files changed, 32 insertions, 2 deletions
diff --git a/src/security/vboot/ec_sync.c b/src/security/vboot/ec_sync.c
index 8a3ba71d75..ecceff50f9 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,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);