[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.