diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-09-23 07:26:27 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-09-23 07:26:27 -0400 |
commit | 101d5b713700b902b1c200cdd1925c3cb7d34567 (patch) | |
tree | a0d4b4140129ad2f24fd17b965dfcfbbb1ac01db /arch/x86/kernel/genx2apic_uv_x.c | |
parent | cec5eb7be3a104fffd27ca967ee8e15a123050e2 (diff) | |
parent | e6babb6b7fed93c93f8fc5ef8ebd3a474fc2df3e (diff) |
Merge branch 'x86/signal' into core/signal
Conflicts:
arch/x86/kernel/cpu/feature_names.c
arch/x86/kernel/setup.c
drivers/pci/intel-iommu.c
include/asm-x86/cpufeature.h
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/genx2apic_uv_x.c')
-rw-r--r-- | arch/x86/kernel/genx2apic_uv_x.c | 69 |
1 files changed, 67 insertions, 2 deletions
diff --git a/arch/x86/kernel/genx2apic_uv_x.c b/arch/x86/kernel/genx2apic_uv_x.c index bfa837cb16be..99269beabc7c 100644 --- a/arch/x86/kernel/genx2apic_uv_x.c +++ b/arch/x86/kernel/genx2apic_uv_x.c | |||
@@ -12,12 +12,12 @@ | |||
12 | #include <linux/threads.h> | 12 | #include <linux/threads.h> |
13 | #include <linux/cpumask.h> | 13 | #include <linux/cpumask.h> |
14 | #include <linux/string.h> | 14 | #include <linux/string.h> |
15 | #include <linux/kernel.h> | ||
16 | #include <linux/ctype.h> | 15 | #include <linux/ctype.h> |
17 | #include <linux/init.h> | 16 | #include <linux/init.h> |
18 | #include <linux/sched.h> | 17 | #include <linux/sched.h> |
19 | #include <linux/bootmem.h> | 18 | #include <linux/bootmem.h> |
20 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/hardirq.h> | ||
21 | #include <asm/smp.h> | 21 | #include <asm/smp.h> |
22 | #include <asm/ipi.h> | 22 | #include <asm/ipi.h> |
23 | #include <asm/genapic.h> | 23 | #include <asm/genapic.h> |
@@ -26,6 +26,35 @@ | |||
26 | #include <asm/uv/uv_hub.h> | 26 | #include <asm/uv/uv_hub.h> |
27 | #include <asm/uv/bios.h> | 27 | #include <asm/uv/bios.h> |
28 | 28 | ||
29 | DEFINE_PER_CPU(int, x2apic_extra_bits); | ||
30 | |||
31 | static enum uv_system_type uv_system_type; | ||
32 | |||
33 | static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | ||
34 | { | ||
35 | if (!strcmp(oem_id, "SGI")) { | ||
36 | if (!strcmp(oem_table_id, "UVL")) | ||
37 | uv_system_type = UV_LEGACY_APIC; | ||
38 | else if (!strcmp(oem_table_id, "UVX")) | ||
39 | uv_system_type = UV_X2APIC; | ||
40 | else if (!strcmp(oem_table_id, "UVH")) { | ||
41 | uv_system_type = UV_NON_UNIQUE_APIC; | ||
42 | return 1; | ||
43 | } | ||
44 | } | ||
45 | return 0; | ||
46 | } | ||
47 | |||
48 | enum uv_system_type get_uv_system_type(void) | ||
49 | { | ||
50 | return uv_system_type; | ||
51 | } | ||
52 | |||
53 | int is_uv_system(void) | ||
54 | { | ||
55 | return uv_system_type != UV_NONE; | ||
56 | } | ||
57 | |||
29 | DEFINE_PER_CPU(struct uv_hub_info_s, __uv_hub_info); | 58 | DEFINE_PER_CPU(struct uv_hub_info_s, __uv_hub_info); |
30 | EXPORT_PER_CPU_SYMBOL_GPL(__uv_hub_info); | 59 | EXPORT_PER_CPU_SYMBOL_GPL(__uv_hub_info); |
31 | 60 | ||
@@ -123,6 +152,10 @@ static int uv_apic_id_registered(void) | |||
123 | return 1; | 152 | return 1; |
124 | } | 153 | } |
125 | 154 | ||
155 | static void uv_init_apic_ldr(void) | ||
156 | { | ||
157 | } | ||
158 | |||
126 | static unsigned int uv_cpu_mask_to_apicid(cpumask_t cpumask) | 159 | static unsigned int uv_cpu_mask_to_apicid(cpumask_t cpumask) |
127 | { | 160 | { |
128 | int cpu; | 161 | int cpu; |
@@ -138,9 +171,34 @@ static unsigned int uv_cpu_mask_to_apicid(cpumask_t cpumask) | |||
138 | return BAD_APICID; | 171 | return BAD_APICID; |
139 | } | 172 | } |
140 | 173 | ||
174 | static unsigned int get_apic_id(unsigned long x) | ||
175 | { | ||
176 | unsigned int id; | ||
177 | |||
178 | WARN_ON(preemptible() && num_online_cpus() > 1); | ||
179 | id = x | __get_cpu_var(x2apic_extra_bits); | ||
180 | |||
181 | return id; | ||
182 | } | ||
183 | |||
184 | static unsigned long set_apic_id(unsigned int id) | ||
185 | { | ||
186 | unsigned long x; | ||
187 | |||
188 | /* maskout x2apic_extra_bits ? */ | ||
189 | x = id; | ||
190 | return x; | ||
191 | } | ||
192 | |||
193 | static unsigned int uv_read_apic_id(void) | ||
194 | { | ||
195 | |||
196 | return get_apic_id(apic_read(APIC_ID)); | ||
197 | } | ||
198 | |||
141 | static unsigned int phys_pkg_id(int index_msb) | 199 | static unsigned int phys_pkg_id(int index_msb) |
142 | { | 200 | { |
143 | return GET_APIC_ID(read_apic_id()) >> index_msb; | 201 | return uv_read_apic_id() >> index_msb; |
144 | } | 202 | } |
145 | 203 | ||
146 | #ifdef ZZZ /* Needs x2apic patch */ | 204 | #ifdef ZZZ /* Needs x2apic patch */ |
@@ -152,17 +210,22 @@ static void uv_send_IPI_self(int vector) | |||
152 | 210 | ||
153 | struct genapic apic_x2apic_uv_x = { | 211 | struct genapic apic_x2apic_uv_x = { |
154 | .name = "UV large system", | 212 | .name = "UV large system", |
213 | .acpi_madt_oem_check = uv_acpi_madt_oem_check, | ||
155 | .int_delivery_mode = dest_Fixed, | 214 | .int_delivery_mode = dest_Fixed, |
156 | .int_dest_mode = (APIC_DEST_PHYSICAL != 0), | 215 | .int_dest_mode = (APIC_DEST_PHYSICAL != 0), |
157 | .target_cpus = uv_target_cpus, | 216 | .target_cpus = uv_target_cpus, |
158 | .vector_allocation_domain = uv_vector_allocation_domain,/* Fixme ZZZ */ | 217 | .vector_allocation_domain = uv_vector_allocation_domain,/* Fixme ZZZ */ |
159 | .apic_id_registered = uv_apic_id_registered, | 218 | .apic_id_registered = uv_apic_id_registered, |
219 | .init_apic_ldr = uv_init_apic_ldr, | ||
160 | .send_IPI_all = uv_send_IPI_all, | 220 | .send_IPI_all = uv_send_IPI_all, |
161 | .send_IPI_allbutself = uv_send_IPI_allbutself, | 221 | .send_IPI_allbutself = uv_send_IPI_allbutself, |
162 | .send_IPI_mask = uv_send_IPI_mask, | 222 | .send_IPI_mask = uv_send_IPI_mask, |
163 | /* ZZZ.send_IPI_self = uv_send_IPI_self, */ | 223 | /* ZZZ.send_IPI_self = uv_send_IPI_self, */ |
164 | .cpu_mask_to_apicid = uv_cpu_mask_to_apicid, | 224 | .cpu_mask_to_apicid = uv_cpu_mask_to_apicid, |
165 | .phys_pkg_id = phys_pkg_id, /* Fixme ZZZ */ | 225 | .phys_pkg_id = phys_pkg_id, /* Fixme ZZZ */ |
226 | .get_apic_id = get_apic_id, | ||
227 | .set_apic_id = set_apic_id, | ||
228 | .apic_id_mask = (0xFFFFFFFFu), | ||
166 | }; | 229 | }; |
167 | 230 | ||
168 | static __cpuinit void set_x2apic_extra_bits(int pnode) | 231 | static __cpuinit void set_x2apic_extra_bits(int pnode) |
@@ -401,3 +464,5 @@ void __cpuinit uv_cpu_init(void) | |||
401 | if (get_uv_system_type() == UV_NON_UNIQUE_APIC) | 464 | if (get_uv_system_type() == UV_NON_UNIQUE_APIC) |
402 | set_x2apic_extra_bits(uv_hub_info->pnode); | 465 | set_x2apic_extra_bits(uv_hub_info->pnode); |
403 | } | 466 | } |
467 | |||
468 | |||