diff options
| -rw-r--r-- | arch/x86/include/asm/mach_traps.h | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/x86_init.h | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/nmi.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/x86_init.c | 2 | ||||
| -rw-r--r-- | arch/x86/platform/mrst/mrst.c | 13 | 
5 files changed, 18 insertions, 2 deletions
diff --git a/arch/x86/include/asm/mach_traps.h b/arch/x86/include/asm/mach_traps.h index 72a8b52e7dfd..a01e7ec7d237 100644 --- a/arch/x86/include/asm/mach_traps.h +++ b/arch/x86/include/asm/mach_traps.h @@ -17,7 +17,7 @@  #define NMI_REASON_CLEAR_IOCHK	0x08  #define NMI_REASON_CLEAR_MASK	0x0f -static inline unsigned char get_nmi_reason(void) +static inline unsigned char default_get_nmi_reason(void)  {  	return inb(NMI_REASON_PORT);  } diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index f864fbe474c6..1971e652d24b 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h @@ -167,6 +167,7 @@ struct x86_platform_ops {  	void (*iommu_shutdown)(void);  	bool (*is_untracked_pat_range)(u64 start, u64 end);  	void (*nmi_init)(void); +	unsigned char (*get_nmi_reason)(void);  	int (*i8042_detect)(void);  }; diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index b9c8628974af..27d1e7cbdb6c 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/nmi.c @@ -348,7 +348,7 @@ static notrace __kprobes void default_do_nmi(struct pt_regs *regs)  	/* Non-CPU-specific NMI: NMI sources can be processed on any CPU */  	raw_spin_lock(&nmi_reason_lock); -	reason = get_nmi_reason(); +	reason = x86_platform.get_nmi_reason();  	if (reason & NMI_REASON_MASK) {  		if (reason & NMI_REASON_SERR) diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c index 701c7be442f1..c1d6cd549397 100644 --- a/arch/x86/kernel/x86_init.c +++ b/arch/x86/kernel/x86_init.c @@ -21,6 +21,7 @@  #include <asm/pat.h>  #include <asm/tsc.h>  #include <asm/iommu.h> +#include <asm/mach_traps.h>  void __cpuinit x86_init_noop(void) { }  void __init x86_init_uint_noop(unsigned int unused) { } @@ -104,6 +105,7 @@ struct x86_platform_ops x86_platform = {  	.iommu_shutdown			= iommu_shutdown_noop,  	.is_untracked_pat_range		= is_ISA_range,  	.nmi_init			= default_nmi_init, +	.get_nmi_reason			= default_get_nmi_reason,  	.i8042_detect			= default_i8042_detect  }; diff --git a/arch/x86/platform/mrst/mrst.c b/arch/x86/platform/mrst/mrst.c index b7f14e5b2c66..9b9ee292c107 100644 --- a/arch/x86/platform/mrst/mrst.c +++ b/arch/x86/platform/mrst/mrst.c @@ -277,6 +277,17 @@ static void mrst_reboot(void)  }  /* + * Moorestown does not have external NMI source nor port 0x61 to report + * NMI status. The possible NMI sources are from pmu as a result of NMI + * watchdog or lock debug. Reading io port 0x61 results in 0xff which + * misled NMI handler. + */ +static unsigned char mrst_get_nmi_reason(void) +{ +	return 0; +} + +/*   * Moorestown specific x86_init function overrides and early setup   * calls.   */ @@ -297,6 +308,8 @@ void __init x86_mrst_early_setup(void)  	x86_platform.calibrate_tsc = mrst_calibrate_tsc;  	x86_platform.i8042_detect = mrst_i8042_detect;  	x86_init.timers.wallclock_init = mrst_rtc_init; +	x86_platform.get_nmi_reason = mrst_get_nmi_reason; +  	x86_init.pci.init = pci_mrst_init;  	x86_init.pci.fixup_irqs = x86_init_noop;  | 
