* [PATCH v3 1/3] power: reset: pscrr: add kernel panic reason tracking
2026-08-04 9:21 [PATCH v3 0/3] power: reset: pscrr: record reset cause on panic and watchdog pretimeout Faruque Ansari
@ 2026-08-04 9:21 ` Faruque Ansari
2026-08-04 9:21 ` [PATCH v3 2/3] power: reset: pscrr: add watchdog pretimeout " Faruque Ansari
2026-08-04 9:21 ` [PATCH v3 3/3] watchdog: pretimeout: update PSC reason in panic pretimeout governor Faruque Ansari
2 siblings, 0 replies; 5+ messages in thread
From: Faruque Ansari @ 2026-08-04 9:21 UTC (permalink / raw)
To: Sebastian Reichel, Wim Van Sebroeck, Guenter Roeck, Benson Leung,
Tzung-Bi Shih, Oleksij Rempel, Srinivas Kandagatla,
Daniel Lezcano, Pengutronix Kernel Team
Cc: linux-pm, linux-kernel, linux-watchdog, linux-arm-msm, kernel,
Liam Girdwood, Mark Brown, Rafael J. Wysocki, Zhang Rui,
Lukasz Luba, Søren Andersen, Guenter Roeck, Matti Vaittinen,
Ahmad Fatoum, Andrew Morton, avaneesh.dwivedi, Umang Chheda,
Faruque Ansari
Kernel panic resets are not recorded in NVMEM, causing subsequent
boots to report PSCR_UNKNOWN and making post-mortem analysis more
difficult.
Register a panic notifier to preserve the shutdown reason across
panic-triggered resets. Add PSCR_KERNEL_PANIC as a dedicated reset
reason code and its corresponding reason string to identify kernel
panic resets on subsequent boots.
Signed-off-by: Faruque Ansari <faruque.ansari@oss.qualcomm.com>
---
drivers/power/reset/pscrr/pscrr.c | 27 +++++++++++++++++++++++++++
include/linux/power/power_on_reason.h | 1 +
include/linux/reboot.h | 3 +++
kernel/reboot.c | 1 +
4 files changed, 32 insertions(+)
diff --git a/drivers/power/reset/pscrr/pscrr.c b/drivers/power/reset/pscrr/pscrr.c
index 6f23f4c4f590..8c45b84059a9 100644
--- a/drivers/power/reset/pscrr/pscrr.c
+++ b/drivers/power/reset/pscrr/pscrr.c
@@ -41,6 +41,7 @@
#include <linux/mutex.h>
#include <linux/notifier.h>
#include <linux/of.h>
+#include <linux/panic_notifier.h>
#include <linux/pscrr.h>
#include <linux/reboot.h>
#include <linux/slab.h>
@@ -519,6 +520,29 @@ static struct notifier_block pscrr_reboot_nb = {
.notifier_call = pscrr_reboot_notifier,
};
+/*
+ * Panic notifier: record that the machine went down through a kernel panic, so
+ * the cause is visible on the next boot. Runs in atomic panic context, so the
+ * provider list is walked without pscrr_lock - providers no longer come or go
+ * once the machine is going down.
+ */
+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);
+
+ list_for_each_entry(dir, &pscrr_dirs, node)
+ pscrr_do_record(dir, get_psc_reason());
+
+ return NOTIFY_DONE;
+}
+
+static struct notifier_block pscrr_panic_nb = {
+ .notifier_call = pscrr_panic_notifier,
+};
+
/*----------------------------------------------------------------------*/
/* Built-in provider: device-tree /chosen/reset-source */
/*----------------------------------------------------------------------*/
@@ -611,6 +635,8 @@ static int __init pscrr_core_init(void)
return ret;
}
+ atomic_notifier_chain_register(&panic_notifier_list, &pscrr_panic_nb);
+
pscrr_register_reset_source();
return 0;
@@ -619,6 +645,7 @@ static int __init pscrr_core_init(void)
static void __exit pscrr_core_exit(void)
{
pscrr_provider_unregister(&pscrr_reset_source_provider);
+ atomic_notifier_chain_unregister(&panic_notifier_list, &pscrr_panic_nb);
unregister_reboot_notifier(&pscrr_reboot_nb);
kobject_put(pscrr_root);
pscrr_root = NULL;
diff --git a/include/linux/power/power_on_reason.h b/include/linux/power/power_on_reason.h
index 13e61ace14f5..8c99bdd75021 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_EXTERNAL "external reset"
+#define POWER_ON_REASON_KERNEL_PANIC "kernel panic"
#endif /* POWER_ON_REASON_H */
diff --git a/include/linux/reboot.h b/include/linux/reboot.h
index 13f004ad1066..a117dd5eaecd 100644
--- a/include/linux/reboot.h
+++ b/include/linux/reboot.h
@@ -241,6 +241,8 @@ extern void orderly_reboot(void);
*
* @PSCR_XTAL_FAIL: Reset caused by a crystal oscillator failure.
*
+ * @PSCR_KERNEL_PANIC: Reset that followed a kernel panic.
+ *
* @PSCR_REASON_COUNT: Number of defined power state change reasons. This
* value is useful for range checking and potential future extensions
* while maintaining compatibility.
@@ -264,6 +266,7 @@ enum psc_reason {
PSCR_RESET_BUTTON,
PSCR_CPU_CLK_FAIL,
PSCR_XTAL_FAIL,
+ PSCR_KERNEL_PANIC,
/* Number of reasons */
PSCR_REASON_COUNT,
diff --git a/kernel/reboot.c b/kernel/reboot.c
index 75af5d763465..979ecf3b093c 100644
--- a/kernel/reboot.c
+++ b/kernel/reboot.c
@@ -1109,6 +1109,7 @@ static const struct psc_reason_desc psc_reason_descs[] = {
[PSCR_RESET_BUTTON] = { "reset-button", POWER_ON_REASON_RST_BTN },
[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 },
};
/**
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH v3 2/3] power: reset: pscrr: add watchdog pretimeout reason tracking
2026-08-04 9:21 [PATCH v3 0/3] power: reset: pscrr: record reset cause on panic and watchdog pretimeout Faruque Ansari
2026-08-04 9:21 ` [PATCH v3 1/3] power: reset: pscrr: add kernel panic reason tracking Faruque Ansari
@ 2026-08-04 9:21 ` Faruque Ansari
2026-08-04 9:21 ` [PATCH v3 3/3] watchdog: pretimeout: update PSC reason in panic pretimeout governor Faruque Ansari
2 siblings, 0 replies; 5+ messages in thread
From: Faruque Ansari @ 2026-08-04 9:21 UTC (permalink / raw)
To: Sebastian Reichel, Wim Van Sebroeck, Guenter Roeck, Benson Leung,
Tzung-Bi Shih, Oleksij Rempel, Srinivas Kandagatla,
Daniel Lezcano, Pengutronix Kernel Team
Cc: linux-pm, linux-kernel, linux-watchdog, linux-arm-msm, kernel,
Liam Girdwood, Mark Brown, Rafael J. Wysocki, Zhang Rui,
Lukasz Luba, Søren Andersen, Guenter Roeck, Matti Vaittinen,
Ahmad Fatoum, Andrew Morton, avaneesh.dwivedi, Umang Chheda,
Faruque Ansari
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 <faruque.ansari@oss.qualcomm.com>
---
drivers/power/reset/pscrr/pscrr.c | 11 +++++++----
1 file changed, 7 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;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH v3 3/3] watchdog: pretimeout: update PSC reason in panic pretimeout governor
2026-08-04 9:21 [PATCH v3 0/3] power: reset: pscrr: record reset cause on panic and watchdog pretimeout Faruque Ansari
2026-08-04 9:21 ` [PATCH v3 1/3] power: reset: pscrr: add kernel panic reason tracking Faruque Ansari
2026-08-04 9:21 ` [PATCH v3 2/3] power: reset: pscrr: add watchdog pretimeout " Faruque Ansari
@ 2026-08-04 9:21 ` Faruque Ansari
2026-08-04 14:59 ` Guenter Roeck
2 siblings, 1 reply; 5+ messages in thread
From: Faruque Ansari @ 2026-08-04 9:21 UTC (permalink / raw)
To: Sebastian Reichel, Wim Van Sebroeck, Guenter Roeck, Benson Leung,
Tzung-Bi Shih, Oleksij Rempel, Srinivas Kandagatla,
Daniel Lezcano, Pengutronix Kernel Team
Cc: linux-pm, linux-kernel, linux-watchdog, linux-arm-msm, kernel,
Liam Girdwood, Mark Brown, Rafael J. Wysocki, Zhang Rui,
Lukasz Luba, Søren Andersen, Guenter Roeck, Matti Vaittinen,
Ahmad Fatoum, Andrew Morton, avaneesh.dwivedi, Umang Chheda,
Faruque Ansari
Update the PSC reset reason by invoking
set_psc_reason(PSCR_WATCHDOG_PRETIMEOUT) from the panic governor's
pretimeout handler before calling panic(), so the reset cause is
committed to persistent storage before the system goes down.
Signed-off-by: Faruque Ansari <faruque.ansari@oss.qualcomm.com>
---
drivers/watchdog/pretimeout_panic.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/watchdog/pretimeout_panic.c b/drivers/watchdog/pretimeout_panic.c
index 8c3ac674dc45..819487b5e6fe 100644
--- a/drivers/watchdog/pretimeout_panic.c
+++ b/drivers/watchdog/pretimeout_panic.c
@@ -5,6 +5,7 @@
#include <linux/kernel.h>
#include <linux/module.h>
+#include <linux/reboot.h>
#include <linux/watchdog.h>
#include "watchdog_pretimeout.h"
@@ -17,6 +18,7 @@
*/
static void pretimeout_panic(struct watchdog_device *wdd)
{
+ set_psc_reason(PSCR_WATCHDOG_PRETIMEOUT);
panic("watchdog pretimeout event\n");
}
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread