Re: [PATCH v2] watchdog/hpwdt: Refine hpwdt message for UV platform
From: Steve Wahl
Date: Thu Apr 16 2026 - 12:21:31 EST
On Wed, Mar 18, 2026 at 10:42:09AM -0700, Guenter Roeck wrote:
> On 3/18/26 08:50, Steve Wahl wrote:
> > The watchdog hardware the hpwdt driver uses was added to the UV
> > platform for UV_5, but the logging mentioned by this driver was not
> > added to the BIOS. When the watchdog fires, the printed message had
> > the administrators and developers looking for non-existent log files,
> > and confused about whether a watchdog actually tripped.
> >
> > Change the message that prints on UV platforms so it doesn't send the
> > user looking for non-existent logs.
> >
> > To aid in any future debugging, include all 8 bits of the NMISTAT
> > register in the output, not just the two bits being used to determine
> > this was "mynmi". And provide names to the bits in NMISTAT so the
> > code is easier to understand.
> >
> > Signed-off-by: Steve Wahl <steve.wahl@xxxxxxx>
>
> Reviewed-by: Guenter Roeck <linux@xxxxxxxxxxxx>
Question: With Guenter's review, will this automatically follow some
path into the kernel tree, or do I need to call more attention to it?
Thanks,
--> Steve Wahl, HPE
> > ---
> >
> > v1 disucsion:
> > https://lore.kernel.org/all/20260316214530.104344-1-steve.wahl@xxxxxxx
> >
> > v2: Fix subject line; remove hpwdt_my_nmi function, and inline what it
> > formerly did, reducing complexity. This addresses comments from
> > Guenter Roeck.
> >
> > drivers/watchdog/hpwdt.c | 22 +++++++++++++++-------
> > 1 file changed, 15 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/watchdog/hpwdt.c b/drivers/watchdog/hpwdt.c
> > index ae30e394d176..ba08189937ec 100644
> > --- a/drivers/watchdog/hpwdt.c
> > +++ b/drivers/watchdog/hpwdt.c
> > @@ -22,6 +22,7 @@
> > #include <linux/watchdog.h>
> > #ifdef CONFIG_HPWDT_NMI_DECODING
> > #include <asm/nmi.h>
> > +#include <asm/uv/uv.h>
> > #endif
> > #include <linux/crash_dump.h>
> > @@ -158,24 +159,31 @@ static int hpwdt_set_pretimeout(struct watchdog_device *wdd, unsigned int req)
> > return 0;
> > }
> > -static int hpwdt_my_nmi(void)
> > -{
> > - return ioread8(hpwdt_nmistat) & 0x6;
> > -}
> > +#define NMISTAT_EASR BIT(0)
> > +#define NMISTAT_EWDOG BIT(1)
> > +#define NMISTAT_RTRAP BIT(2)
> > +#define NMISTAT_DBELL BIT(3)
> > +#define NMISTAT_EMSWDG BIT(4)
> > +#define NMISTAT_GPI BIT(5)
> > +#define NMISTAT_NMIOUT BIT(7)
> > /*
> > * NMI Handler
> > */
> > static int hpwdt_pretimeout(unsigned int ulReason, struct pt_regs *regs)
> > {
> > - unsigned int mynmi = hpwdt_my_nmi();
> > - static char panic_msg[] =
> > + u8 nmistat = ioread8(hpwdt_nmistat);
> > + bool mynmi = (nmistat & (NMISTAT_EWDOG | NMISTAT_RTRAP)) != 0;
> > + static char panic_msg_default[] =
> > "00: An NMI occurred. Depending on your system the reason "
> > "for the NMI is logged in any one of the following resources:\n"
> > "1. Integrated Management Log (IML)\n"
> > "2. OA Syslog\n"
> > "3. OA Forward Progress Log\n"
> > "4. iLO Event Log";
> > + static char panic_msg_uv[] =
> > + "00: A watchdog NMI occurred.";
> > + char *panic_msg = is_uv_system() ? panic_msg_uv : panic_msg_default;
> > if (ulReason == NMI_UNKNOWN && !mynmi)
> > return NMI_DONE;
> > @@ -189,7 +197,7 @@ static int hpwdt_pretimeout(unsigned int ulReason, struct pt_regs *regs)
> > hpwdt_ping_ticks(SECS_TO_TICKS(val));
> > }
> > - hex_byte_pack(panic_msg, mynmi);
> > + hex_byte_pack(panic_msg, nmistat);
> > nmi_panic(regs, panic_msg);
> > return NMI_HANDLED;
>
--
Steve Wahl, Hewlett Packard Enterprise