aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/include/asm/apic.h19
-rw-r--r--arch/x86/kernel/apic/apic.c12
-rw-r--r--arch/x86/kernel/apic/apic_noop.c4
-rw-r--r--arch/x86/kernel/apic/bigsmp_32.c2
-rw-r--r--arch/x86/kernel/apic/es7000_32.c4
-rw-r--r--arch/x86/kernel/apic/numaq_32.c2
-rw-r--r--arch/x86/kernel/apic/probe_32.c2
-rw-r--r--arch/x86/kernel/apic/summit_32.c2
8 files changed, 45 insertions, 2 deletions
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index d1aa0c3e7a5c..efb073b5c743 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -354,6 +354,20 @@ struct apic {
354 void (*icr_write)(u32 low, u32 high); 354 void (*icr_write)(u32 low, u32 high);
355 void (*wait_icr_idle)(void); 355 void (*wait_icr_idle)(void);
356 u32 (*safe_wait_icr_idle)(void); 356 u32 (*safe_wait_icr_idle)(void);
357
358#ifdef CONFIG_X86_32
359 /*
360 * Called very early during boot from get_smp_config(). It should
361 * return the logical apicid. x86_[bios]_cpu_to_apicid is
362 * initialized before this function is called.
363 *
364 * If logical apicid can't be determined that early, the function
365 * may return BAD_APICID. Logical apicid will be configured after
366 * init_apic_ldr() while bringing up CPUs. Note that NUMA affinity
367 * won't be applied properly during early boot in this case.
368 */
369 int (*x86_32_early_logical_apicid)(int cpu);
370#endif
357}; 371};
358 372
359/* 373/*
@@ -501,6 +515,11 @@ extern struct apic apic_noop;
501 515
502extern struct apic apic_default; 516extern struct apic apic_default;
503 517
518static inline int noop_x86_32_early_logical_apicid(int cpu)
519{
520 return BAD_APICID;
521}
522
504/* 523/*
505 * Set up the logical destination ID. 524 * Set up the logical destination ID.
506 * 525 *
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index ae08246f320c..3127079628e8 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -1250,8 +1250,13 @@ void __cpuinit setup_local_APIC(void)
1250 1250
1251#ifdef CONFIG_X86_32 1251#ifdef CONFIG_X86_32
1252 /* 1252 /*
1253 * APIC LDR is initialized. Fetch and store logical_apic_id. 1253 * APIC LDR is initialized. If logical_apicid mapping was
1254 * initialized during get_smp_config(), make sure it matches the
1255 * actual value.
1254 */ 1256 */
1257 i = early_per_cpu(x86_cpu_to_logical_apicid, cpu);
1258 WARN_ON(i != BAD_APICID && i != logical_smp_processor_id());
1259 /* always use the value from LDR */
1255 early_per_cpu(x86_cpu_to_logical_apicid, cpu) = 1260 early_per_cpu(x86_cpu_to_logical_apicid, cpu) =
1256 logical_smp_processor_id(); 1261 logical_smp_processor_id();
1257#endif 1262#endif
@@ -1991,7 +1996,10 @@ void __cpuinit generic_processor_info(int apicid, int version)
1991 early_per_cpu(x86_cpu_to_apicid, cpu) = apicid; 1996 early_per_cpu(x86_cpu_to_apicid, cpu) = apicid;
1992 early_per_cpu(x86_bios_cpu_apicid, cpu) = apicid; 1997 early_per_cpu(x86_bios_cpu_apicid, cpu) = apicid;
1993#endif 1998#endif
1994 1999#ifdef CONFIG_X86_32
2000 early_per_cpu(x86_cpu_to_logical_apicid, cpu) =
2001 apic->x86_32_early_logical_apicid(cpu);
2002#endif
1995 set_cpu_possible(cpu, true); 2003 set_cpu_possible(cpu, true);
1996 set_cpu_present(cpu, true); 2004 set_cpu_present(cpu, true);
1997} 2005}
diff --git a/arch/x86/kernel/apic/apic_noop.c b/arch/x86/kernel/apic/apic_noop.c
index f3d19b2426ab..0309c58d96bc 100644
--- a/arch/x86/kernel/apic/apic_noop.c
+++ b/arch/x86/kernel/apic/apic_noop.c
@@ -191,4 +191,8 @@ struct apic apic_noop = {
191 .icr_write = noop_apic_icr_write, 191 .icr_write = noop_apic_icr_write,
192 .wait_icr_idle = noop_apic_wait_icr_idle, 192 .wait_icr_idle = noop_apic_wait_icr_idle,
193 .safe_wait_icr_idle = noop_safe_apic_wait_icr_idle, 193 .safe_wait_icr_idle = noop_safe_apic_wait_icr_idle,
194
195#ifdef CONFIG_X86_32
196 .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid,
197#endif
194}; 198};
diff --git a/arch/x86/kernel/apic/bigsmp_32.c b/arch/x86/kernel/apic/bigsmp_32.c
index 4c62592d6869..dd32a9b78a87 100644
--- a/arch/x86/kernel/apic/bigsmp_32.c
+++ b/arch/x86/kernel/apic/bigsmp_32.c
@@ -251,4 +251,6 @@ struct apic apic_bigsmp = {
251 .icr_write = native_apic_icr_write, 251 .icr_write = native_apic_icr_write,
252 .wait_icr_idle = native_apic_wait_icr_idle, 252 .wait_icr_idle = native_apic_wait_icr_idle,
253 .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, 253 .safe_wait_icr_idle = native_safe_apic_wait_icr_idle,
254
255 .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid,
254}; 256};
diff --git a/arch/x86/kernel/apic/es7000_32.c b/arch/x86/kernel/apic/es7000_32.c
index 6840681a3f14..0ffc1eca5777 100644
--- a/arch/x86/kernel/apic/es7000_32.c
+++ b/arch/x86/kernel/apic/es7000_32.c
@@ -682,6 +682,8 @@ struct apic __refdata apic_es7000_cluster = {
682 .icr_write = native_apic_icr_write, 682 .icr_write = native_apic_icr_write,
683 .wait_icr_idle = native_apic_wait_icr_idle, 683 .wait_icr_idle = native_apic_wait_icr_idle,
684 .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, 684 .safe_wait_icr_idle = native_safe_apic_wait_icr_idle,
685
686 .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid,
685}; 687};
686 688
687struct apic __refdata apic_es7000 = { 689struct apic __refdata apic_es7000 = {
@@ -744,4 +746,6 @@ struct apic __refdata apic_es7000 = {
744 .icr_write = native_apic_icr_write, 746 .icr_write = native_apic_icr_write,
745 .wait_icr_idle = native_apic_wait_icr_idle, 747 .wait_icr_idle = native_apic_wait_icr_idle,
746 .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, 748 .safe_wait_icr_idle = native_safe_apic_wait_icr_idle,
749
750 .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid,
747}; 751};
diff --git a/arch/x86/kernel/apic/numaq_32.c b/arch/x86/kernel/apic/numaq_32.c
index 2b434d579e15..f1a8b120c49d 100644
--- a/arch/x86/kernel/apic/numaq_32.c
+++ b/arch/x86/kernel/apic/numaq_32.c
@@ -539,4 +539,6 @@ struct apic __refdata apic_numaq = {
539 .icr_write = native_apic_icr_write, 539 .icr_write = native_apic_icr_write,
540 .wait_icr_idle = native_apic_wait_icr_idle, 540 .wait_icr_idle = native_apic_wait_icr_idle,
541 .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, 541 .safe_wait_icr_idle = native_safe_apic_wait_icr_idle,
542
543 .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid,
542}; 544};
diff --git a/arch/x86/kernel/apic/probe_32.c b/arch/x86/kernel/apic/probe_32.c
index 24a68281101b..40be7c3cdfeb 100644
--- a/arch/x86/kernel/apic/probe_32.c
+++ b/arch/x86/kernel/apic/probe_32.c
@@ -166,6 +166,8 @@ struct apic apic_default = {
166 .icr_write = native_apic_icr_write, 166 .icr_write = native_apic_icr_write,
167 .wait_icr_idle = native_apic_wait_icr_idle, 167 .wait_icr_idle = native_apic_wait_icr_idle,
168 .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, 168 .safe_wait_icr_idle = native_safe_apic_wait_icr_idle,
169
170 .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid,
169}; 171};
170 172
171extern struct apic apic_numaq; 173extern struct apic apic_numaq;
diff --git a/arch/x86/kernel/apic/summit_32.c b/arch/x86/kernel/apic/summit_32.c
index 1ef4c14f4d6b..172c498e888f 100644
--- a/arch/x86/kernel/apic/summit_32.c
+++ b/arch/x86/kernel/apic/summit_32.c
@@ -552,4 +552,6 @@ struct apic apic_summit = {
552 .icr_write = native_apic_icr_write, 552 .icr_write = native_apic_icr_write,
553 .wait_icr_idle = native_apic_wait_icr_idle, 553 .wait_icr_idle = native_apic_wait_icr_idle,
554 .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, 554 .safe_wait_icr_idle = native_safe_apic_wait_icr_idle,
555
556 .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid,
555}; 557};