# 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
|