diff options
| author | Jerry Hoemann <jerry.hoemann@hpe.com> | 2017-10-23 16:46:17 -0600 |
|---|---|---|
| committer | Sasha Levin <alexander.levin@microsoft.com> | 2018-03-20 23:49:51 -0400 |
| commit | ad0276f98ccd3021c2031076868d723fa318268c (patch) | |
| tree | f9a48902e646433e41c67a125099e2c25953ac6d | |
| parent | 7762606087faf75a578453682be5d18e76e173ca (diff) | |
| download | linux-ad0276f98ccd3021c2031076868d723fa318268c.tar.gz linux-ad0276f98ccd3021c2031076868d723fa318268c.tar.bz2 linux-ad0276f98ccd3021c2031076868d723fa318268c.zip | |
watchdog: hpwdt: Check source of NMI
[ 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>
| -rw-r--r-- | drivers/watchdog/hpwdt.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/watchdog/hpwdt.c b/drivers/watchdog/hpwdt.c index a82828095bdd..7f4eb2541a75 100644 --- a/drivers/watchdog/hpwdt.c +++ b/drivers/watchdog/hpwdt.c @@ -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; |
