78c0617646
Enable NMI on all cpus in UV system and add an NMI handler to dump_stack on each cpu. By default on x86 all the cpus except the boot cpu have NMI masked off. This patch enables NMI on all cpus in UV system and adds an NMI handler to dump_stack on each cpu. This way if a system hangs we can NMI the machine and get a backtrace from all the cpus. Version 2: Use x86_platform driver mechanism for nmi init, per Ingo's suggestion. Version 3: Clean up Ingo's nits. Signed-off-by: Russ Anderson <rja@sgi.com> LKML-Reference: <20100226164912.GA24439@sgi.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
147 lines
4.1 KiB
C
147 lines
4.1 KiB
C
#ifndef _ASM_X86_PLATFORM_H
|
|
#define _ASM_X86_PLATFORM_H
|
|
|
|
#include <asm/pgtable_types.h>
|
|
#include <asm/bootparam.h>
|
|
|
|
struct mpc_bus;
|
|
struct mpc_cpu;
|
|
struct mpc_table;
|
|
|
|
/**
|
|
* struct x86_init_mpparse - platform specific mpparse ops
|
|
* @mpc_record: platform specific mpc record accounting
|
|
* @setup_ioapic_ids: platform specific ioapic id override
|
|
* @mpc_apic_id: platform specific mpc apic id assignment
|
|
* @smp_read_mpc_oem: platform specific oem mpc table setup
|
|
* @mpc_oem_pci_bus: platform specific pci bus setup (default NULL)
|
|
* @mpc_oem_bus_info: platform specific mpc bus info
|
|
* @find_smp_config: find the smp configuration
|
|
* @get_smp_config: get the smp configuration
|
|
*/
|
|
struct x86_init_mpparse {
|
|
void (*mpc_record)(unsigned int mode);
|
|
void (*setup_ioapic_ids)(void);
|
|
int (*mpc_apic_id)(struct mpc_cpu *m);
|
|
void (*smp_read_mpc_oem)(struct mpc_table *mpc);
|
|
void (*mpc_oem_pci_bus)(struct mpc_bus *m);
|
|
void (*mpc_oem_bus_info)(struct mpc_bus *m, char *name);
|
|
void (*find_smp_config)(void);
|
|
void (*get_smp_config)(unsigned int early);
|
|
};
|
|
|
|
/**
|
|
* struct x86_init_resources - platform specific resource related ops
|
|
* @probe_roms: probe BIOS roms
|
|
* @reserve_resources: reserve the standard resources for the
|
|
* platform
|
|
* @memory_setup: platform specific memory setup
|
|
*
|
|
*/
|
|
struct x86_init_resources {
|
|
void (*probe_roms)(void);
|
|
void (*reserve_resources)(void);
|
|
char *(*memory_setup)(void);
|
|
};
|
|
|
|
/**
|
|
* struct x86_init_irqs - platform specific interrupt setup
|
|
* @pre_vector_init: init code to run before interrupt vectors
|
|
* are set up.
|
|
* @intr_init: interrupt init code
|
|
* @trap_init: platform specific trap setup
|
|
*/
|
|
struct x86_init_irqs {
|
|
void (*pre_vector_init)(void);
|
|
void (*intr_init)(void);
|
|
void (*trap_init)(void);
|
|
};
|
|
|
|
/**
|
|
* struct x86_init_oem - oem platform specific customizing functions
|
|
* @arch_setup: platform specific architecure setup
|
|
* @banner: print a platform specific banner
|
|
*/
|
|
struct x86_init_oem {
|
|
void (*arch_setup)(void);
|
|
void (*banner)(void);
|
|
};
|
|
|
|
/**
|
|
* struct x86_init_paging - platform specific paging functions
|
|
* @pagetable_setup_start: platform specific pre paging_init() call
|
|
* @pagetable_setup_done: platform specific post paging_init() call
|
|
*/
|
|
struct x86_init_paging {
|
|
void (*pagetable_setup_start)(pgd_t *base);
|
|
void (*pagetable_setup_done)(pgd_t *base);
|
|
};
|
|
|
|
/**
|
|
* struct x86_init_timers - platform specific timer setup
|
|
* @setup_perpcu_clockev: set up the per cpu clock event device for the
|
|
* boot cpu
|
|
* @tsc_pre_init: platform function called before TSC init
|
|
* @timer_init: initialize the platform timer (default PIT/HPET)
|
|
*/
|
|
struct x86_init_timers {
|
|
void (*setup_percpu_clockev)(void);
|
|
void (*tsc_pre_init)(void);
|
|
void (*timer_init)(void);
|
|
};
|
|
|
|
/**
|
|
* struct x86_init_iommu - platform specific iommu setup
|
|
* @iommu_init: platform specific iommu setup
|
|
*/
|
|
struct x86_init_iommu {
|
|
int (*iommu_init)(void);
|
|
};
|
|
|
|
/**
|
|
* struct x86_init_ops - functions for platform specific setup
|
|
*
|
|
*/
|
|
struct x86_init_ops {
|
|
struct x86_init_resources resources;
|
|
struct x86_init_mpparse mpparse;
|
|
struct x86_init_irqs irqs;
|
|
struct x86_init_oem oem;
|
|
struct x86_init_paging paging;
|
|
struct x86_init_timers timers;
|
|
struct x86_init_iommu iommu;
|
|
};
|
|
|
|
/**
|
|
* struct x86_cpuinit_ops - platform specific cpu hotplug setups
|
|
* @setup_percpu_clockev: set up the per cpu clock event device
|
|
*/
|
|
struct x86_cpuinit_ops {
|
|
void (*setup_percpu_clockev)(void);
|
|
};
|
|
|
|
/**
|
|
* struct x86_platform_ops - platform specific runtime functions
|
|
* @calibrate_tsc: calibrate TSC
|
|
* @get_wallclock: get time from HW clock like RTC etc.
|
|
* @set_wallclock: set time back to HW clock
|
|
* @is_untracked_pat_range exclude from PAT logic
|
|
* @nmi_init enable NMI on cpus
|
|
*/
|
|
struct x86_platform_ops {
|
|
unsigned long (*calibrate_tsc)(void);
|
|
unsigned long (*get_wallclock)(void);
|
|
int (*set_wallclock)(unsigned long nowtime);
|
|
void (*iommu_shutdown)(void);
|
|
bool (*is_untracked_pat_range)(u64 start, u64 end);
|
|
void (*nmi_init)(void);
|
|
};
|
|
|
|
extern struct x86_init_ops x86_init;
|
|
extern struct x86_cpuinit_ops x86_cpuinit;
|
|
extern struct x86_platform_ops x86_platform;
|
|
|
|
extern void x86_init_noop(void);
|
|
extern void x86_init_uint_noop(unsigned int unused);
|
|
|
|
#endif
|