x86: Move get/find_smp_config to x86_init_ops
Replace the quirk machinery by a x86_init_ops function which defaults to the standard implementation. Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
90e1c6969d
commit
b3f1b617f4
|
@ -4,6 +4,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
||||||
#include <asm/mpspec_def.h>
|
#include <asm/mpspec_def.h>
|
||||||
|
#include <asm/x86_init.h>
|
||||||
|
|
||||||
extern int apic_version[MAX_APICS];
|
extern int apic_version[MAX_APICS];
|
||||||
extern int pic_mode;
|
extern int pic_mode;
|
||||||
|
@ -41,9 +42,6 @@ extern int quad_local_to_mp_bus_id [NR_CPUS/4][4];
|
||||||
|
|
||||||
#endif /* CONFIG_X86_64 */
|
#endif /* CONFIG_X86_64 */
|
||||||
|
|
||||||
extern void early_find_smp_config(void);
|
|
||||||
extern void early_get_smp_config(void);
|
|
||||||
|
|
||||||
#if defined(CONFIG_MCA) || defined(CONFIG_EISA)
|
#if defined(CONFIG_MCA) || defined(CONFIG_EISA)
|
||||||
extern int mp_bus_id_to_type[MAX_MP_BUSSES];
|
extern int mp_bus_id_to_type[MAX_MP_BUSSES];
|
||||||
#endif
|
#endif
|
||||||
|
@ -52,14 +50,36 @@ extern DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES);
|
||||||
|
|
||||||
extern unsigned int boot_cpu_physical_apicid;
|
extern unsigned int boot_cpu_physical_apicid;
|
||||||
extern unsigned int max_physical_apicid;
|
extern unsigned int max_physical_apicid;
|
||||||
extern int smp_found_config;
|
|
||||||
extern int mpc_default_type;
|
extern int mpc_default_type;
|
||||||
extern unsigned long mp_lapic_addr;
|
extern unsigned long mp_lapic_addr;
|
||||||
|
|
||||||
extern void get_smp_config(void);
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
|
extern int smp_found_config;
|
||||||
|
#else
|
||||||
|
# define smp_found_config 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline void get_smp_config(void)
|
||||||
|
{
|
||||||
|
x86_init.mpparse.get_smp_config(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void early_get_smp_config(void)
|
||||||
|
{
|
||||||
|
x86_init.mpparse.get_smp_config(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void find_smp_config(void)
|
||||||
|
{
|
||||||
|
x86_init.mpparse.find_smp_config(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void early_find_smp_config(void)
|
||||||
|
{
|
||||||
|
x86_init.mpparse.find_smp_config(0);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_X86_MPPARSE
|
#ifdef CONFIG_X86_MPPARSE
|
||||||
extern void find_smp_config(void);
|
|
||||||
extern void early_reserve_e820_mpc_new(void);
|
extern void early_reserve_e820_mpc_new(void);
|
||||||
extern int enable_update_mptable;
|
extern int enable_update_mptable;
|
||||||
extern int default_mpc_apic_id(struct mpc_cpu *m);
|
extern int default_mpc_apic_id(struct mpc_cpu *m);
|
||||||
|
@ -69,13 +89,16 @@ extern void default_mpc_oem_bus_info(struct mpc_bus *m, char *str);
|
||||||
# else
|
# else
|
||||||
# define default_mpc_oem_bus_info NULL
|
# define default_mpc_oem_bus_info NULL
|
||||||
# endif
|
# endif
|
||||||
|
extern void default_find_smp_config(unsigned int reserve);
|
||||||
|
extern void default_get_smp_config(unsigned int early);
|
||||||
#else
|
#else
|
||||||
static inline void find_smp_config(void) { }
|
|
||||||
static inline void early_reserve_e820_mpc_new(void) { }
|
static inline void early_reserve_e820_mpc_new(void) { }
|
||||||
#define enable_update_mptable 0
|
#define enable_update_mptable 0
|
||||||
#define default_mpc_apic_id NULL
|
#define default_mpc_apic_id NULL
|
||||||
#define default_smp_read_mpc_oem NULL
|
#define default_smp_read_mpc_oem NULL
|
||||||
#define default_mpc_oem_bus_info NULL
|
#define default_mpc_oem_bus_info NULL
|
||||||
|
#define default_find_smp_config x86_init_uint_noop
|
||||||
|
#define default_get_smp_config x86_init_uint_noop
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void __cpuinit generic_processor_info(int apicid, int version);
|
void __cpuinit generic_processor_info(int apicid, int version);
|
||||||
|
|
|
@ -19,8 +19,6 @@ struct x86_quirks {
|
||||||
int (*arch_pre_intr_init)(void);
|
int (*arch_pre_intr_init)(void);
|
||||||
int (*arch_intr_init)(void);
|
int (*arch_intr_init)(void);
|
||||||
int (*arch_trap_init)(void);
|
int (*arch_trap_init)(void);
|
||||||
int (*mach_get_smp_config)(unsigned int early);
|
|
||||||
int (*mach_find_smp_config)(unsigned int reserve);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void x86_quirk_intr_init(void);
|
extern void x86_quirk_intr_init(void);
|
||||||
|
|
|
@ -13,6 +13,8 @@ struct mpc_table;
|
||||||
* @smp_read_mpc_oem: platform specific oem mpc table setup
|
* @smp_read_mpc_oem: platform specific oem mpc table setup
|
||||||
* @mpc_oem_pci_bus: platform specific pci bus setup (default NULL)
|
* @mpc_oem_pci_bus: platform specific pci bus setup (default NULL)
|
||||||
* @mpc_oem_bus_info: platform specific mpc bus info
|
* @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 {
|
struct x86_init_mpparse {
|
||||||
void (*mpc_record)(unsigned int mode);
|
void (*mpc_record)(unsigned int mode);
|
||||||
|
@ -21,6 +23,8 @@ struct x86_init_mpparse {
|
||||||
void (*smp_read_mpc_oem)(struct mpc_table *mpc);
|
void (*smp_read_mpc_oem)(struct mpc_table *mpc);
|
||||||
void (*mpc_oem_pci_bus)(struct mpc_bus *m);
|
void (*mpc_oem_pci_bus)(struct mpc_bus *m);
|
||||||
void (*mpc_oem_bus_info)(struct mpc_bus *m, char *name);
|
void (*mpc_oem_bus_info)(struct mpc_bus *m, char *name);
|
||||||
|
void (*find_smp_config)(unsigned int reserve);
|
||||||
|
void (*get_smp_config)(unsigned int early);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -268,8 +268,6 @@ static struct x86_quirks numaq_x86_quirks __initdata = {
|
||||||
.arch_pre_intr_init = NULL,
|
.arch_pre_intr_init = NULL,
|
||||||
.arch_intr_init = NULL,
|
.arch_intr_init = NULL,
|
||||||
.arch_trap_init = NULL,
|
.arch_trap_init = NULL,
|
||||||
.mach_get_smp_config = NULL,
|
|
||||||
.mach_find_smp_config = NULL,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static __init void early_check_numaq(void)
|
static __init void early_check_numaq(void)
|
||||||
|
|
|
@ -610,7 +610,7 @@ static int __init check_physptr(struct mpf_intel *mpf, unsigned int early)
|
||||||
/*
|
/*
|
||||||
* Scan the memory blocks for an SMP configuration block.
|
* Scan the memory blocks for an SMP configuration block.
|
||||||
*/
|
*/
|
||||||
static void __init __get_smp_config(unsigned int early)
|
void __init default_get_smp_config(unsigned int early)
|
||||||
{
|
{
|
||||||
struct mpf_intel *mpf = mpf_found;
|
struct mpf_intel *mpf = mpf_found;
|
||||||
|
|
||||||
|
@ -627,11 +627,6 @@ static void __init __get_smp_config(unsigned int early)
|
||||||
if (acpi_lapic && acpi_ioapic)
|
if (acpi_lapic && acpi_ioapic)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (x86_quirks->mach_get_smp_config) {
|
|
||||||
if (x86_quirks->mach_get_smp_config(early))
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
printk(KERN_INFO "Intel MultiProcessor Specification v1.%d\n",
|
printk(KERN_INFO "Intel MultiProcessor Specification v1.%d\n",
|
||||||
mpf->specification);
|
mpf->specification);
|
||||||
#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86_32)
|
#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86_32)
|
||||||
|
@ -672,16 +667,6 @@ static void __init __get_smp_config(unsigned int early)
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init early_get_smp_config(void)
|
|
||||||
{
|
|
||||||
__get_smp_config(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void __init get_smp_config(void)
|
|
||||||
{
|
|
||||||
__get_smp_config(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __init smp_reserve_bootmem(struct mpf_intel *mpf)
|
static void __init smp_reserve_bootmem(struct mpf_intel *mpf)
|
||||||
{
|
{
|
||||||
unsigned long size = get_mpc_size(mpf->physptr);
|
unsigned long size = get_mpc_size(mpf->physptr);
|
||||||
|
@ -747,14 +732,10 @@ static int __init smp_scan_config(unsigned long base, unsigned long length,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init __find_smp_config(unsigned int reserve)
|
void __init default_find_smp_config(unsigned int reserve)
|
||||||
{
|
{
|
||||||
unsigned int address;
|
unsigned int address;
|
||||||
|
|
||||||
if (x86_quirks->mach_find_smp_config) {
|
|
||||||
if (x86_quirks->mach_find_smp_config(reserve))
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
* FIXME: Linux assumes you have 640K of base ram..
|
* FIXME: Linux assumes you have 640K of base ram..
|
||||||
* this continues the error...
|
* this continues the error...
|
||||||
|
@ -789,16 +770,6 @@ static void __init __find_smp_config(unsigned int reserve)
|
||||||
smp_scan_config(address, 0x400, reserve);
|
smp_scan_config(address, 0x400, reserve);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init early_find_smp_config(void)
|
|
||||||
{
|
|
||||||
__find_smp_config(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void __init find_smp_config(void)
|
|
||||||
{
|
|
||||||
__find_smp_config(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_X86_IO_APIC
|
#ifdef CONFIG_X86_IO_APIC
|
||||||
static u8 __initdata irq_used[MAX_IRQ_SOURCES];
|
static u8 __initdata irq_used[MAX_IRQ_SOURCES];
|
||||||
|
|
||||||
|
|
|
@ -981,13 +981,11 @@ void __init setup_arch(char **cmdline_p)
|
||||||
*/
|
*/
|
||||||
acpi_boot_init();
|
acpi_boot_init();
|
||||||
|
|
||||||
#if defined(CONFIG_X86_MPPARSE) || defined(CONFIG_X86_VISWS)
|
|
||||||
/*
|
/*
|
||||||
* get boot-time SMP configuration:
|
* get boot-time SMP configuration:
|
||||||
*/
|
*/
|
||||||
if (smp_found_config)
|
if (smp_found_config)
|
||||||
get_smp_config();
|
get_smp_config();
|
||||||
#endif
|
|
||||||
|
|
||||||
prefill_possible_map();
|
prefill_possible_map();
|
||||||
|
|
||||||
|
|
|
@ -156,12 +156,8 @@ static void visws_machine_power_off(void)
|
||||||
outl(PIIX_SPECIAL_STOP, 0xCFC);
|
outl(PIIX_SPECIAL_STOP, 0xCFC);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init visws_get_smp_config(unsigned int early)
|
static void __init visws_get_smp_config(unsigned int early)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
* Prevent MP-table parsing by the generic code:
|
|
||||||
*/
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -208,7 +204,7 @@ static void __init MP_processor_info(struct mpc_cpu *m)
|
||||||
apic_version[m->apicid] = ver;
|
apic_version[m->apicid] = ver;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init visws_find_smp_config(unsigned int reserve)
|
static void __init visws_find_smp_config(unsigned int reserve)
|
||||||
{
|
{
|
||||||
struct mpc_cpu *mp = phys_to_virt(CO_CPU_TAB_PHYS);
|
struct mpc_cpu *mp = phys_to_virt(CO_CPU_TAB_PHYS);
|
||||||
unsigned short ncpus = readw(phys_to_virt(CO_CPU_NUM_PHYS));
|
unsigned short ncpus = readw(phys_to_virt(CO_CPU_NUM_PHYS));
|
||||||
|
@ -230,8 +226,6 @@ static int __init visws_find_smp_config(unsigned int reserve)
|
||||||
MP_processor_info(mp++);
|
MP_processor_info(mp++);
|
||||||
|
|
||||||
mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
|
mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int visws_trap_init(void);
|
static int visws_trap_init(void);
|
||||||
|
@ -241,8 +235,6 @@ static struct x86_quirks visws_x86_quirks __initdata = {
|
||||||
.arch_pre_intr_init = visws_pre_intr_init,
|
.arch_pre_intr_init = visws_pre_intr_init,
|
||||||
.arch_intr_init = NULL,
|
.arch_intr_init = NULL,
|
||||||
.arch_trap_init = visws_trap_init,
|
.arch_trap_init = visws_trap_init,
|
||||||
.mach_get_smp_config = visws_get_smp_config,
|
|
||||||
.mach_find_smp_config = visws_find_smp_config,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void __init visws_early_detect(void)
|
void __init visws_early_detect(void)
|
||||||
|
@ -263,6 +255,8 @@ void __init visws_early_detect(void)
|
||||||
x86_quirks = &visws_x86_quirks;
|
x86_quirks = &visws_x86_quirks;
|
||||||
|
|
||||||
x86_init.resources.memory_setup = visws_memory_setup;
|
x86_init.resources.memory_setup = visws_memory_setup;
|
||||||
|
x86_init.mpparse.get_smp_config = visws_get_smp_config;
|
||||||
|
x86_init.mpparse.find_smp_config = visws_find_smp_config;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Install reboot quirks:
|
* Install reboot quirks:
|
||||||
|
|
|
@ -32,5 +32,7 @@ struct __initdata x86_init_ops x86_init = {
|
||||||
.mpc_apic_id = default_mpc_apic_id,
|
.mpc_apic_id = default_mpc_apic_id,
|
||||||
.smp_read_mpc_oem = default_smp_read_mpc_oem,
|
.smp_read_mpc_oem = default_smp_read_mpc_oem,
|
||||||
.mpc_oem_bus_info = default_mpc_oem_bus_info,
|
.mpc_oem_bus_info = default_mpc_oem_bus_info,
|
||||||
|
.find_smp_config = default_find_smp_config,
|
||||||
|
.get_smp_config = default_get_smp_config,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue