.lock = __SPIN_LOCK_UNLOCKED(&nmi_desc[1].lock),
                .head = LIST_HEAD_INIT(nmi_desc[1].head),
        },
+       {
+               .lock = __SPIN_LOCK_UNLOCKED(&nmi_desc[2].lock),
+               .head = LIST_HEAD_INIT(nmi_desc[2].head),
+       },
+       {
+               .lock = __SPIN_LOCK_UNLOCKED(&nmi_desc[3].lock),
+               .head = LIST_HEAD_INIT(nmi_desc[3].head),
+       },
 
 };
 
         * to manage expectations
         */
        WARN_ON_ONCE(type == NMI_UNKNOWN && !list_empty(&desc->head));
+       WARN_ON_ONCE(type == NMI_SERR && !list_empty(&desc->head));
+       WARN_ON_ONCE(type == NMI_IO_CHECK && !list_empty(&desc->head));
 
        /*
         * some handlers need to be executed first otherwise a fake
 static notrace __kprobes void
 pci_serr_error(unsigned char reason, struct pt_regs *regs)
 {
+       /* check to see if anyone registered against these types of errors */
+       if (nmi_handle(NMI_SERR, regs, false))
+               return;
+
        pr_emerg("NMI: PCI system error (SERR) for reason %02x on CPU %d.\n",
                 reason, smp_processor_id());
 
 {
        unsigned long i;
 
+       /* check to see if anyone registered against these types of errors */
+       if (nmi_handle(NMI_IO_CHECK, regs, false))
+               return;
+
        pr_emerg(
        "NMI: IOCK error (debug interrupt?) for reason %02x on CPU %d.\n",
                 reason, smp_processor_id());
 
         * Only one function can register for NMI_UNKNOWN
         */
        retval = register_nmi_handler(NMI_UNKNOWN, hpwdt_pretimeout, 0, "hpwdt");
-       if (retval != 0) {
-               dev_warn(&dev->dev,
-                       "Unable to register a die notifier (err=%d).\n",
-                       retval);
-               if (cru_rom_addr)
-                       iounmap(cru_rom_addr);
-       }
+       if (retval)
+               goto error;
+       retval = register_nmi_handler(NMI_SERR, hpwdt_pretimeout, 0, "hpwdt");
+       if (retval)
+               goto error1;
+       retval = register_nmi_handler(NMI_IO_CHECK, hpwdt_pretimeout, 0, "hpwdt");
+       if (retval)
+               goto error2;
 
        dev_info(&dev->dev,
                        "HP Watchdog Timer Driver: NMI decoding initialized"
                        ", allow kernel dump: %s (default = 0/OFF)\n",
                        (allow_kdump == 0) ? "OFF" : "ON");
        return 0;
+
+error2:
+       unregister_nmi_handler(NMI_SERR, "hpwdt");
+error1:
+       unregister_nmi_handler(NMI_UNKNOWN, "hpwdt");
+error:
+       dev_warn(&dev->dev,
+               "Unable to register a die notifier (err=%d).\n",
+               retval);
+       if (cru_rom_addr)
+               iounmap(cru_rom_addr);
+       return retval;
 }
 
 static void hpwdt_exit_nmi_decoding(void)