diff options
Diffstat (limited to 'firmware/lib/ec_sync_all.c')
-rw-r--r-- | firmware/lib/ec_sync_all.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/firmware/lib/ec_sync_all.c b/firmware/lib/ec_sync_all.c index 96e0d83c..e38dafb8 100644 --- a/firmware/lib/ec_sync_all.c +++ b/firmware/lib/ec_sync_all.c @@ -64,7 +64,7 @@ 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 = VB_AUX_FW_NO_UPDATE; - VbError_t rv; + VbError_t rv, update_aux_fw_rv = VBERROR_SUCCESS; /* Phase 1; this determines if we need an update */ VbError_t phase1_rv = ec_sync_phase1(ctx); @@ -107,19 +107,29 @@ VbError_t ec_sync_all(struct vb2_context *ctx) 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 - * unload the option ROM if needed to prevent a second reboot. - */ - rv = ec_sync_update_aux_fw(ctx); - if (rv) { - ec_sync_unload_oprom(ctx, shared, need_wait_screen); - return rv; + /* Do Aux FW software sync */ + if (fw_update > VB_AUX_FW_NO_UPDATE) { + update_aux_fw_rv = ec_sync_update_aux_fw(ctx); + /* + * If requesting EC reboot to RO (because some tunnels are + * protected), do not disable the display to avoid reboot + * during display re-init. + */ + if (update_aux_fw_rv == VBERROR_EC_REBOOT_TO_RO_REQUIRED) + return update_aux_fw_rv; } - /* Reboot to unload VGA Option ROM if needed */ + /* Reboot to unload VGA Option ROM for both slow EC & AUX FW updates */ rv = ec_sync_unload_oprom(ctx, shared, need_wait_screen); + /* Something went wrong during AUX FW update */ + if (update_aux_fw_rv) + return update_aux_fw_rv; + /* + * AUX FW Update is applied successfully. Request EC reboot to RO, + * so that the chips that had FW update gets reset to a clean state. + */ + if (fw_update > VB_AUX_FW_NO_UPDATE) + return VBERROR_EC_REBOOT_TO_RO_REQUIRED; if (rv) return rv; |