diff options
Diffstat (limited to 'arch/x86/kernel/apic/probe_64.c')
-rw-r--r-- | arch/x86/kernel/apic/probe_64.c | 69 |
1 files changed, 20 insertions, 49 deletions
diff --git a/arch/x86/kernel/apic/probe_64.c b/arch/x86/kernel/apic/probe_64.c index 83e9be4778e2..3fe986698929 100644 --- a/arch/x86/kernel/apic/probe_64.c +++ b/arch/x86/kernel/apic/probe_64.c | |||
@@ -23,27 +23,6 @@ | |||
23 | #include <asm/ipi.h> | 23 | #include <asm/ipi.h> |
24 | #include <asm/setup.h> | 24 | #include <asm/setup.h> |
25 | 25 | ||
26 | extern struct apic apic_flat; | ||
27 | extern struct apic apic_physflat; | ||
28 | extern struct apic apic_x2xpic_uv_x; | ||
29 | extern struct apic apic_x2apic_phys; | ||
30 | extern struct apic apic_x2apic_cluster; | ||
31 | |||
32 | struct apic __read_mostly *apic = &apic_flat; | ||
33 | EXPORT_SYMBOL_GPL(apic); | ||
34 | |||
35 | static struct apic *apic_probe[] __initdata = { | ||
36 | #ifdef CONFIG_X86_UV | ||
37 | &apic_x2apic_uv_x, | ||
38 | #endif | ||
39 | #ifdef CONFIG_X86_X2APIC | ||
40 | &apic_x2apic_phys, | ||
41 | &apic_x2apic_cluster, | ||
42 | #endif | ||
43 | &apic_physflat, | ||
44 | NULL, | ||
45 | }; | ||
46 | |||
47 | static int apicid_phys_pkg_id(int initial_apic_id, int index_msb) | 26 | static int apicid_phys_pkg_id(int initial_apic_id, int index_msb) |
48 | { | 27 | { |
49 | return hard_smp_processor_id() >> index_msb; | 28 | return hard_smp_processor_id() >> index_msb; |
@@ -54,35 +33,25 @@ static int apicid_phys_pkg_id(int initial_apic_id, int index_msb) | |||
54 | */ | 33 | */ |
55 | void __init default_setup_apic_routing(void) | 34 | void __init default_setup_apic_routing(void) |
56 | { | 35 | { |
57 | #ifdef CONFIG_X86_X2APIC | 36 | struct apic **drv; |
58 | if (x2apic_mode | ||
59 | #ifdef CONFIG_X86_UV | ||
60 | && apic != &apic_x2apic_uv_x | ||
61 | #endif | ||
62 | ) { | ||
63 | if (x2apic_phys) | ||
64 | apic = &apic_x2apic_phys; | ||
65 | else | ||
66 | apic = &apic_x2apic_cluster; | ||
67 | } | ||
68 | #endif | ||
69 | 37 | ||
70 | if (apic == &apic_flat && num_possible_cpus() > 8) | 38 | enable_IR_x2apic(); |
71 | apic = &apic_physflat; | ||
72 | 39 | ||
73 | printk(KERN_INFO "Setting APIC routing to %s\n", apic->name); | 40 | for (drv = __apicdrivers; drv < __apicdrivers_end; drv++) { |
41 | if ((*drv)->probe && (*drv)->probe()) { | ||
42 | if (apic != *drv) { | ||
43 | apic = *drv; | ||
44 | pr_info("Switched APIC routing to %s.\n", | ||
45 | apic->name); | ||
46 | } | ||
47 | break; | ||
48 | } | ||
49 | } | ||
74 | 50 | ||
75 | if (is_vsmp_box()) { | 51 | if (is_vsmp_box()) { |
76 | /* need to update phys_pkg_id */ | 52 | /* need to update phys_pkg_id */ |
77 | apic->phys_pkg_id = apicid_phys_pkg_id; | 53 | apic->phys_pkg_id = apicid_phys_pkg_id; |
78 | } | 54 | } |
79 | |||
80 | /* | ||
81 | * Now that apic routing model is selected, configure the | ||
82 | * fault handling for intr remapping. | ||
83 | */ | ||
84 | if (intr_remapping_enabled) | ||
85 | enable_drhd_fault_handling(); | ||
86 | } | 55 | } |
87 | 56 | ||
88 | /* Same for both flat and physical. */ | 57 | /* Same for both flat and physical. */ |
@@ -94,13 +63,15 @@ void apic_send_IPI_self(int vector) | |||
94 | 63 | ||
95 | int __init default_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | 64 | int __init default_acpi_madt_oem_check(char *oem_id, char *oem_table_id) |
96 | { | 65 | { |
97 | int i; | 66 | struct apic **drv; |
98 | 67 | ||
99 | for (i = 0; apic_probe[i]; ++i) { | 68 | for (drv = __apicdrivers; drv < __apicdrivers_end; drv++) { |
100 | if (apic_probe[i]->acpi_madt_oem_check(oem_id, oem_table_id)) { | 69 | if ((*drv)->acpi_madt_oem_check(oem_id, oem_table_id)) { |
101 | apic = apic_probe[i]; | 70 | if (apic != *drv) { |
102 | printk(KERN_INFO "Setting APIC routing to %s.\n", | 71 | apic = *drv; |
103 | apic->name); | 72 | pr_info("Setting APIC routing to %s.\n", |
73 | apic->name); | ||
74 | } | ||
104 | return 1; | 75 | return 1; |
105 | } | 76 | } |
106 | } | 77 | } |