aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/genapic_64.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel/genapic_64.c')
-rw-r--r--arch/x86/kernel/genapic_64.c18
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
33DEFINE_PER_CPU(u16, x86_cpu_to_apicid) = BAD_APICID; 34DEFINE_PER_CPU(u16, x86_cpu_to_apicid) = BAD_APICID;
34EXPORT_PER_CPU_SYMBOL(x86_cpu_to_apicid); 35EXPORT_PER_CPU_SYMBOL(x86_cpu_to_apicid);
36DEFINE_PER_CPU(int, x2apic_extra_bits);
35 37
36struct genapic __read_mostly *genapic = &apic_flat; 38struct genapic __read_mostly *genapic = &apic_flat;
37 39
@@ -42,6 +44,9 @@ static enum uv_system_type uv_system_type;
42 */ 44 */
43void __init setup_apic_routing(void) 45void __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
90unsigned 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
85enum uv_system_type get_uv_system_type(void) 103enum uv_system_type get_uv_system_type(void)
86{ 104{
87 return uv_system_type; 105 return uv_system_type;