diff options
-rw-r--r-- | firmware/lib/ec_sync_all.c | 74 |
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 |