From 4b7897827874770a9eb2bda9a5922a8eef902717 Mon Sep 17 00:00:00 2001 From: Andrew McRae Date: Fri, 11 Mar 2022 13:50:27 +1100 Subject: ap_pwrseq: Remove overridable weak functions Temporary hard-coded board level functions and removal of weak default functions. This will be refactored with a more extensible callback mechanism providing a more general solution. BUG=b:223923728 TEST=zmake build nivviks BRANCH=none Signed-off-by: Andrew McRae Change-Id: Ie4cb4683e6ad4358af7535861cebfd966ef2a456 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3516767 Reviewed-by: Peter Marheine Reviewed-by: Li1 Feng --- zephyr/projects/nissa/src/board_power.c | 23 +++---- .../include/ap_power_override_functions.h | 54 +++++++++++++++ .../subsys/ap_pwrseq/include/x86_common_pwrseq.h | 7 +- .../subsys/ap_pwrseq/x86_non_dsx_adlp_pwrseq_sm.c | 80 ++-------------------- zephyr/test/ap_power/src/board.c | 15 ++++ 5 files changed, 87 insertions(+), 92 deletions(-) create mode 100644 zephyr/subsys/ap_pwrseq/include/ap_power_override_functions.h diff --git a/zephyr/projects/nissa/src/board_power.c b/zephyr/projects/nissa/src/board_power.c index 895d26ab72..d4576f1f67 100644 --- a/zephyr/projects/nissa/src/board_power.c +++ b/zephyr/projects/nissa/src/board_power.c @@ -10,11 +10,11 @@ #include #include #include +#include #include #include -#include "chipset.h" -#include "hooks.h" +#include "gpio_signal.h" #include "gpio/gpio.h" LOG_MODULE_DECLARE(ap_pwrseq, LOG_LEVEL_INF); @@ -32,8 +32,7 @@ static void generate_ec_soc_dsw_pwrok_handler(int delay) } } -/* Override */ -void ap_power_force_shutdown(enum ap_power_shutdown_reason reason) +void board_ap_power_force_shutdown(void) { int timeout_ms = X86_NON_DSX_ADLP_NONPWRSEQ_FORCE_SHUTDOWN_TO_MS; @@ -65,27 +64,27 @@ void ap_power_force_shutdown(enum ap_power_shutdown_reason reason) if (power_signal_get(PWR_DSW_PWROK)) LOG_WRN("DSW_PWROK didn't go low! Assuming G3."); - ap_power_ev_send_callbacks(AP_POWER_SHUTDOWN); } -/* Override */ -void g3s5_action_handler(int delay, int signal_timeout) +void board_ap_power_action_g3_s5(void) { LOG_DBG("Turning on PWR_EN_PP5000_A and PWR_EN_PP3300_A"); power_signal_set(PWR_EN_PP5000_A, 1); power_signal_set(PWR_EN_PP3300_A, 1); - power_wait_signals_timeout(IN_PGOOD_ALL_CORE, signal_timeout); + power_wait_signals_timeout(IN_PGOOD_ALL_CORE, + AP_PWRSEQ_DT_VALUE(wait_signal_timeout)); - generate_ec_soc_dsw_pwrok_handler(delay); + generate_ec_soc_dsw_pwrok_handler( + AP_PWRSEQ_DT_VALUE(dsw_pwrok_delay)); } -/* Override */ -int generate_pch_pwrok_handler(int delay) + +int board_ap_power_assert_pch_power_ok(void) { /* Pass though PCH_PWROK */ if (power_signal_get(PWR_PCH_PWROK) == 0) { - k_msleep(delay); + k_msleep(AP_PWRSEQ_DT_VALUE(pch_pwrok_delay)); power_signal_set(PWR_PCH_PWROK, 1); } diff --git a/zephyr/subsys/ap_pwrseq/include/ap_power_override_functions.h b/zephyr/subsys/ap_pwrseq/include/ap_power_override_functions.h new file mode 100644 index 0000000000..3bf453ffba --- /dev/null +++ b/zephyr/subsys/ap_pwrseq/include/ap_power_override_functions.h @@ -0,0 +1,54 @@ +/* Copyright 2022 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/** + * @file + * @brief Declare functions that are supplied externally. + * The functions are all prepended with board_ap_power_ to indicate + * they have external implementations. + * + * TODO(b/223923728): Longer term, a framework should be put in place to + * allow extensibility for selected functions. + * + * The external functions may need to access + * devicetree properties for values such + * as timeouts etc. + */ + +#ifndef __AP_PWRSEQ_AP_POWER_BOARD_FUNCTIONS_H__ +#define __AP_PWRSEQ_AP_POWER_BOARD_FUNCTIONS_H__ + +#include + +/** + * @brief Force AP shutdown + * + * Immediately shut down the AP. + */ +void board_ap_power_force_shutdown(void); + +/** + * @brief Called to transition from G3 to S5 + * + * Action to start transition from G3 to S5. + * Usually involves enabling the main power rails. + */ +void board_ap_power_action_g3_s5(void); + +/** + * @brief Assert PCH power OK signal to AP + * + * @return 0 Success + * @return -1 Timeout or error + */ +int board_ap_power_assert_pch_power_ok(void); + +/** + * @brief macro to access configuration properties from DTS + */ +#define AP_PWRSEQ_DT_VALUE(p) \ + DT_PROP(DT_COMPAT_GET_ANY_STATUS_OKAY(intel_ap_pwrseq), p) \ + +#endif /* __AP_PWRSEQ_AP_POWER_BOARD_FUNCTIONS_H__ */ diff --git a/zephyr/subsys/ap_pwrseq/include/x86_common_pwrseq.h b/zephyr/subsys/ap_pwrseq/include/x86_common_pwrseq.h index fd84ac49ce..1f416342ba 100644 --- a/zephyr/subsys/ap_pwrseq/include/x86_common_pwrseq.h +++ b/zephyr/subsys/ap_pwrseq/include/x86_common_pwrseq.h @@ -6,9 +6,11 @@ #ifndef __X86_COMMON_PWRSEQ_H__ #define __X86_COMMON_PWRSEQ_H__ +#include + +#include #include #include -#include /** * @brief System power states for Non Deep Sleep Well @@ -67,7 +69,4 @@ struct pwrseq_context { }; -#define AP_PWRSEQ_DT_VALUE(p) \ - DT_PROP(DT_COMPAT_GET_ANY_STATUS_OKAY(intel_ap_pwrseq), p) - #endif /* __X86_COMMON_PWRSEQ_H__ */ diff --git a/zephyr/subsys/ap_pwrseq/x86_non_dsx_adlp_pwrseq_sm.c b/zephyr/subsys/ap_pwrseq/x86_non_dsx_adlp_pwrseq_sm.c index 8fcc33070f..3a7be5c155 100644 --- a/zephyr/subsys/ap_pwrseq/x86_non_dsx_adlp_pwrseq_sm.c +++ b/zephyr/subsys/ap_pwrseq/x86_non_dsx_adlp_pwrseq_sm.c @@ -49,44 +49,6 @@ int all_sys_pwrgd_handler(void) return 0; } -/* - * We have asserted VCCST_PWRGO_OD, now wait for the IMVP9.1 - * to assert IMVP9_VRRDY_OD. - * - * Returns state of VRRDY. - */ - -static int wait_for_vrrdy(void) -{ - int timeout_ms = AP_PWRSEQ_DT_VALUE(vrrdy_timeout); - - for (; timeout_ms > 0; --timeout_ms) { - if (power_signal_get(PWR_IMVP9_VRRDY) != 0) - return 1; - k_msleep(1); - } - return 0; -} - -/* PCH_PWROK to PCH from EC */ -__attribute__((weak)) int generate_pch_pwrok_handler(int delay) -{ - /* Enable PCH_PWROK, gated by VRRDY. */ - if (power_signal_get(PWR_PCH_PWROK) == 0) { - if (wait_for_vrrdy() == 0) { - LOG_DBG("Timed out waiting for VRRDY, " - "shutting AP off!"); - ap_off(); - return -1; - } - k_msleep(delay); - power_signal_set(PWR_PCH_PWROK, 1); - LOG_DBG("Turning on PCH_PWROK"); - } - - return 0; -} - /* Generate SYS_PWROK->SOC if needed by system */ void generate_sys_pwrok_handler(void) { @@ -128,7 +90,7 @@ void s0_action_handler(void) /* TODO: There is possibility of EC not needing to generate * this as power sequencer may do it */ - ret = generate_pch_pwrok_handler(AP_PWRSEQ_DT_VALUE(pch_pwrok_delay)); + ret = board_ap_power_assert_pch_power_ok(); if (ret) { LOG_DBG("PCH_PWROK handling failed err=%d", ret); return; @@ -178,45 +140,12 @@ void ap_power_reset(enum ap_power_shutdown_reason reason) ap_power_ev_send_callbacks(AP_POWER_RESET); } -__attribute__((weak)) void ap_power_force_shutdown( - enum ap_power_shutdown_reason reason) +void ap_power_force_shutdown(enum ap_power_shutdown_reason reason) { - int timeout_ms = 50; - - /* TODO: below - * report_ap_reset(reason); - */ - - /* Turn off RMSRST_L to meet tPCH12 */ - LOG_INF("Turning on PWR_EC_PCH_RSMRST"); - power_signal_set(PWR_EC_PCH_RSMRST, 1); - - /* Turn off S5 rails */ - LOG_INF("Turning off PWR_EN_PP5000_A"); - power_signal_set(PWR_EN_PP5000_A, 0); - - /* - * TODO(b/179519791): Replace this wait with - * power_wait_signals_timeout() - */ - /* Now wait for DSW_PWROK and RSMRST_ODL to go away. */ - while (power_signal_get(PWR_DSW_PWROK) && - (power_signal_get(PWR_RSMRST) == 0) && - (timeout_ms > 0)) { - k_msleep(1); - timeout_ms--; - }; - - if (!timeout_ms) - LOG_DBG("DSW_PWROK or RSMRST_ODL didn't go low! Assuming G3."); + board_ap_power_force_shutdown(); ap_power_ev_send_callbacks(AP_POWER_SHUTDOWN); } -__attribute__((weak)) void g3s5_action_handler(int delay, int timeout) -{ - power_signal_set(PWR_EN_PP5000_A, 1); -} - void s3s0_action_handler(void) { } @@ -238,8 +167,7 @@ enum power_states_ndsx chipset_pwr_sm_run(enum power_states_ndsx curr_state) /* Add chipset specific state handling if any */ switch (curr_state) { case SYS_POWER_STATE_G3S5: - g3s5_action_handler(AP_PWRSEQ_DT_VALUE(dsw_pwrok_delay), - AP_PWRSEQ_DT_VALUE(wait_signal_timeout)); + board_ap_power_action_g3_s5(); break; case SYS_POWER_STATE_S5: break; diff --git a/zephyr/test/ap_power/src/board.c b/zephyr/test/ap_power/src/board.c index 10b5cf032b..ca2c774185 100644 --- a/zephyr/test/ap_power/src/board.c +++ b/zephyr/test/ap_power/src/board.c @@ -6,6 +6,8 @@ #include #include +#include +#include #include static bool signal_PWR_ALL_SYS_PWRGD; @@ -50,3 +52,16 @@ int board_power_signal_get(enum power_signal signal) return signal_PWR_PG_PP1P05; } } + +void board_ap_power_force_shutdown(void) +{ +} + +int board_ap_power_assert_pch_power_ok(void) +{ + return 0; +} + +void board_ap_power_action_g3_s5(void) +{ +} -- cgit v1.2.1