[PATCH v2 2/3] power: reset: pscrr: add watchdog pretimeout reason tracking

Faruque Ansari <[email protected]> Wed, 22 Jul 2026 20:43:01 +0530
Newsgroups org.kernel.vger.linux-watchdog,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pm
Message-ID <[email protected]>
Watchdog pretimeout resets are not recorded with a dedicated reset
reason, causing subsequent boots to report PSCR_UNKNOWN and making it
difficult to distinguish them from other unexpected resets.

Add PSCR_WATCHDOG_PRETIMEOUT as a dedicated reset reason code and
prevent the panic notifier from overwriting a watchdog pretimeout
reason with PSCR_KERNEL_PANIC when the pretimeout governor triggers a
panic.

Signed-off-by: Faruque Ansari <[email protected]>
---
 drivers/power/reset/pscrr.c           | 7 ++++++-
 include/linux/power/power_on_reason.h | 1 +
 include/linux/reboot.h                | 1 +
 kernel/reboot.c                       | 1 +
 4 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/power/reset/pscrr.c b/drivers/power/reset/pscrr.c
index b5906f127e88..5b107c62fe82 100644
--- a/drivers/power/reset/pscrr.c
+++ b/drivers/power/reset/pscrr.c
@@ -149,7 +149,12 @@ static int pscrr_panic_notifier(struct notifier_block *nb,
 	if (!backend || !backend->ops || !backend->ops->write_reason)
 		return NOTIFY_OK;
 
-	set_psc_reason(PSCR_KERNEL_PANIC);
+	/*
+	 * Do not overwrite a previously recorded watchdog pretimeout reason
+	 * during panic handling.
+	 */
+	if (get_psc_reason() != PSCR_WATCHDOG_PRETIMEOUT)
+		set_psc_reason(PSCR_KERNEL_PANIC);
 	ret = backend->ops->write_reason(get_psc_reason());
 	if (ret)
 		pr_err("PSCRR: Failed to store reason %d (%s) at panic, err=%pe\n",
diff --git a/include/linux/power/power_on_reason.h b/include/linux/power/power_on_reason.h
index 4ac1bdfdc211..c5846c0ccde4 100644
--- a/include/linux/power/power_on_reason.h
+++ b/include/linux/power/power_on_reason.h
@@ -20,5 +20,6 @@
 #define POWER_ON_REASON_OVER_TEMPERATURE "over temperature"
 #define POWER_ON_REASON_EC_PANIC "EC panic"
 #define POWER_ON_REASON_KERNEL_PANIC "kernel panic"
+#define POWER_ON_REASON_WATCHDOG_PRETIMEOUT "watchdog pretimeout"
 
 #endif /* POWER_ON_REASON_H */
diff --git a/include/linux/reboot.h b/include/linux/reboot.h
index a492b1652038..fccbffc9dbef 100644
--- a/include/linux/reboot.h
+++ b/include/linux/reboot.h
@@ -237,6 +237,7 @@ enum psc_reason {
 	PSCR_OVER_TEMPERATURE,
 	PSCR_EC_PANIC,
 	PSCR_KERNEL_PANIC,
+	PSCR_WATCHDOG_PRETIMEOUT,
 
 	/* Number of reasons */
 	PSCR_REASON_COUNT,
diff --git a/kernel/reboot.c b/kernel/reboot.c
index f1df52f8773a..629002a951c2 100644
--- a/kernel/reboot.c
+++ b/kernel/reboot.c
@@ -1066,6 +1066,7 @@ static const char * const pscr_reason_strs[] = {
 	[PSCR_OVER_TEMPERATURE]   = POWER_ON_REASON_OVER_TEMPERATURE,
 	[PSCR_EC_PANIC]           = POWER_ON_REASON_EC_PANIC,
 	[PSCR_KERNEL_PANIC]       = POWER_ON_REASON_KERNEL_PANIC,
+	[PSCR_WATCHDOG_PRETIMEOUT] = POWER_ON_REASON_WATCHDOG_PRETIMEOUT,
 };
 
 /**

-- 
2.34.1