diff options
author | Mary Ruthven <mruthven@chromium.org> | 2019-04-17 12:53:36 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-04-22 12:28:09 -0700 |
commit | 1aa9ec883ab4cb00e28611e6ad0441858ca18879 (patch) | |
tree | a549ad9c468fdd8e7c333bfa1bfb17c74d4a4bb6 /common/factory_mode.c | |
parent | 2dd77ca46dc00331b8fcfae3c6a2ce42b6e74ad2 (diff) | |
download | chrome-ec-1aa9ec883ab4cb00e28611e6ad0441858ca18879.tar.gz |
factory_mode: refactor factory_enable_failed
Refactor factory_enable_failed, so cr50 always resets if a reset is
requested. This change also renames factory_enable_failed to be more
specific. It renames ccd_hook_active to wait_for_factory_ccd_change so
it's obvious what the variable is doing. It's waiting for the ccd_config
change after we enable factory mode.
Enabling factory mode can fail in a lot of ways, but by the time we
called factory_enable_failed, the failure is specifically about saving
the config. This change renames the function, so the failure is a bit
more specific.
If a reset is required, always reset the system even if saving the
factory config failed. ccd_reset_factory_failed is triggered if the ccd
changed hook isn't triggered quickly enough or if cr50 fails to save the
ccd config. Cr50 has already wiped the TPM and has most likely saved
some if not all of the factory mode state. Cr50 should still reset even
if the config isn't saved to be safe.
enable_ccd_factory_mode isn't used in the process to enable factory mode
during init, so this change won't cause a cr50 reboot loop from cr50
trying and failing to enable factory mode during init. This only affects
the RMA and factory mode enable vendor commands.
BUG=b:129956462
BRANCH=cr50
TEST=Use rma and factory mode vendor commands to enable factory mode.
Change-Id: Ib8a502297040296fb0a2250a9e8945af330d4334
Signed-off-by: Mary Ruthven <mruthven@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1572450
Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com>
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Reviewed-by: Keith Short <keithshort@chromium.org>
Diffstat (limited to 'common/factory_mode.c')
-rw-r--r-- | common/factory_mode.c | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/common/factory_mode.c b/common/factory_mode.c index f2ed77cae6..be6c532304 100644 --- a/common/factory_mode.c +++ b/common/factory_mode.c @@ -15,34 +15,38 @@ #define CPRINTS(format, args...) cprints(CC_CCD, format, ## args) -static uint8_t ccd_hook_active; +static uint8_t wait_for_factory_ccd_change; static uint8_t reset_required_; -static void ccd_config_changed(void) +static void factory_config_saved(int saved) { - if (!ccd_hook_active) - return; + wait_for_factory_ccd_change = 0; - ccd_hook_active = 0; + CPRINTS("%s: %s%s", __func__, saved ? "done" : "failed", + reset_required_ ? ", rebooting" : ""); if (!reset_required_) return; - CPRINTS("%s: saved, rebooting\n", __func__); cflush(); system_reset(SYSTEM_RESET_HARD); } -DECLARE_HOOK(HOOK_CCD_CHANGE, ccd_config_changed, HOOK_PRIO_LAST); -static void factory_enable_failed(void) +static void ccd_config_changed(void) { - ccd_hook_active = 0; - CPRINTS("factory enable failed"); + if (!wait_for_factory_ccd_change) + return; - if (reset_required_) - reset_required_ = 0; + factory_config_saved(1); +} +DECLARE_HOOK(HOOK_CCD_CHANGE, ccd_config_changed, HOOK_PRIO_LAST); + +static void force_system_reset(void) +{ + CPRINTS("%s: ccd hook didn't reset the system"); + factory_config_saved(0); } -DECLARE_DEFERRED(factory_enable_failed); +DECLARE_DEFERRED(force_system_reset); /* The below time constants are way longer than should be required in practice: * @@ -68,17 +72,18 @@ static void factory_enable_deferred(void) CPRINTS("%s: TPM reset done, enabling factory mode", __func__); - ccd_hook_active = 1; + wait_for_factory_ccd_change = 1; rv = ccd_reset_config(CCD_RESET_FACTORY); if (rv != EC_SUCCESS) - factory_enable_failed(); + factory_config_saved(0); if (reset_required_) { /* * Cr50 will reset once factory mode is enabled. If it hasn't in - * TPM_RESET_TIME, declare factory enable failed. + * TPM_RESET_TIME, declare factory enable failed and force the + * reset. */ - hook_call_deferred(&factory_enable_failed_data, TPM_RESET_TIME); + hook_call_deferred(&force_system_reset_data, TPM_RESET_TIME); } } DECLARE_DEFERRED(factory_enable_deferred); |