diff options
author | Andrew McRae <amcrae@google.com> | 2022-04-14 23:33:04 +1000 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-04-28 01:44:46 +0000 |
commit | b245a5459af01e1c66568466c1477dd907efa2eb (patch) | |
tree | 8ddf24164e256802b2e23cfce9329f08566a1407 /zephyr/subsys/ap_pwrseq/x86_non_dsx_common_pwrseq_sm_handler.c | |
parent | 496d601b8b7f487a3373beee2e3909304c979d7e (diff) | |
download | chrome-ec-b245a5459af01e1c66568466c1477dd907efa2eb.tar.gz |
zephyr: ap_pwrseq: Sync CPU state with signals
Synchronize the CPU state by checking the power signals.
BUG=b:227970724
TEST=zmake build nivviks; flash & run
BRANCH=none
Cq-Depend: chromium:3607315
Signed-off-by: Andrew McRae <amcrae@google.com>
Change-Id: Ice983c9be114076d5925ef94a2b1f9a6e6742506
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3586792
Reviewed-by: Vijay P Hiremath <vijay.p.hiremath@intel.com>
Reviewed-by: Peter Marheine <pmarheine@chromium.org>
Diffstat (limited to 'zephyr/subsys/ap_pwrseq/x86_non_dsx_common_pwrseq_sm_handler.c')
-rw-r--r-- | zephyr/subsys/ap_pwrseq/x86_non_dsx_common_pwrseq_sm_handler.c | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/zephyr/subsys/ap_pwrseq/x86_non_dsx_common_pwrseq_sm_handler.c b/zephyr/subsys/ap_pwrseq/x86_non_dsx_common_pwrseq_sm_handler.c index fc1e900edd..f6d93fe655 100644 --- a/zephyr/subsys/ap_pwrseq/x86_non_dsx_common_pwrseq_sm_handler.c +++ b/zephyr/subsys/ap_pwrseq/x86_non_dsx_common_pwrseq_sm_handler.c @@ -421,13 +421,56 @@ static int common_pwr_sm_run(int state) return state; } +/* + * Determine the current CPU state and ensure it + * is matching what is required. + */ +static void pwr_seq_set_initial_state(void) +{ + uint32_t reset_flags = system_get_reset_flags(); + /* Determine current state using chipset specific handler */ + enum power_states_ndsx state = chipset_pwr_seq_get_state(); + + /* + * Check reset flags, and ensure CPU is in correct state. + */ + if (reset_flags & EC_RESET_FLAG_AP_OFF) { + /* + * AP is expected to be off. + * If it isn't, force shutdown. + */ + if (state != SYS_POWER_STATE_G3) { + ap_power_force_shutdown(AP_POWER_SHUTDOWN_G3); + } + pwr_sm_set_state(SYS_POWER_STATE_G3); + return; + } + /* + * Not in warm boot, but CPU is not shutdown. + */ + if (((reset_flags & EC_RESET_FLAG_SYSJUMP) == 0) && + (state != SYS_POWER_STATE_G3)) { + ap_power_force_shutdown(AP_POWER_SHUTDOWN_G3); + state = SYS_POWER_STATE_G3; + } + /* + * If CPU is off, set the state to start powering it up. + */ + if (state == SYS_POWER_STATE_G3) { + state = SYS_POWER_STATE_G3S5; + } + pwr_sm_set_state(state); +} + static void pwrseq_loop_thread(void *p1, void *p2, void *p3) { int32_t t_wait_ms = 10; enum power_states_ndsx curr_state, new_state; power_signal_mask_t this_in_signals; power_signal_mask_t last_in_signals = 0; - enum power_states_ndsx last_state = pwr_sm_get_state(); + enum power_states_ndsx last_state = -1; + + pwr_seq_set_initial_state(); while (1) { curr_state = pwr_sm_get_state(); @@ -495,8 +538,6 @@ static void init_pwr_seq_state(void) { init_chipset_pwr_seq_state(); request_exit_hardoff(false); - - pwr_sm_set_state(SYS_POWER_STATE_G3S5); } /* Initialize power sequence system state */ @@ -506,7 +547,6 @@ static int pwrseq_init(const struct device *dev) /* Initialize signal handlers */ power_signal_init(); - /* TODO: Define initial state of power sequence */ LOG_DBG("Init pwr seq state"); init_pwr_seq_state(); /* Create power sequence state handler core function thread */ |