watchdog: hpwdt: Check source of NMI
authorJerry Hoemann <jerry.hoemann@hpe.com>
Mon, 23 Oct 2017 22:46:17 +0000 (16:46 -0600)
committerSasha Levin <alexander.levin@microsoft.com>
Wed, 21 Mar 2018 03:49:51 +0000 (23:49 -0400)
[ Upstream commit 838534e50e2e5c1e644e30ab6cb28da88eb31368 ]

Do not claim the NMI (i.e. return NMI_DONE) if the source of
the NMI isn't the iLO watchdog or debug.

Signed-off-by: Jerry Hoemann <jerry.hoemann@hpe.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
drivers/watchdog/hpwdt.c

index a82828095bdd077022bdc28b402892fc5fd5a8c8..7f4eb2541a752f6539d41f02a9efef3be5fcbbc6 100644 (file)
@@ -51,6 +51,7 @@ static char expect_release;
 static unsigned long hpwdt_is_open;
 
 static void __iomem *pci_mem_addr;             /* the PCI-memory address */
+static unsigned long __iomem *hpwdt_nmistat;
 static unsigned long __iomem *hpwdt_timer_reg;
 static unsigned long __iomem *hpwdt_timer_con;
 
@@ -473,6 +474,11 @@ static int hpwdt_time_left(void)
        return TICKS_TO_SECS(ioread16(hpwdt_timer_reg));
 }
 
+static int hpwdt_my_nmi(void)
+{
+       return ioread8(hpwdt_nmistat) & 0x6;
+}
+
 #ifdef CONFIG_HPWDT_NMI_DECODING
 /*
  *     NMI Handler
@@ -485,6 +491,9 @@ static int hpwdt_pretimeout(unsigned int ulReason, struct pt_regs *regs)
        if (!hpwdt_nmi_decoding)
                goto out;
 
+       if ((ulReason == NMI_UNKNOWN) && !hpwdt_my_nmi())
+               return NMI_DONE;
+
        spin_lock_irqsave(&rom_lock, rom_pl);
        if (!die_nmi_called && !is_icru && !is_uefi)
                asminline_call(&cmn_regs, cru_rom_addr);
@@ -826,6 +835,7 @@ static int hpwdt_init_one(struct pci_dev *dev,
                retval = -ENOMEM;
                goto error_pci_iomap;
        }
+       hpwdt_nmistat   = pci_mem_addr + 0x6e;
        hpwdt_timer_reg = pci_mem_addr + 0x70;
        hpwdt_timer_con = pci_mem_addr + 0x72;