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

Faruque Ansari <[email protected]> Wed, 05 Aug 2026 14:24:56 +0530
Newsgroups org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pm,org.kernel.vger.linux-watchdog
Message-ID <[email protected]>
Watchdog pretimeout resets are not recorded with a dedicated 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 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/pscrr.c     | 11 +++++++----
 include/linux/power/power_on_reason.h |  1 +
 include/linux/reboot.h                |  4 ++++
 kernel/reboot.c                       |  1 +
 4 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/power/reset/pscrr/pscrr.c b/drivers/power/reset/pscrr/pscrr.c
index 8c45b84059a9..b7e6239e207e 100644
--- a/drivers/power/reset/pscrr/pscrr.c
+++ b/drivers/power/reset/pscrr/pscrr.c
@@ -529,12 +529,15 @@ static struct notifier_block pscrr_reboot_nb = {
 static int pscrr_panic_notifier(struct notifier_block *nb,
 				unsigned long action, void *unused)
 {
-	struct pscrr_provider_dir *dir;
 
-	set_psc_reason(PSCR_KERNEL_PANIC);
+	/*
+	 * Do not overwrite a watchdog pretimeout reason already set by the
+	 * pretimeout path before it triggered this panic.
+	 */
+	if (get_psc_reason() != PSCR_WATCHDOG_PRETIMEOUT)
+		set_psc_reason(PSCR_KERNEL_PANIC);
 
-	list_for_each_entry(dir, &pscrr_dirs, node)
-		pscrr_do_record(dir, get_psc_reason());
+	pscrr_record_current();
 
 	return NOTIFY_DONE;
 }
diff --git a/include/linux/power/power_on_reason.h b/include/linux/power/power_on_reason.h
index 8c99bdd75021..8e3889fa43ef 100644
--- a/include/linux/power/power_on_reason.h
+++ b/include/linux/power/power_on_reason.h
@@ -21,5 +21,6 @@
 #define POWER_ON_REASON_EC_PANIC "EC panic"
 #define POWER_ON_REASON_EXTERNAL "external reset"
 #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 a117dd5eaecd..6d5ecc6cdc00 100644
--- a/include/linux/reboot.h
+++ b/include/linux/reboot.h
@@ -243,6 +243,9 @@ extern void orderly_reboot(void);
  *
  * @PSCR_KERNEL_PANIC: Reset that followed a kernel panic.
  *
+ * @PSCR_WATCHDOG_PRETIMEOUT: Recorded when a watchdog pretimeout fires, before
+ *  the pretimeout governor brings the system down.
+ *
  * @PSCR_REASON_COUNT: Number of defined power state change reasons. This
  *	value is useful for range checking and potential future extensions
  *	while maintaining compatibility.
@@ -267,6 +270,7 @@ enum psc_reason {
 	PSCR_CPU_CLK_FAIL,
 	PSCR_XTAL_FAIL,
 	PSCR_KERNEL_PANIC,
+	PSCR_WATCHDOG_PRETIMEOUT,
 
 	/* Number of reasons */
 	PSCR_REASON_COUNT,
diff --git a/kernel/reboot.c b/kernel/reboot.c
index 979ecf3b093c..fad4ef9681a6 100644
--- a/kernel/reboot.c
+++ b/kernel/reboot.c
@@ -1110,6 +1110,7 @@ static const struct psc_reason_desc psc_reason_descs[] = {
 	[PSCR_CPU_CLK_FAIL]	 = { "cpu-clock-failure", POWER_ON_REASON_CPU_CLK_FAIL },
 	[PSCR_XTAL_FAIL]	 = { "crystal-failure",	  POWER_ON_REASON_XTAL_FAIL },
 	[PSCR_KERNEL_PANIC]	 = { "kernel-panic",	  POWER_ON_REASON_KERNEL_PANIC },
+	[PSCR_WATCHDOG_PRETIMEOUT] = { "watchdog-pretimeout", POWER_ON_REASON_WATCHDOG_PRETIMEOUT },
 };
 
 /**

-- 
2.34.1