Commit 86ded1f3 authored by dann frazier's avatar dann frazier Committed by Wim Van Sebroeck
Browse files

watchdog: hpwdt (12/12): Make NMI decoding a compile-time option



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: default avatardann frazier <dannf@hp.com>
Acked-by: default avatarThomas Mingarelli <Thomas.Mingarelli@hp.com>
Signed-off-by: default avatarWim Van Sebroeck <wim@iguana.be>
parent 2ec7ed67
Loading
Loading
Loading
Loading
+11 −6
Original line number Original line Diff line number Diff line
@@ -578,12 +578,17 @@ config HP_WATCHDOG
	depends on X86
	depends on X86
	help
	help
	  A software monitoring watchdog and NMI sourcing driver. This driver
	  A software monitoring watchdog and NMI sourcing driver. This driver
	  will detect lockups and provide a stack trace. Also, when an NMI
	  will detect lockups and provide a stack trace. This is a driver that
	  occurs this driver will make the necessary BIOS calls to log
	  will only load on a HP ProLiant system with a minimum of iLO2 support.
	  the cause of the NMI. This is a driver that will only load on a
	  To compile this driver as a module, choose M here: the module will be
	  HP ProLiant system with a minimum of iLO2 support.
	  called hpwdt.
	  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
config SC1200_WDT
	tristate "National Semiconductor PC87307/PC97307 (ala SC1200) Watchdog"
	tristate "National Semiconductor PC87307/PC97307 (ala SC1200) Watchdog"
+26 −1
Original line number Original line Diff line number Diff line
@@ -27,14 +27,16 @@
#include <linux/types.h>
#include <linux/types.h>
#include <linux/uaccess.h>
#include <linux/uaccess.h>
#include <linux/watchdog.h>
#include <linux/watchdog.h>
#ifdef CONFIG_HPWDT_NMI_DECODING
#include <linux/dmi.h>
#include <linux/dmi.h>
#include <linux/spinlock.h>
#include <linux/spinlock.h>
#include <linux/nmi.h>
#include <linux/nmi.h>
#include <linux/kdebug.h>
#include <linux/kdebug.h>
#include <linux/notifier.h>
#include <linux/notifier.h>
#include <asm/cacheflush.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 SECS_TO_TICKS(secs)		((secs) * 1000 / 128)
#define TICKS_TO_SECS(ticks)		((ticks) * 128 / 1000)
#define TICKS_TO_SECS(ticks)		((ticks) * 128 / 1000)
#define HPWDT_MAX_TIMER			TICKS_TO_SECS(65535)
#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);
MODULE_DEVICE_TABLE(pci, hpwdt_devices);


#ifdef CONFIG_HPWDT_NMI_DECODING
#define PCI_BIOS32_SD_VALUE		0x5F32335F	/* "_32_" */
#define PCI_BIOS32_SD_VALUE		0x5F32335F	/* "_32_" */
#define CRU_BIOS_SIGNATURE_VALUE	0x55524324
#define CRU_BIOS_SIGNATURE_VALUE	0x55524324
#define PCI_BIOS32_PARAGRAPH_LEN	16
#define PCI_BIOS32_PARAGRAPH_LEN	16
@@ -407,6 +410,7 @@ static int __devinit detect_cru_service(void)
}
}
/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
#endif /* CONFIG_X86_64 */
#endif /* CONFIG_X86_64 */
#endif /* CONFIG_HPWDT_NMI_DECODING */


/*
/*
 *	Watchdog operations
 *	Watchdog operations
@@ -455,6 +459,7 @@ static int hpwdt_time_left(void)
	return TICKS_TO_SECS(ioread16(hpwdt_timer_reg));
	return TICKS_TO_SECS(ioread16(hpwdt_timer_reg));
}
}


#ifdef CONFIG_HPWDT_NMI_DECODING
/*
/*
 *	NMI Handler
 *	NMI Handler
 */
 */
@@ -487,6 +492,7 @@ static int hpwdt_pretimeout(struct notifier_block *nb, unsigned long ulReason,
out:
out:
	return NOTIFY_OK;
	return NOTIFY_OK;
}
}
#endif /* CONFIG_HPWDT_NMI_DECODING */


/*
/*
 *	/dev/watchdog handling
 *	/dev/watchdog handling
@@ -624,15 +630,18 @@ static struct miscdevice hpwdt_miscdev = {
	.fops = &hpwdt_fops,
	.fops = &hpwdt_fops,
};
};


#ifdef CONFIG_HPWDT_NMI_DECODING
static struct notifier_block die_notifier = {
static struct notifier_block die_notifier = {
	.notifier_call = hpwdt_pretimeout,
	.notifier_call = hpwdt_pretimeout,
	.priority = 0,
	.priority = 0,
};
};
#endif /* CONFIG_HPWDT_NMI_DECODING */


/*
/*
 *	Init & Exit
 *	Init & Exit
 */
 */


#ifdef CONFIG_HPWDT_NMI_DECODING
#ifdef ARCH_HAS_NMI_WATCHDOG
#ifdef ARCH_HAS_NMI_WATCHDOG
static void __devinit hpwdt_check_nmi_decoding(struct pci_dev *dev)
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)
	if (cru_rom_addr)
		iounmap(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,
static int __devinit hpwdt_init_one(struct pci_dev *dev,
					const struct pci_device_id *ent)
					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_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
		__MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
		__MODULE_STRING(WATCHDOG_NOWAYOUT) ")");


#ifdef CONFIG_HPWDT_NMI_DECODING
module_param(allow_kdump, int, 0);
module_param(allow_kdump, int, 0);
MODULE_PARM_DESC(allow_kdump, "Start a kernel dump after NMI occurs");
MODULE_PARM_DESC(allow_kdump, "Start a kernel dump after NMI occurs");


module_param(priority, int, 0);
module_param(priority, int, 0);
MODULE_PARM_DESC(priority, "The hpwdt driver handles NMIs first or last"
MODULE_PARM_DESC(priority, "The hpwdt driver handles NMIs first or last"
		" (default = 0/Last)\n");
		" (default = 0/Last)\n");
#endif /* !CONFIG_HPWDT_NMI_DECODING */


module_init(hpwdt_init);
module_init(hpwdt_init);
module_exit(hpwdt_cleanup);
module_exit(hpwdt_cleanup);