diff options
author | Steffen Persvold <sp@numascale.com> | 2012-03-16 15:25:35 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2012-03-23 08:28:43 -0400 |
commit | b7157acf429e6aef690646ba964b9ebd25049ec2 (patch) | |
tree | 50e14ff23bde509e429ac9545909c02367a75146 /arch | |
parent | e335e3eb82dada2765297f6ba501afc7555aba10 (diff) |
x86/apic: Add separate apic_id_valid() functions for selected apic drivers
As suggested by Suresh Siddha and Yinghai Lu:
For x2apic pre-enabled systems, apic driver is set already early
through early_acpi_boot_init()/early_acpi_process_madt()/
acpi_parse_madt()/default_acpi_madt_oem_check() path so that
apic_id_valid() checking will be sufficient during MADT and SRAT
parsing.
For non-x2apic pre-enabled systems, all apic ids should be less
than 255.
This allows us to substitute the checks in
arch/x86/kernel/acpi/boot.c::acpi_parse_x2apic() and
arch/x86/mm/srat.c::acpi_numa_x2apic_affinity_init() with
apic->apic_id_valid().
In addition we can avoid feigning the x2apic cpu feature in the
NumaChip apic code.
The following apic drivers have separate apic_id_valid()
functions which will accept x2apic type IDs :
x2apic_phys
x2apic_cluster
x2apic_uv_x
apic_numachip
Signed-off-by: Steffen Persvold <sp@numascale.com>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
Cc: Daniel J Blueman <daniel@numascale-asia.com>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: Jack Steiner <steiner@sgi.com>
Link: http://lkml.kernel.org/r/1331925935-13372-1-git-send-email-sp@numascale.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/include/asm/apic.h | 2 | ||||
-rw-r--r-- | arch/x86/include/asm/x2apic.h | 5 | ||||
-rw-r--r-- | arch/x86/kernel/acpi/boot.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/apic/apic_numachip.c | 3 | ||||
-rw-r--r-- | arch/x86/kernel/apic/x2apic_cluster.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/apic/x2apic_phys.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/apic/x2apic_uv_x.c | 7 | ||||
-rw-r--r-- | arch/x86/mm/srat.c | 2 |
8 files changed, 17 insertions, 8 deletions
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h index a9371c91718c..d3eaac44860a 100644 --- a/arch/x86/include/asm/apic.h +++ b/arch/x86/include/asm/apic.h | |||
@@ -535,7 +535,7 @@ static inline unsigned int read_apic_id(void) | |||
535 | 535 | ||
536 | static inline int default_apic_id_valid(int apicid) | 536 | static inline int default_apic_id_valid(int apicid) |
537 | { | 537 | { |
538 | return x2apic_mode || (apicid < 255); | 538 | return (apicid < 255); |
539 | } | 539 | } |
540 | 540 | ||
541 | extern void default_setup_apic_routing(void); | 541 | extern void default_setup_apic_routing(void); |
diff --git a/arch/x86/include/asm/x2apic.h b/arch/x86/include/asm/x2apic.h index 6bf5b8e478c0..92e54abf89e0 100644 --- a/arch/x86/include/asm/x2apic.h +++ b/arch/x86/include/asm/x2apic.h | |||
@@ -18,6 +18,11 @@ static const struct cpumask *x2apic_target_cpus(void) | |||
18 | return cpu_online_mask; | 18 | return cpu_online_mask; |
19 | } | 19 | } |
20 | 20 | ||
21 | static int x2apic_apic_id_valid(int apicid) | ||
22 | { | ||
23 | return 1; | ||
24 | } | ||
25 | |||
21 | static int x2apic_apic_id_registered(void) | 26 | static int x2apic_apic_id_registered(void) |
22 | { | 27 | { |
23 | return 1; | 28 | return 1; |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 406ed77216d0..0f42c2f44311 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
@@ -239,7 +239,7 @@ acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end) | |||
239 | * to not preallocating memory for all NR_CPUS | 239 | * to not preallocating memory for all NR_CPUS |
240 | * when we use CPU hotplug. | 240 | * when we use CPU hotplug. |
241 | */ | 241 | */ |
242 | if (!cpu_has_x2apic && (apic_id >= 0xff) && enabled) | 242 | if (!apic->apic_id_valid(apic_id) && enabled) |
243 | printk(KERN_WARNING PREFIX "x2apic entry ignored\n"); | 243 | printk(KERN_WARNING PREFIX "x2apic entry ignored\n"); |
244 | else | 244 | else |
245 | acpi_register_lapic(apic_id, enabled); | 245 | acpi_register_lapic(apic_id, enabled); |
diff --git a/arch/x86/kernel/apic/apic_numachip.c b/arch/x86/kernel/apic/apic_numachip.c index d9ea5f331ac5..899803e03214 100644 --- a/arch/x86/kernel/apic/apic_numachip.c +++ b/arch/x86/kernel/apic/apic_numachip.c | |||
@@ -229,11 +229,10 @@ static int __init numachip_system_init(void) | |||
229 | } | 229 | } |
230 | early_initcall(numachip_system_init); | 230 | early_initcall(numachip_system_init); |
231 | 231 | ||
232 | static int __cpuinit numachip_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | 232 | static int numachip_acpi_madt_oem_check(char *oem_id, char *oem_table_id) |
233 | { | 233 | { |
234 | if (!strncmp(oem_id, "NUMASC", 6)) { | 234 | if (!strncmp(oem_id, "NUMASC", 6)) { |
235 | numachip_system = 1; | 235 | numachip_system = 1; |
236 | setup_force_cpu_cap(X86_FEATURE_X2APIC); | ||
237 | return 1; | 236 | return 1; |
238 | } | 237 | } |
239 | 238 | ||
diff --git a/arch/x86/kernel/apic/x2apic_cluster.c b/arch/x86/kernel/apic/x2apic_cluster.c index 9193713060a9..48f3103b3c93 100644 --- a/arch/x86/kernel/apic/x2apic_cluster.c +++ b/arch/x86/kernel/apic/x2apic_cluster.c | |||
@@ -213,7 +213,7 @@ static struct apic apic_x2apic_cluster = { | |||
213 | .name = "cluster x2apic", | 213 | .name = "cluster x2apic", |
214 | .probe = x2apic_cluster_probe, | 214 | .probe = x2apic_cluster_probe, |
215 | .acpi_madt_oem_check = x2apic_acpi_madt_oem_check, | 215 | .acpi_madt_oem_check = x2apic_acpi_madt_oem_check, |
216 | .apic_id_valid = default_apic_id_valid, | 216 | .apic_id_valid = x2apic_apic_id_valid, |
217 | .apic_id_registered = x2apic_apic_id_registered, | 217 | .apic_id_registered = x2apic_apic_id_registered, |
218 | 218 | ||
219 | .irq_delivery_mode = dest_LowestPrio, | 219 | .irq_delivery_mode = dest_LowestPrio, |
diff --git a/arch/x86/kernel/apic/x2apic_phys.c b/arch/x86/kernel/apic/x2apic_phys.c index bcd1db6eaca9..8a778db45e3a 100644 --- a/arch/x86/kernel/apic/x2apic_phys.c +++ b/arch/x86/kernel/apic/x2apic_phys.c | |||
@@ -119,7 +119,7 @@ static struct apic apic_x2apic_phys = { | |||
119 | .name = "physical x2apic", | 119 | .name = "physical x2apic", |
120 | .probe = x2apic_phys_probe, | 120 | .probe = x2apic_phys_probe, |
121 | .acpi_madt_oem_check = x2apic_acpi_madt_oem_check, | 121 | .acpi_madt_oem_check = x2apic_acpi_madt_oem_check, |
122 | .apic_id_valid = default_apic_id_valid, | 122 | .apic_id_valid = x2apic_apic_id_valid, |
123 | .apic_id_registered = x2apic_apic_id_registered, | 123 | .apic_id_registered = x2apic_apic_id_registered, |
124 | 124 | ||
125 | .irq_delivery_mode = dest_Fixed, | 125 | .irq_delivery_mode = dest_Fixed, |
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index fc4771425852..87bfa69e216e 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
@@ -266,6 +266,11 @@ static void uv_send_IPI_all(int vector) | |||
266 | uv_send_IPI_mask(cpu_online_mask, vector); | 266 | uv_send_IPI_mask(cpu_online_mask, vector); |
267 | } | 267 | } |
268 | 268 | ||
269 | static int uv_apic_id_valid(int apicid) | ||
270 | { | ||
271 | return 1; | ||
272 | } | ||
273 | |||
269 | static int uv_apic_id_registered(void) | 274 | static int uv_apic_id_registered(void) |
270 | { | 275 | { |
271 | return 1; | 276 | return 1; |
@@ -351,7 +356,7 @@ static struct apic __refdata apic_x2apic_uv_x = { | |||
351 | .name = "UV large system", | 356 | .name = "UV large system", |
352 | .probe = uv_probe, | 357 | .probe = uv_probe, |
353 | .acpi_madt_oem_check = uv_acpi_madt_oem_check, | 358 | .acpi_madt_oem_check = uv_acpi_madt_oem_check, |
354 | .apic_id_valid = default_apic_id_valid, | 359 | .apic_id_valid = uv_apic_id_valid, |
355 | .apic_id_registered = uv_apic_id_registered, | 360 | .apic_id_registered = uv_apic_id_registered, |
356 | 361 | ||
357 | .irq_delivery_mode = dest_Fixed, | 362 | .irq_delivery_mode = dest_Fixed, |
diff --git a/arch/x86/mm/srat.c b/arch/x86/mm/srat.c index 1c1c4f46a7c1..efb5b4b93711 100644 --- a/arch/x86/mm/srat.c +++ b/arch/x86/mm/srat.c | |||
@@ -70,7 +70,7 @@ acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa) | |||
70 | return; | 70 | return; |
71 | pxm = pa->proximity_domain; | 71 | pxm = pa->proximity_domain; |
72 | apic_id = pa->apic_id; | 72 | apic_id = pa->apic_id; |
73 | if (!cpu_has_x2apic && (apic_id >= 0xff)) { | 73 | if (!apic->apic_id_valid(apic_id)) { |
74 | printk(KERN_INFO "SRAT: PXM %u -> X2APIC 0x%04x ignored\n", | 74 | printk(KERN_INFO "SRAT: PXM %u -> X2APIC 0x%04x ignored\n", |
75 | pxm, apic_id); | 75 | pxm, apic_id); |
76 | return; | 76 | return; |