diff options
Diffstat (limited to 'arch/x86/kernel/genapic_64.c')
-rw-r--r-- | arch/x86/kernel/genapic_64.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/arch/x86/kernel/genapic_64.c b/arch/x86/kernel/genapic_64.c index 4cc1c218ae4c..910a4a777a4c 100644 --- a/arch/x86/kernel/genapic_64.c +++ b/arch/x86/kernel/genapic_64.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <linux/ctype.h> | 16 | #include <linux/ctype.h> |
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | #include <linux/hardirq.h> | ||
18 | 19 | ||
19 | #include <asm/smp.h> | 20 | #include <asm/smp.h> |
20 | #include <asm/ipi.h> | 21 | #include <asm/ipi.h> |
@@ -32,6 +33,7 @@ void *x86_cpu_to_apicid_early_ptr; | |||
32 | #endif | 33 | #endif |
33 | DEFINE_PER_CPU(u16, x86_cpu_to_apicid) = BAD_APICID; | 34 | DEFINE_PER_CPU(u16, x86_cpu_to_apicid) = BAD_APICID; |
34 | EXPORT_PER_CPU_SYMBOL(x86_cpu_to_apicid); | 35 | EXPORT_PER_CPU_SYMBOL(x86_cpu_to_apicid); |
36 | DEFINE_PER_CPU(int, x2apic_extra_bits); | ||
35 | 37 | ||
36 | struct genapic __read_mostly *genapic = &apic_flat; | 38 | struct genapic __read_mostly *genapic = &apic_flat; |
37 | 39 | ||
@@ -42,6 +44,9 @@ static enum uv_system_type uv_system_type; | |||
42 | */ | 44 | */ |
43 | void __init setup_apic_routing(void) | 45 | void __init setup_apic_routing(void) |
44 | { | 46 | { |
47 | if (uv_system_type == UV_NON_UNIQUE_APIC) | ||
48 | genapic = &apic_x2apic_uv_x; | ||
49 | else | ||
45 | #ifdef CONFIG_ACPI | 50 | #ifdef CONFIG_ACPI |
46 | /* | 51 | /* |
47 | * Quirk: some x86_64 machines can only use physical APIC mode | 52 | * Quirk: some x86_64 machines can only use physical APIC mode |
@@ -82,6 +87,19 @@ int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id) | |||
82 | return 0; | 87 | return 0; |
83 | } | 88 | } |
84 | 89 | ||
90 | unsigned int read_apic_id(void) | ||
91 | { | ||
92 | unsigned int id; | ||
93 | |||
94 | WARN_ON(preemptible()); | ||
95 | id = apic_read(APIC_ID); | ||
96 | if (uv_system_type >= UV_X2APIC) | ||
97 | id |= __get_cpu_var(x2apic_extra_bits); | ||
98 | else | ||
99 | id = (id >> 24) & 0xFFu;; | ||
100 | return id; | ||
101 | } | ||
102 | |||
85 | enum uv_system_type get_uv_system_type(void) | 103 | enum uv_system_type get_uv_system_type(void) |
86 | { | 104 | { |
87 | return uv_system_type; | 105 | return uv_system_type; |