summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/lib/ec_sync_all.c74
1 files changed, 46 insertions, 28 deletions
diff --git a/firmware/lib/ec_sync_all.c b/firmware/lib/ec_sync_all.c
index fca9f9b4..b2506779 100644
--- a/firmware/lib/ec_sync_all.c
+++ b/firmware/lib/ec_sync_all.c
@@ -37,45 +37,49 @@ static VbError_t ec_sync_disable_display(struct vb2_context *ctx,
return VBERROR_SUCCESS;
}
+static int check_reboot_for_display(struct vb2_context *ctx,
+ struct vb2_shared_data *sd)
+{
+ if (!(sd->flags & VB2_SD_FLAG_DISPLAY_AVAILABLE)) {
+ VB2_DEBUG("Reboot to initialize display\n");
+ vb2_nv_set(ctx, VB2_NV_DISPLAY_REQUEST, 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, NULL);
+}
+
VbError_t ec_sync_all(struct vb2_context *ctx)
{
struct vb2_shared_data *sd = vb2_get_sd(ctx);
- 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 initialize the display 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_display = (need_wait_screen &&
- !(sd->flags & VB2_SD_FLAG_DISPLAY_AVAILABLE));
- if (reboot_for_display) {
- VB2_DEBUG("Reboot to initialize display\n");
- vb2_nv_set(ctx, VB2_NV_DISPLAY_REQUEST, 1);
- }
-
- /* Reboot if phase 1 needed it, or if we need to initialize display */
- 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_display(ctx, sd);
return VBERROR_EC_REBOOT_TO_RO_REQUIRED;
- if (reboot_for_display)
- return VBERROR_REBOOT_REQUIRED;
+ }
- /* 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, NULL);
+ /* Might still need display in that case */
+ if (check_reboot_for_display(ctx, sd))
+ 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 */
@@ -83,6 +87,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_display(ctx, sd))
+ 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