summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew McRae <amcrae@google.com>2022-03-11 13:50:27 +1100
committerCommit Bot <commit-bot@chromium.org>2022-03-16 08:21:19 +0000
commit4b7897827874770a9eb2bda9a5922a8eef902717 (patch)
treef194f6a92e3fbe6abb4ade0726e7fedfce5c78f1
parente0629f0333e20c49ad0e889dcc983a77719ab909 (diff)
downloadchrome-ec-4b7897827874770a9eb2bda9a5922a8eef902717.tar.gz
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 <amcrae@google.com> Change-Id: Ie4cb4683e6ad4358af7535861cebfd966ef2a456 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3516767 Reviewed-by: Peter Marheine <pmarheine@chromium.org> Reviewed-by: Li1 Feng <li1.feng@intel.com>
-rw-r--r--zephyr/projects/nissa/src/board_power.c23
-rw-r--r--zephyr/subsys/ap_pwrseq/include/ap_power_override_functions.h54
-rw-r--r--zephyr/subsys/ap_pwrseq/include/x86_common_pwrseq.h7
-rw-r--r--zephyr/subsys/ap_pwrseq/x86_non_dsx_adlp_pwrseq_sm.c80
-rw-r--r--zephyr/test/ap_power/src/board.c15
5 files changed, 87 insertions, 92 deletions
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 <ap_power/ap_power.h>
#include <ap_power/ap_power_events.h>
#include <ap_power/ap_power_interface.h>
+#include <ap_power_override_functions.h>
#include <power_signals.h>
#include <x86_power_signals.h>
-#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 <devicetree.h>
+
+/**
+ * @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 <logging/log.h>
+
+#include <ap_power_override_functions.h>
#include <power_signals.h>
#include <x86_power_signals.h>
-#include <logging/log.h>
/**
* @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 <zephyr.h>
#include <ztest.h>
+#include <ap_power_override_functions.h>
+#include <ap_power/ap_power_interface.h>
#include <power_signals.h>
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)
+{
+}