watchdog: hpwdt (12/12): Make NMI decoding a compile-time option
authordann frazier <dannf@hp.com>
Tue, 27 Jul 2010 23:51:02 +0000 (17:51 -0600)
committerWim Van Sebroeck <wim@iguana.be>
Fri, 13 Aug 2010 20:54:53 +0000 (20:54 +0000)
hpwdt is quite functional without the NMI decoding feature.
This change lets users disable the NMI portion at compile-time
via the new HPWDT_NMI_DECODING config option.

Signed-off-by: dann frazier <dannf@hp.com>
Acked-by: Thomas Mingarelli <Thomas.Mingarelli@hp.com>
Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
drivers/watchdog/Kconfig
drivers/watchdog/hpwdt.c

index cee25e401440bc8dd61d51d55556b881b9cf21d0..b036677df8c445420906c722d00611dedcaf8b0a 100644 (file)
@@ -578,12 +578,17 @@ config HP_WATCHDOG
        depends on X86
        help
          A software monitoring watchdog and NMI sourcing driver. This driver
-         will detect lockups and provide a stack trace. Also, when an NMI
-         occurs this driver will make the necessary BIOS calls to log
-         the cause of the NMI. This is a driver that will only load on a
-         HP ProLiant system with a minimum of iLO2 support.
-         To compile this driver as a module, choose M here: the
-         module will be called hpwdt.
+         will detect lockups and provide a stack trace. This is a driver that
+         will only load on a HP ProLiant system with a minimum of iLO2 support.
+         To compile this driver as a module, choose M here: the module will be
+         called hpwdt.
+
+config HPWDT_NMI_DECODING
+       bool "NMI decoding support for the HP ProLiant iLO2+ Hardware Watchdog Timer"
+       depends on HP_WATCHDOG
+       help
+         When an NMI occurs this feature will make the necessary BIOS calls to
+         log the cause of the NMI.
 
 config SC1200_WDT
        tristate "National Semiconductor PC87307/PC97307 (ala SC1200) Watchdog"
index 850f17877e9c81a4568290580cc2dd641b22b1c0..3d77116e463410dac81b6c530c74d5a55f9c7afc 100644 (file)
 #include <linux/types.h>
 #include <linux/uaccess.h>
 #include <linux/watchdog.h>
+#ifdef CONFIG_HPWDT_NMI_DECODING
 #include <linux/dmi.h>
 #include <linux/spinlock.h>
 #include <linux/nmi.h>
 #include <linux/kdebug.h>
 #include <linux/notifier.h>
 #include <asm/cacheflush.h>
+#endif /* CONFIG_HPWDT_NMI_DECODING */
 
-#define HPWDT_VERSION                  "1.1.1"
+#define HPWDT_VERSION                  "1.2.0"
 #define SECS_TO_TICKS(secs)            ((secs) * 1000 / 128)
 #define TICKS_TO_SECS(ticks)           ((ticks) * 128 / 1000)
 #define HPWDT_MAX_TIMER                        TICKS_TO_SECS(65535)
@@ -57,6 +59,7 @@ static struct pci_device_id hpwdt_devices[] = {
 };
 MODULE_DEVICE_TABLE(pci, hpwdt_devices);
 
+#ifdef CONFIG_HPWDT_NMI_DECODING
 #define PCI_BIOS32_SD_VALUE            0x5F32335F      /* "_32_" */
 #define CRU_BIOS_SIGNATURE_VALUE       0x55524324
 #define PCI_BIOS32_PARAGRAPH_LEN       16
@@ -407,6 +410,7 @@ static int __devinit detect_cru_service(void)
 }
 /* ------------------------------------------------------------------------- */
 #endif /* CONFIG_X86_64 */
+#endif /* CONFIG_HPWDT_NMI_DECODING */
 
 /*
  *     Watchdog operations
@@ -455,6 +459,7 @@ static int hpwdt_time_left(void)
        return TICKS_TO_SECS(ioread16(hpwdt_timer_reg));
 }
 
+#ifdef CONFIG_HPWDT_NMI_DECODING
 /*
  *     NMI Handler
  */
@@ -487,6 +492,7 @@ static int hpwdt_pretimeout(struct notifier_block *nb, unsigned long ulReason,
 out:
        return NOTIFY_OK;
 }
+#endif /* CONFIG_HPWDT_NMI_DECODING */
 
 /*
  *     /dev/watchdog handling
@@ -624,15 +630,18 @@ static struct miscdevice hpwdt_miscdev = {
        .fops = &hpwdt_fops,
 };
 
+#ifdef CONFIG_HPWDT_NMI_DECODING
 static struct notifier_block die_notifier = {
        .notifier_call = hpwdt_pretimeout,
        .priority = 0,
 };
+#endif /* CONFIG_HPWDT_NMI_DECODING */
 
 /*
  *     Init & Exit
  */
 
+#ifdef CONFIG_HPWDT_NMI_DECODING
 #ifdef ARCH_HAS_NMI_WATCHDOG
 static void __devinit hpwdt_check_nmi_decoding(struct pci_dev *dev)
 {
@@ -712,6 +721,20 @@ static void __devexit hpwdt_exit_nmi_decoding(void)
        if (cru_rom_addr)
                iounmap(cru_rom_addr);
 }
+#else /* !CONFIG_HPWDT_NMI_DECODING */
+static void __devinit hpwdt_check_nmi_decoding(struct pci_dev *dev)
+{
+}
+
+static int __devinit hpwdt_init_nmi_decoding(struct pci_dev *dev)
+{
+       return 0;
+}
+
+static void __devexit hpwdt_exit_nmi_decoding(void)
+{
+}
+#endif /* CONFIG_HPWDT_NMI_DECODING */
 
 static int __devinit hpwdt_init_one(struct pci_dev *dev,
                                        const struct pci_device_id *ent)
@@ -823,12 +846,14 @@ module_param(nowayout, int, 0);
 MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
+#ifdef CONFIG_HPWDT_NMI_DECODING
 module_param(allow_kdump, int, 0);
 MODULE_PARM_DESC(allow_kdump, "Start a kernel dump after NMI occurs");
 
 module_param(priority, int, 0);
 MODULE_PARM_DESC(priority, "The hpwdt driver handles NMIs first or last"
                " (default = 0/Last)\n");
+#endif /* !CONFIG_HPWDT_NMI_DECODING */
 
 module_init(hpwdt_init);
 module_exit(hpwdt_cleanup);