summaryrefslogtreecommitdiff
path: root/firmware/lib/ec_sync_all.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/lib/ec_sync_all.c')
-rw-r--r--firmware/lib/ec_sync_all.c78
1 files changed, 49 insertions, 29 deletions
diff --git a/firmware/lib/ec_sync_all.c b/firmware/lib/ec_sync_all.c
index 36d9e727..96e0d83c 100644
--- a/firmware/lib/ec_sync_all.c
+++ b/firmware/lib/ec_sync_all.c
@@ -39,47 +39,53 @@ static VbError_t ec_sync_unload_oprom(struct vb2_context *ctx,
return VBERROR_SUCCESS;
}
+static int check_reboot_for_oprom(struct vb2_context *ctx,
+ VbSharedDataHeader *shared)
+{
+ int reboot_for_oprom = shared->flags & VBSD_OPROM_MATTERS &&
+ !(shared->flags & VBSD_OPROM_LOADED);
+
+ if (reboot_for_oprom) {
+ VB2_DEBUG("Reboot to load VGA Option ROM\n");
+ vb2_nv_set(ctx, VB2_NV_OPROM_NEEDED, 1);
+ return 1;
+ }
+ return 0;
+}
+
+static void display_wait_screen(struct vb2_context *ctx, const char *fw_name)
+{
+ VB2_DEBUG("%s update is slow. Show WAIT screen.\n", fw_name);
+ VbDisplayScreen(ctx, VB_SCREEN_WAIT, 0);
+}
+
VbError_t ec_sync_all(struct vb2_context *ctx)
{
struct vb2_shared_data *sd = vb2_get_sd(ctx);
VbSharedDataHeader *shared = sd->vbsd;
- VbAuxFwUpdateSeverity_t fw_update;
+ VbAuxFwUpdateSeverity_t fw_update = VB_AUX_FW_NO_UPDATE;
VbError_t rv;
- rv = ec_sync_check_aux_fw(ctx, &fw_update);
- if (rv)
- return rv;
-
/* Phase 1; this determines if we need an update */
VbError_t phase1_rv = ec_sync_phase1(ctx);
- int need_wait_screen = ec_will_update_slowly(ctx) ||
- (fw_update == VB_AUX_FW_SLOW_UPDATE);
+ int need_wait_screen = ec_will_update_slowly(ctx);
- /*
- * Check if we need to reboot to load the VGA Option ROM before we can
- * display the WAIT screen.
- *
- * Do this before we check if ec_sync_phase1() requires a reboot for
- * some other reason, since there's no reason to reboot twice.
- */
- int reboot_for_oprom = (need_wait_screen &&
- shared->flags & VBSD_OPROM_MATTERS &&
- !(shared->flags & VBSD_OPROM_LOADED));
- if (reboot_for_oprom) {
- VB2_DEBUG("Reboot to load VGA Option ROM\n");
- vb2_nv_set(ctx, VB2_NV_OPROM_NEEDED, 1);
- }
-
- /* Reboot if phase 1 needed it, or if we need to load VGA Option ROM */
- if (phase1_rv)
+ /* Check if EC SW Sync Phase1 needs reboot */
+ if (phase1_rv) {
+ ec_sync_check_aux_fw(ctx, &fw_update);
+ /* It does -- speculatively check if we need display as well */
+ if (need_wait_screen || fw_update == VB_AUX_FW_SLOW_UPDATE)
+ check_reboot_for_oprom(ctx, shared);
return VBERROR_EC_REBOOT_TO_RO_REQUIRED;
- if (reboot_for_oprom)
- return VBERROR_VGA_OPROM_MISMATCH;
+ }
- /* Display the wait screen if we need it */
+ /* Is EC already in RO and needs slow update? */
if (need_wait_screen) {
- VB2_DEBUG("EC is slow. Show WAIT screen.\n");
- VbDisplayScreen(ctx, VB_SCREEN_WAIT, 0);
+ /* Might still need display in that case */
+ if (check_reboot_for_oprom(ctx, shared))
+ return VBERROR_REBOOT_REQUIRED;
+ /* Display is available, so pop up the wait screen */
+ display_wait_screen(ctx, "EC FW");
}
/* Phase 2; Applies update and/or jumps to the correct EC image */
@@ -87,6 +93,20 @@ VbError_t ec_sync_all(struct vb2_context *ctx)
if (rv)
return rv;
+ /* EC in RW, now we can check the severity of the AUX FW update */
+ rv = ec_sync_check_aux_fw(ctx, &fw_update);
+ if (rv)
+ return rv;
+
+ /* If AUX FW update is slow display the wait screen */
+ if (fw_update == VB_AUX_FW_SLOW_UPDATE) {
+ need_wait_screen = 1;
+ /* Display should be available, but better check again */
+ if (check_reboot_for_oprom(ctx, shared))
+ return VBERROR_REBOOT_REQUIRED;
+ display_wait_screen(ctx, "AUX FW");
+ }
+
/*
* Do Aux FW software sync and protect devices tunneled through the EC.
* Aux FW update may request RO reboot to force EC cold reset so also