apic, i386/bigsmp: Fix false warnings regarding logical APIC ID mismatches
[pandora-kernel.git] / arch / x86 / kernel / apic / probe_64.c
index d8c4a6f..3fe9866 100644 (file)
 #include <asm/ipi.h>
 #include <asm/setup.h>
 
-extern struct apic apic_flat;
-extern struct apic apic_physflat;
-extern struct apic apic_x2xpic_uv_x;
-extern struct apic apic_x2apic_phys;
-extern struct apic apic_x2apic_cluster;
-
-struct apic __read_mostly *apic = &apic_flat;
-EXPORT_SYMBOL_GPL(apic);
-
-static struct apic *apic_probe[] __initdata = {
-#ifdef CONFIG_X86_UV
-       &apic_x2apic_uv_x,
-#endif
-#ifdef CONFIG_X86_X2APIC
-       &apic_x2apic_phys,
-       &apic_x2apic_cluster,
-#endif
-       &apic_physflat,
-       NULL,
-};
-
 static int apicid_phys_pkg_id(int initial_apic_id, int index_msb)
 {
        return hard_smp_processor_id() >> index_msb;
@@ -54,26 +33,20 @@ static int apicid_phys_pkg_id(int initial_apic_id, int index_msb)
  */
 void __init default_setup_apic_routing(void)
 {
+       struct apic **drv;
 
        enable_IR_x2apic();
 
-#ifdef CONFIG_X86_X2APIC
-       if (x2apic_mode
-#ifdef CONFIG_X86_UV
-                      && apic != &apic_x2apic_uv_x
-#endif
-                      ) {
-               if (x2apic_phys)
-                       apic = &apic_x2apic_phys;
-               else
-                       apic = &apic_x2apic_cluster;
+       for (drv = __apicdrivers; drv < __apicdrivers_end; drv++) {
+               if ((*drv)->probe && (*drv)->probe()) {
+                       if (apic != *drv) {
+                               apic = *drv;
+                               pr_info("Switched APIC routing to %s.\n",
+                                       apic->name);
+                       }
+                       break;
+               }
        }
-#endif
-
-       if (apic == &apic_flat && num_possible_cpus() > 8)
-                       apic = &apic_physflat;
-
-       printk(KERN_INFO "Setting APIC routing to %s\n", apic->name);
 
        if (is_vsmp_box()) {
                /* need to update phys_pkg_id */
@@ -90,13 +63,15 @@ void apic_send_IPI_self(int vector)
 
 int __init default_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
 {
-       int i;
+       struct apic **drv;
 
-       for (i = 0; apic_probe[i]; ++i) {
-               if (apic_probe[i]->acpi_madt_oem_check(oem_id, oem_table_id)) {
-                       apic = apic_probe[i];
-                       printk(KERN_INFO "Setting APIC routing to %s.\n",
-                               apic->name);
+       for (drv = __apicdrivers; drv < __apicdrivers_end; drv++) {
+               if ((*drv)->acpi_madt_oem_check(oem_id, oem_table_id)) {
+                       if (apic != *drv) {
+                               apic = *drv;
+                               pr_info("Setting APIC routing to %s.\n",
+                                       apic->name);
+                       }
                        return 1;
                }
        }