summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chip/stm32/system.c32
-rw-r--r--common/system.c2
-rw-r--r--include/system.h5
-rw-r--r--power/mt8183.c7
-rw-r--r--util/ectool.c3
5 files changed, 46 insertions, 3 deletions
diff --git a/chip/stm32/system.c b/chip/stm32/system.c
index a03550d7f9..c7ff4f23d9 100644
--- a/chip/stm32/system.c
+++ b/chip/stm32/system.c
@@ -33,9 +33,26 @@
/* We use 16-bit BKP / BBRAM entries. */
#define STM32_BKP_ENTRIES (STM32_BKP_BYTES / 2)
+/*
+ * Use 32-bit for reset flags, if we have space for it:
+ * - 2 indexes are used unconditionally (SCRATCHPAD and SAVED_RESET_FLAGS)
+ * - VBNV_CONTEXT requires 8 indexes, so a total of 10 (which is the total
+ * number of entries on some STM32 variants).
+ * - Other config options are not a problem (they only take a few entries)
+ *
+ * Given this, we can only add an extra entry for the top 16-bit of reset flags
+ * if VBNV_CONTEXT is not enabled, or if we have more than 10 entries.
+ */
+#if !defined(CONFIG_HOSTCMD_VBNV_CONTEXT) || STM32_BKP_ENTRIES > 10
+#define CONFIG_STM32_RESET_FLAGS_EXTENDED
+#endif
+
enum bkpdata_index {
BKPDATA_INDEX_SCRATCHPAD, /* General-purpose scratchpad */
BKPDATA_INDEX_SAVED_RESET_FLAGS, /* Saved reset flags */
+#ifdef CONFIG_STM32_RESET_FLAGS_EXTENDED
+ BKPDATA_INDEX_SAVED_RESET_FLAGS_2, /* Saved reset flags (cont) */
+#endif
#ifdef CONFIG_HOSTCMD_VBNV_CONTEXT
BKPDATA_INDEX_VBNV_CONTEXT0,
BKPDATA_INDEX_VBNV_CONTEXT1,
@@ -152,12 +169,19 @@ static void check_reset_cause(void)
uint32_t raw_cause = STM32_RCC_RESET_CAUSE;
uint32_t pwr_status = STM32_PWR_RESET_CAUSE;
+#ifdef CONFIG_STM32_RESET_FLAGS_EXTENDED
+ flags |= bkpdata_read(BKPDATA_INDEX_SAVED_RESET_FLAGS_2) << 16;
+#endif
+
/* Clear the hardware reset cause by setting the RMVF bit */
STM32_RCC_RESET_CAUSE |= RESET_CAUSE_RMVF;
/* Clear SBF in PWR_CSR */
STM32_PWR_RESET_CAUSE_CLR |= RESET_CAUSE_SBF_CLR;
/* Clear saved reset flags */
bkpdata_write(BKPDATA_INDEX_SAVED_RESET_FLAGS, 0);
+#ifdef CONFIG_STM32_RESET_FLAGS_EXTENDED
+ bkpdata_write(BKPDATA_INDEX_SAVED_RESET_FLAGS_2, 0);
+#endif
if (raw_cause & RESET_CAUSE_WDG) {
/*
@@ -343,9 +367,17 @@ void system_reset(int flags)
if (flags & SYSTEM_RESET_HARD)
save_flags |= RESET_FLAG_HARD;
+#ifdef CONFIG_STM32_RESET_FLAGS_EXTENDED
+ if (flags & SYSTEM_RESET_AP_WATCHDOG)
+ save_flags |= RESET_FLAG_AP_WATCHDOG;
+
+ bkpdata_write(BKPDATA_INDEX_SAVED_RESET_FLAGS, save_flags & 0xffff);
+ bkpdata_write(BKPDATA_INDEX_SAVED_RESET_FLAGS_2, save_flags >> 16);
+#else
/* Reset flags are 32-bits, but BBRAM entry is only 16 bits. */
ASSERT(!(save_flags >> 16));
bkpdata_write(BKPDATA_INDEX_SAVED_RESET_FLAGS, save_flags);
+#endif
if (flags & SYSTEM_RESET_HARD) {
#ifdef CONFIG_SOFTWARE_PANIC
diff --git a/common/system.c b/common/system.c
index 4e0ab91c2f..e2ef1ee5ff 100644
--- a/common/system.c
+++ b/common/system.c
@@ -93,7 +93,7 @@ static const char * const reset_flag_descs[] = {
"other", "reset-pin", "brownout", "power-on", "watchdog", "soft",
"hibernate", "rtc-alarm", "wake-pin", "low-battery", "sysjump",
"hard", "ap-off", "preserved", "usb-resume", "rdd", "rbox",
- "security" };
+ "security", "ap-watchdog" };
static uint32_t reset_flags;
static int jumped_to_image;
diff --git a/include/system.h b/include/system.h
index c040bca840..ca7b24c624 100644
--- a/include/system.h
+++ b/include/system.h
@@ -33,6 +33,7 @@
#define RESET_FLAG_RDD (1 << 15) /* USB Type-C debug cable */
#define RESET_FLAG_RBOX (1 << 16) /* Fixed Reset Functionality */
#define RESET_FLAG_SECURITY (1 << 17) /* Security threat */
+#define RESET_FLAG_AP_WATCHDOG (1 << 18) /* AP experienced a watchdog reset */
/* Per chip implementation to save/read raw RESET_FLAG_ flags. */
void chip_save_reset_flags(int flags);
@@ -274,6 +275,10 @@ const char *system_get_build_info(void);
* Wait for reset pin to be driven, rather that resetting ourselves.
*/
#define SYSTEM_RESET_WAIT_EXT (1 << 4)
+/*
+ * Indicate that this reset was triggered by an AP watchdog
+ */
+#define SYSTEM_RESET_AP_WATCHDOG (1 << 5)
/**
* Reset the system.
diff --git a/power/mt8183.c b/power/mt8183.c
index 631f2f3c7f..ff842ba01c 100644
--- a/power/mt8183.c
+++ b/power/mt8183.c
@@ -140,11 +140,16 @@ DECLARE_DEFERRED(chipset_force_shutdown_button);
/* If chipset needs to be reset, EC also reboots to RO. */
void chipset_reset(enum chipset_reset_reason reason)
{
+ int flags = SYSTEM_RESET_HARD;
+
CPRINTS("%s: %d", __func__, reason);
report_ap_reset(reason);
cflush();
- system_reset(SYSTEM_RESET_HARD);
+ if (reason == CHIPSET_RESET_AP_WATCHDOG)
+ flags |= SYSTEM_RESET_AP_WATCHDOG;
+
+ system_reset(flags);
/* This should not be reachable. */
while (1)
diff --git a/util/ectool.c b/util/ectool.c
index bd7725131e..4cb4b71623 100644
--- a/util/ectool.c
+++ b/util/ectool.c
@@ -769,7 +769,8 @@ int cmd_uptimeinfo(int argc, char *argv[])
"usb-resume",
"rdd",
"rbox",
- "security"
+ "security",
+ "ap-watchdog"
};
struct ec_response_uptime_info r;