[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Intel systems with more than 8 CPUs require that the APIC is configured
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID be41d7631c2ffebb3c35ce29a6b7c4ae01161ea1 # Parent b6ebabe4658a0c08e17853431d1c0eba13664d6e Intel systems with more than 8 CPUs require that the APIC is configured in clustered mode with the apic=bigsmp kernel parameter. This patch does the APIC mode selection automatically without needing to manually specify the kernel paremeter. (KAF note: I see the patch is also present in Linux 2.6.14.2) Signed-off-by: Nitin Kamble <nitin.a.kamble@xxxxxxxxx> Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@xxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> diff -r b6ebabe4658a -r be41d7631c2f xen/arch/x86/acpi/boot.c --- a/xen/arch/x86/acpi/boot.c Wed Nov 23 10:15:18 2005 +++ b/xen/arch/x86/acpi/boot.c Wed Nov 23 11:11:05 2005 @@ -602,7 +602,8 @@ error = acpi_parse_madt_lapic_entries(); if (!error) { acpi_lapic = 1; - + generic_bigsmp_probe(); + /* * Parse MADT IO-APIC entries */ diff -r b6ebabe4658a -r be41d7631c2f xen/arch/x86/genapic/bigsmp.c --- a/xen/arch/x86/genapic/bigsmp.c Wed Nov 23 10:15:18 2005 +++ b/xen/arch/x86/genapic/bigsmp.c Wed Nov 23 11:11:05 2005 @@ -45,7 +45,10 @@ static __init int probe_bigsmp(void) { - dmi_check_system(bigsmp_dmi_table); + if (def_to_bigsmp) + dmi_bigsmp = 1; + else + dmi_check_system(bigsmp_dmi_table); return dmi_bigsmp; } diff -r b6ebabe4658a -r be41d7631c2f xen/arch/x86/genapic/probe.c --- a/xen/arch/x86/genapic/probe.c Wed Nov 23 10:15:18 2005 +++ b/xen/arch/x86/genapic/probe.c Wed Nov 23 11:11:05 2005 @@ -29,6 +29,25 @@ NULL, }; +static int cmdline_apic; + +void __init generic_bigsmp_probe(void) +{ + /* + * This routine is used to switch to bigsmp mode when + * - There is no apic= option specified by the user + * - generic_apic_probe() has choosen apic_default as the sub_arch + * - we find more than 8 CPUs in acpi LAPIC listing with xAPIC support + */ + + if (!cmdline_apic && genapic == &apic_default) + if (apic_bigsmp.probe()) { + genapic = &apic_bigsmp; + printk(KERN_INFO "Overriding APIC driver with %s\n", + genapic->name); + } +} + static void __init genapic_apic_force(char *str) { int i; @@ -41,7 +60,7 @@ void __init generic_apic_probe(void) { int i; - int changed = (genapic != NULL); + int changed = cmdline_apic = (genapic != NULL); for (i = 0; !changed && apic_probe[i]; i++) { if (apic_probe[i]->probe()) { diff -r b6ebabe4658a -r be41d7631c2f xen/arch/x86/mpparse.c --- a/xen/arch/x86/mpparse.c Wed Nov 23 10:15:18 2005 +++ b/xen/arch/x86/mpparse.c Wed Nov 23 11:11:05 2005 @@ -62,6 +62,8 @@ int pic_mode; unsigned long mp_lapic_addr; + +unsigned int def_to_bigsmp; /* Processor that is doing the boot up */ unsigned int boot_cpu_physical_apicid = -1U; @@ -213,6 +215,13 @@ ver = 0x10; } apic_version[m->mpc_apicid] = ver; + if ((num_processors > 8) && + APIC_XAPIC(ver) && + (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)) + def_to_bigsmp = 1; + else + def_to_bigsmp = 0; + bios_cpu_apicid[num_processors - 1] = m->mpc_apicid; } diff -r b6ebabe4658a -r be41d7631c2f xen/include/asm-x86/apicdef.h --- a/xen/include/asm-x86/apicdef.h Wed Nov 23 10:15:18 2005 +++ b/xen/include/asm-x86/apicdef.h Wed Nov 23 11:11:05 2005 @@ -16,6 +16,7 @@ #define GET_APIC_VERSION(x) ((x)&0xFF) #define GET_APIC_MAXLVT(x) (((x)>>16)&0xFF) #define APIC_INTEGRATED(x) ((x)&0xF0) +#define APIC_XAPIC(x) ((x) >= 0x14) #define APIC_TASKPRI 0x80 #define APIC_TPRI_MASK 0xFF #define APIC_ARBPRI 0x90 diff -r b6ebabe4658a -r be41d7631c2f xen/include/asm-x86/mach-generic/mach_apic.h --- a/xen/include/asm-x86/mach-generic/mach_apic.h Wed Nov 23 10:15:18 2005 +++ b/xen/include/asm-x86/mach-generic/mach_apic.h Wed Nov 23 11:11:05 2005 @@ -28,4 +28,6 @@ #define enable_apic_mode (genapic->enable_apic_mode) #define phys_pkg_id (genapic->phys_pkg_id) +extern void generic_bigsmp_probe(void); + #endif /* __ASM_MACH_APIC_H */ diff -r b6ebabe4658a -r be41d7631c2f xen/include/asm-x86/mpspec.h --- a/xen/include/asm-x86/mpspec.h Wed Nov 23 10:15:18 2005 +++ b/xen/include/asm-x86/mpspec.h Wed Nov 23 11:11:05 2005 @@ -11,6 +11,7 @@ extern int quad_local_to_mp_bus_id [NR_CPUS/4][4]; extern int mp_bus_id_to_pci_bus [MAX_MP_BUSSES]; +extern unsigned int def_to_bigsmp; extern unsigned int boot_cpu_physical_apicid; extern int smp_found_config; extern void find_smp_config (void); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |