diff options
Diffstat (limited to 'arch/x86/kernel/apic/probe_32.c')
| -rw-r--r-- | arch/x86/kernel/apic/probe_32.c | 29 | 
1 files changed, 27 insertions, 2 deletions
diff --git a/arch/x86/kernel/apic/probe_32.c b/arch/x86/kernel/apic/probe_32.c index 1a6559f6768..99d2fe01608 100644 --- a/arch/x86/kernel/apic/probe_32.c +++ b/arch/x86/kernel/apic/probe_32.c @@ -52,7 +52,32 @@ static int __init print_ipi_mode(void)  }  late_initcall(print_ipi_mode); -void default_setup_apic_routing(void) +void __init default_setup_apic_routing(void) +{ +	int version = apic_version[boot_cpu_physical_apicid]; + +	if (num_possible_cpus() > 8) { +		switch (boot_cpu_data.x86_vendor) { +		case X86_VENDOR_INTEL: +			if (!APIC_XAPIC(version)) { +				def_to_bigsmp = 0; +				break; +			} +			/* If P4 and above fall through */ +		case X86_VENDOR_AMD: +			def_to_bigsmp = 1; +		} +	} + +#ifdef CONFIG_X86_BIGSMP +	generic_bigsmp_probe(); +#endif + +	if (apic->setup_apic_routing) +		apic->setup_apic_routing(); +} + +static void setup_apic_flat_routing(void)  {  #ifdef CONFIG_X86_IO_APIC  	printk(KERN_INFO @@ -103,7 +128,7 @@ struct apic apic_default = {  	.init_apic_ldr			= default_init_apic_ldr,  	.ioapic_phys_id_map		= default_ioapic_phys_id_map, -	.setup_apic_routing		= default_setup_apic_routing, +	.setup_apic_routing		= setup_apic_flat_routing,  	.multi_timer_check		= NULL,  	.apicid_to_node			= default_apicid_to_node,  	.cpu_to_logical_apicid		= default_cpu_to_logical_apicid,  |