diff options
Diffstat (limited to 'firmware/lib/ec_sync_all.c')
-rw-r--r-- | firmware/lib/ec_sync_all.c | 78 |
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 |