diff options
-rw-r--r-- | firmware/lib/ec_sync_all.c | 32 | ||||
-rw-r--r-- | tests/ec_sync_tests.c | 9 |
2 files changed, 26 insertions, 15 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; diff --git a/tests/ec_sync_tests.c b/tests/ec_sync_tests.c index 1822fd75..3a820de0 100644 --- a/tests/ec_sync_tests.c +++ b/tests/ec_sync_tests.c @@ -431,23 +431,24 @@ static void VbSoftwareSyncTest(void) ResetMocks(); ec_aux_fw_mock_severity = VB_AUX_FW_FAST_UPDATE; - test_ssync(VBERROR_SUCCESS, 0, + test_ssync(VBERROR_EC_REBOOT_TO_RO_REQUIRED, 0, "Fast auxiliary FW update needed"); TEST_EQ(screens_count, 0, " wait screen skipped"); TEST_EQ(ec_aux_fw_update_req, 1, " aux fw update requested"); - TEST_EQ(ec_aux_fw_protected, 1, " aux fw protected"); + TEST_EQ(ec_aux_fw_protected, 0, " aux fw protected"); ResetMocks(); ec_aux_fw_mock_severity = VB_AUX_FW_SLOW_UPDATE; - test_ssync(VBERROR_SUCCESS, 0, + test_ssync(VBERROR_EC_REBOOT_TO_RO_REQUIRED, 0, "Slow auxiliary FW update needed"); TEST_EQ(ec_aux_fw_update_req, 1, " aux fw update requested"); - TEST_EQ(ec_aux_fw_protected, 1, " aux fw protected"); + TEST_EQ(ec_aux_fw_protected, 0, " aux fw protected"); TEST_EQ(screens_displayed[0], VB_SCREEN_WAIT, " wait screen forced"); ResetMocks(); + ec_aux_fw_mock_severity = VB_AUX_FW_FAST_UPDATE; ec_aux_fw_retval = VBERROR_UNKNOWN; test_ssync(VBERROR_UNKNOWN, VB2_RECOVERY_AUX_FW_UPDATE, "Error updating AUX firmware"); |