diff options
Diffstat (limited to 'arch/x86/kernel/apic/probe_64.c')
-rw-r--r-- | arch/x86/kernel/apic/probe_64.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/arch/x86/kernel/apic/probe_64.c b/arch/x86/kernel/apic/probe_64.c new file mode 100644 index 00000000000..8d7748efe6a --- /dev/null +++ b/arch/x86/kernel/apic/probe_64.c | |||
@@ -0,0 +1,93 @@ | |||
1 | /* | ||
2 | * Copyright 2004 James Cleverdon, IBM. | ||
3 | * Subject to the GNU Public License, v.2 | ||
4 | * | ||
5 | * Generic APIC sub-arch probe layer. | ||
6 | * | ||
7 | * Hacked for x86-64 by James Cleverdon from i386 architecture code by | ||
8 | * Martin Bligh, Andi Kleen, James Bottomley, John Stultz, and | ||
9 | * James Cleverdon. | ||
10 | */ | ||
11 | #include <linux/threads.h> | ||
12 | #include <linux/cpumask.h> | ||
13 | #include <linux/string.h> | ||
14 | #include <linux/module.h> | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/ctype.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/hardirq.h> | ||
19 | #include <linux/dmar.h> | ||
20 | |||
21 | #include <asm/smp.h> | ||
22 | #include <asm/apic.h> | ||
23 | #include <asm/ipi.h> | ||
24 | #include <asm/setup.h> | ||
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 | /* | ||
48 | * Check the APIC IDs in bios_cpu_apicid and choose the APIC mode. | ||
49 | */ | ||
50 | void __init default_setup_apic_routing(void) | ||
51 | { | ||
52 | #ifdef CONFIG_X86_X2APIC | ||
53 | if (x2apic && (apic != &apic_x2apic_phys && | ||
54 | #ifdef CONFIG_X86_UV | ||
55 | apic != &apic_x2apic_uv_x && | ||
56 | #endif | ||
57 | apic != &apic_x2apic_cluster)) { | ||
58 | if (x2apic_phys) | ||
59 | apic = &apic_x2apic_phys; | ||
60 | else | ||
61 | apic = &apic_x2apic_cluster; | ||
62 | printk(KERN_INFO "Setting APIC routing to %s\n", apic->name); | ||
63 | } | ||
64 | #endif | ||
65 | |||
66 | if (apic == &apic_flat) { | ||
67 | if (max_physical_apicid >= 8) | ||
68 | apic = &apic_physflat; | ||
69 | printk(KERN_INFO "Setting APIC routing to %s\n", apic->name); | ||
70 | } | ||
71 | } | ||
72 | |||
73 | /* Same for both flat and physical. */ | ||
74 | |||
75 | void apic_send_IPI_self(int vector) | ||
76 | { | ||
77 | __default_send_IPI_shortcut(APIC_DEST_SELF, vector, APIC_DEST_PHYSICAL); | ||
78 | } | ||
79 | |||
80 | int __init default_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | ||
81 | { | ||
82 | int i; | ||
83 | |||
84 | for (i = 0; apic_probe[i]; ++i) { | ||
85 | if (apic_probe[i]->acpi_madt_oem_check(oem_id, oem_table_id)) { | ||
86 | apic = apic_probe[i]; | ||
87 | printk(KERN_INFO "Setting APIC routing to %s.\n", | ||
88 | apic->name); | ||
89 | return 1; | ||
90 | } | ||
91 | } | ||
92 | return 0; | ||
93 | } | ||