watchdog: sp5100_tco: Add "action" module parameter
authorVladimir Panteleev <git@vladimir.panteleev.md>
Tue, 20 Sep 2022 09:27:21 +0000 (09:27 +0000)
committerWim Van Sebroeck <wim@linux-watchdog.org>
Sun, 2 Oct 2022 10:55:48 +0000 (12:55 +0200)
Allow configuring the "action" bit, as documented in [1].

Previously, the only action supported by this module was to reset the
system (0).  It can now be configured to power off (1) instead.

[1]: https://www.amd.com/system/files/TechDocs/44413.pdf

Signed-off-by: Vladimir Panteleev <git@vladimir.panteleev.md>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20220920092721.7686-1-git@vladimir.panteleev.md
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
drivers/watchdog/sp5100_tco.c

index ae54dd33e23362b249d2feb5136029d49b4f834f..fb426b7d81dac78221286d0545428d982300880b 100644 (file)
@@ -65,6 +65,12 @@ static struct pci_dev *sp5100_tco_pci;
 
 /* module parameters */
 
+#define WATCHDOG_ACTION 0
+static bool action = WATCHDOG_ACTION;
+module_param(action, bool, 0);
+MODULE_PARM_DESC(action, "Action taken when watchdog expires, 0 to reset, 1 to poweroff (default="
+                __MODULE_STRING(WATCHDOG_ACTION) ")");
+
 #define WATCHDOG_HEARTBEAT 60  /* 60 sec default heartbeat. */
 static int heartbeat = WATCHDOG_HEARTBEAT;  /* in seconds */
 module_param(heartbeat, int, 0);
@@ -297,8 +303,11 @@ static int sp5100_tco_timer_init(struct sp5100_tco *tco)
        if (val & SP5100_WDT_FIRED)
                wdd->bootstatus = WDIOF_CARDRESET;
 
-       /* Set watchdog action to reset the system */
-       val &= ~SP5100_WDT_ACTION_RESET;
+       /* Set watchdog action */
+       if (action)
+               val |= SP5100_WDT_ACTION_RESET;
+       else
+               val &= ~SP5100_WDT_ACTION_RESET;
        writel(val, SP5100_WDT_CONTROL(tco->tcobase));
 
        /* Set a reasonable heartbeat before we stop the timer */