summaryrefslogtreecommitdiff
path: root/board/hatch_fp
diff options
context:
space:
mode:
authorCraig Hesling <hesling@chromium.org>2021-07-07 22:23:22 -0700
committerCommit Bot <commit-bot@chromium.org>2021-08-09 18:45:02 +0000
commit580dad3d9956d55565ed5db9e5de9851df9c437b (patch)
tree102a2295602f423675250506a5eadf320edd1be1 /board/hatch_fp
parent8a9102efc3506b14b0ce275d0e2a05653587cfc5 (diff)
downloadchrome-ec-580dad3d9956d55565ed5db9e5de9851df9c437b.tar.gz
bloonchipper: Reintroduce sleep lines to RO
Change https://crrev.com/c/2673909 removed the sleep lines from RO in an effort to minimize the RO complexity. Most notably, this isolated the deep-sleep/low-power-idle logic to RW only. Unfortunately, the sleep lines also control whether the SPI host interface is listening, which allows it to ignore spurious communication. It seems safer to reinstate the the sleep line with low power idle active and directly disable CONFIG_LOW_POWER_IDLE in subsequent CL. We reinstate the sleep line gpio logic from the following: https://crrev.com/c5545464431669029f42829d542fa491d767ee5f/board/hatch_fp/board.c This is the parent commit to the CL that refactors the sleep lines. BRANCH=none BUG=b:178746753 TEST=make -j tests-bloonchipper TEST=# Connect servo_micro to a dragonclaw board. make proj-bloonchipper -j sudo servod --board=dragonclaw ./util/flash_ec --board=bloonchipper dut-control fpmcu_slp:off fpmcu_slp_alt:off dut-control pp3300_dx_mcu_mw # Should be around 20mw dut-control fpmcu_slp:on fpmcu_slp_alt:off dut-control pp3300_dx_mcu_mw # Should be less the 5mw dut-control fpmcu_slp:off fpmcu_slp_alt:on dut-control pp3300_dx_mcu_mw # Should be less the 5mw dut-control fpmcu_slp:on fpmcu_slp_alt:on dut-control pp3300_dx_mcu_mw # Should be less the 5mw dut-control fpmcu_slp:off fpmcu_slp_alt:off minicom -D$(dut-control -o raw_fpmcu_console_uart_pty) > reboot ro # Ctrl-A Q dut-control fpmcu_slp:off fpmcu_slp_alt:off dut-control pp3300_dx_mcu_mw # Should be around 20mw dut-control fpmcu_slp:on fpmcu_slp_alt:off dut-control pp3300_dx_mcu_mw # Should be less the 5mw dut-control fpmcu_slp:off fpmcu_slp_alt:on dut-control pp3300_dx_mcu_mw # Should be less the 5mw dut-control fpmcu_slp:on fpmcu_slp_alt:on dut-control pp3300_dx_mcu_mw # Should be less the 5mw dut-control fpmcu_slp:off fpmcu_slp_alt:off minicom -D$(dut-control -o raw_fpmcu_console_uart_pty) > reboot > fpenroll > fpmatch > reboot # Ctrl-A Q Signed-off-by: Craig Hesling <hesling@chromium.org> Change-Id: Ibb9e1aac4d242a70ed39e043daef39bab9ccc4d6 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3078823 Reviewed-by: Josie Nordrum <josienordrum@google.com>
Diffstat (limited to 'board/hatch_fp')
-rw-r--r--board/hatch_fp/board.c66
-rw-r--r--board/hatch_fp/board.h2
-rw-r--r--board/hatch_fp/board_rw.c74
-rw-r--r--board/hatch_fp/board_rw.h1
-rw-r--r--board/hatch_fp/build.mk3
-rw-r--r--board/hatch_fp/gpio.inc2
-rw-r--r--board/hatch_fp/gpio_rw.inc2
7 files changed, 69 insertions, 81 deletions
diff --git a/board/hatch_fp/board.c b/board/hatch_fp/board.c
index c2a2e32107..b48dce2b7e 100644
--- a/board/hatch_fp/board.c
+++ b/board/hatch_fp/board.c
@@ -26,6 +26,45 @@ int console_is_restricted(void)
#include "gpio_list.h"
+/*
+ * Some platforms have a broken SLP_S0_L signal (stuck to 0 in S0)
+ * if set, ignore it and only uses SLP_S3_L for the AP state.
+ */
+static bool broken_slp;
+
+static void ap_deferred(void)
+{
+ /*
+ * Behavior:
+ * AP Active (ex. Intel S0): SLP_L is 1
+ * AP Suspend (ex. Intel S0ix): SLP_L is 0
+ * The alternative SLP_ALT_L should be pulled high at all the times.
+ *
+ * Legacy Intel behavior:
+ * in S3: SLP_ALT_L is 0 and SLP_L is X.
+ * in S0ix: SLP_ALT_L is 1 and SLP_L is 0.
+ * in S0: SLP_ALT_L is 1 and SLP_L is 1.
+ * in S5/G3, the FP MCU should not be running.
+ */
+ int running = gpio_get_level(GPIO_SLP_ALT_L) &&
+ (gpio_get_level(GPIO_SLP_L) || broken_slp);
+
+ if (running) { /* S0 */
+ disable_sleep(SLEEP_MASK_AP_RUN);
+ hook_notify(HOOK_CHIPSET_RESUME);
+ } else { /* S0ix/S3 */
+ hook_notify(HOOK_CHIPSET_SUSPEND);
+ enable_sleep(SLEEP_MASK_AP_RUN);
+ }
+}
+DECLARE_DEFERRED(ap_deferred);
+
+/* PCH power state changes */
+void slp_event(enum gpio_signal signal)
+{
+ hook_call_deferred(&ap_deferred_data, 0);
+}
+
static void board_init_transport(void)
{
enum fp_transport_type ret_transport = get_fp_transport_type();
@@ -35,6 +74,15 @@ static void board_init_transport(void)
/* Initialize transport based on bootstrap */
switch (ret_transport) {
case FP_TRANSPORT_TYPE_UART:
+ /*
+ * The Zork variants currently have a broken SLP_S0_L signal
+ * (stuck to 0 in S0). For now, unconditionally ignore it here
+ * as they are the only UART users and the AP has no S0ix state.
+ * TODO(b/174695987) once the RW AP firmware has been updated
+ * on all those machines, remove this workaround.
+ */
+ broken_slp = true;
+
/* Check if CONFIG_USART_HOST_COMMAND is enabled. */
if (IS_ENABLED(CONFIG_USART_HOST_COMMAND))
usart_host_command_init();
@@ -61,13 +109,23 @@ static void board_init_transport(void)
/* Initialize board. */
static void board_init(void)
{
- /* Run until the first S3 entry.
- * No suspend-based power management in RO.
- */
+ /* Run until the first S3 entry */
disable_sleep(SLEEP_MASK_AP_RUN);
- hook_notify(HOOK_CHIPSET_RESUME);
+
board_init_transport();
+
+ /* Enable interrupt on PCH power signals */
+ gpio_enable_interrupt(GPIO_SLP_ALT_L);
+ gpio_enable_interrupt(GPIO_SLP_L);
+
if (IS_ENABLED(SECTION_IS_RW))
board_init_rw();
+
+ /*
+ * Enable the SPI slave interface if the PCH is up.
+ * Do not use hook_call_deferred(), because ap_deferred() will be
+ * called after tasks with priority higher than HOOK task (very late).
+ */
+ ap_deferred();
}
DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT);
diff --git a/board/hatch_fp/board.h b/board/hatch_fp/board.h
index fd48157478..d8d4062320 100644
--- a/board/hatch_fp/board.h
+++ b/board/hatch_fp/board.h
@@ -247,6 +247,8 @@
#include "gpio_signal.h"
#include "board_rw.h"
+void slp_event(enum gpio_signal signal);
+
#endif /* !__ASSEMBLER__ */
#endif /* __BOARD_H */
diff --git a/board/hatch_fp/board_rw.c b/board/hatch_fp/board_rw.c
index 09c78c5e5c..35709860e3 100644
--- a/board/hatch_fp/board_rw.c
+++ b/board/hatch_fp/board_rw.c
@@ -7,10 +7,8 @@
#include "console.h"
#include "fpsensor_detect.h"
#include "gpio.h"
-#include "hooks.h"
#include "registers.h"
#include "spi.h"
-#include "system.h"
#include "task.h"
#include "usart_host_command.h"
#include "util.h"
@@ -19,45 +17,6 @@
#error "This file should only be built for RW."
#endif
-/*
- * Some platforms have a broken SLP_S0_L signal (stuck to 0 in S0)
- * if set, ignore it and only uses SLP_S3_L for the AP state.
- */
-static bool broken_slp;
-
-static void ap_deferred(void)
-{
- /*
- * Behavior:
- * AP Active (ex. Intel S0): SLP_L is 1
- * AP Suspend (ex. Intel S0ix): SLP_L is 0
- * The alternative SLP_ALT_L should be pulled high at all the times.
- *
- * Legacy Intel behavior:
- * in S3: SLP_ALT_L is 0 and SLP_L is X.
- * in S0ix: SLP_ALT_L is 1 and SLP_L is 0.
- * in S0: SLP_ALT_L is 1 and SLP_L is 1.
- * in S5/G3, the FP MCU should not be running.
- */
- int running = gpio_get_level(GPIO_SLP_ALT_L) &&
- (gpio_get_level(GPIO_SLP_L) || broken_slp);
-
- if (running) { /* S0 */
- disable_sleep(SLEEP_MASK_AP_RUN);
- hook_notify(HOOK_CHIPSET_RESUME);
- } else { /* S0ix/S3 */
- hook_notify(HOOK_CHIPSET_SUSPEND);
- enable_sleep(SLEEP_MASK_AP_RUN);
- }
-}
-DECLARE_DEFERRED(ap_deferred);
-
-/* PCH power state changes */
-void slp_event(enum gpio_signal signal)
-{
- hook_call_deferred(&ap_deferred_data, 0);
-}
-
/* SPI devices */
struct spi_device_t spi_devices[] = {
/* Fingerprint sensor (SCLK at 4Mhz) */
@@ -87,39 +46,6 @@ static void configure_fp_sensor_spi(void)
void board_init_rw(void)
{
- enum fp_transport_type ret_transport = get_fp_transport_type();
-
- /*
- * FP_RST_ODL pin is defined in gpio_rw.inc (with GPIO_OUT_HIGH
- * flag) but not in gpio.inc, so RO leaves this pin set to 0 (reset
- * default), but RW doesn't initialize this pin to 1 because sysjump
- * to RW is a warm reset (see gpio_pre_init() in chip/stm32/gpio.c).
- * Explicitly reset FP_RST_ODL pin to default value.
- */
- gpio_reset(GPIO_FP_RST_ODL);
-
- if (ret_transport == FP_TRANSPORT_TYPE_UART) {
- /*
- * The Zork variants currently have a broken SLP_S0_L signal
- * (stuck to 0 in S0). For now, unconditionally ignore it here
- * as they are the only UART users and the AP has no S0ix state.
- * TODO(b/174695987) once the RW AP firmware has been updated
- * on all those machines, remove this workaround.
- */
- broken_slp = true;
- }
-
/* Configure and enable SPI as master for FP sensor */
configure_fp_sensor_spi();
-
- /* Enable interrupt on PCH power signals */
- gpio_enable_interrupt(GPIO_SLP_ALT_L);
- gpio_enable_interrupt(GPIO_SLP_L);
-
- /*
- * Enable the SPI slave interface if the PCH is up.
- * Do not use hook_call_deferred(), because ap_deferred() will be
- * called after tasks with priority higher than HOOK task (very late).
- */
- ap_deferred();
}
diff --git a/board/hatch_fp/board_rw.h b/board/hatch_fp/board_rw.h
index bcfa061b25..1bee6c947d 100644
--- a/board/hatch_fp/board_rw.h
+++ b/board/hatch_fp/board_rw.h
@@ -7,7 +7,6 @@
#define __CROS_EC_BOARD_HATCH_FP_BOARD_RW_H
void fps_event(enum gpio_signal signal);
-void slp_event(enum gpio_signal signal);
void board_init_rw(void);
diff --git a/board/hatch_fp/build.mk b/board/hatch_fp/build.mk
index 7c030b8bfe..bb7f738704 100644
--- a/board/hatch_fp/build.mk
+++ b/board/hatch_fp/build.mk
@@ -9,6 +9,9 @@ CHIP:=stm32
CHIP_FAMILY:=stm32f4
CHIP_VARIANT:=stm32f412
+# Don't forget that the board build.mk is included more than once to allow
+# conditional variables to be realized. This means that we need to redefine all
+# variable or the "+=" lines will compound.
board-rw=board_rw.o
board-y=board.o
diff --git a/board/hatch_fp/gpio.inc b/board/hatch_fp/gpio.inc
index 52c8f770f6..c5319c2bee 100644
--- a/board/hatch_fp/gpio.inc
+++ b/board/hatch_fp/gpio.inc
@@ -5,6 +5,8 @@
*/
/* Interrupts */
+GPIO_INT(SLP_L, PIN(A, 8), GPIO_INT_BOTH, slp_event)
+GPIO_INT(SLP_ALT_L, PIN(B, 6), GPIO_INT_BOTH, slp_event)
GPIO_INT(SPI1_NSS, PIN(A, 4), GPIO_INPUT, spi_event)
/* Inputs */
diff --git a/board/hatch_fp/gpio_rw.inc b/board/hatch_fp/gpio_rw.inc
index 8dcadd68c2..3dfe890c12 100644
--- a/board/hatch_fp/gpio_rw.inc
+++ b/board/hatch_fp/gpio_rw.inc
@@ -10,8 +10,6 @@
/* Interrupts */
GPIO_INT(FPS_INT, PIN(A, 0), GPIO_INT_RISING, fps_event)
-GPIO_INT(SLP_L, PIN(A, 8), GPIO_INT_BOTH, slp_event)
-GPIO_INT(SLP_ALT_L, PIN(B, 6), GPIO_INT_BOTH, slp_event)
/* Inputs */
GPIO(FP_SENSOR_SEL, PIN(B, 0), GPIO_INPUT)