Commit 1f5bcabf authored by Ingo Molnar's avatar Ingo Molnar

x86: apic: simplify secondary CPU wakeup methods

Impact: cleanup

- rename apic->wakeup_cpu  to apic->wakeup_secondary_cpu, to
  make it apparent that this is an SMP-only method

- handle NULL ->wakeup_secondary_cpus to mean the default INIT
  wakeup sequence - this allows simplification of the APIC
  driver templates.

Cc: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 0917c01f
...@@ -313,7 +313,7 @@ struct apic { ...@@ -313,7 +313,7 @@ struct apic {
void (*send_IPI_self)(int vector); void (*send_IPI_self)(int vector);
/* wakeup_secondary_cpu */ /* wakeup_secondary_cpu */
int (*wakeup_cpu)(int apicid, unsigned long start_eip); int (*wakeup_secondary_cpu)(int apicid, unsigned long start_eip);
int trampoline_phys_low; int trampoline_phys_low;
int trampoline_phys_high; int trampoline_phys_high;
...@@ -344,13 +344,6 @@ extern struct apic *apic; ...@@ -344,13 +344,6 @@ extern struct apic *apic;
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
extern atomic_t init_deasserted; extern atomic_t init_deasserted;
extern int wakeup_secondary_cpu_via_nmi(int apicid, unsigned long start_eip); extern int wakeup_secondary_cpu_via_nmi(int apicid, unsigned long start_eip);
extern int wakeup_secondary_cpu_via_init(int apicid, unsigned long start_eip);
#else
static inline int
wakeup_secondary_cpu_via_init(int apicid, unsigned long start_eip)
{
return 0;
}
#endif #endif
static inline u32 apic_read(u32 reg) static inline u32 apic_read(u32 reg)
......
...@@ -222,7 +222,6 @@ struct apic apic_flat = { ...@@ -222,7 +222,6 @@ struct apic apic_flat = {
.send_IPI_all = flat_send_IPI_all, .send_IPI_all = flat_send_IPI_all,
.send_IPI_self = apic_send_IPI_self, .send_IPI_self = apic_send_IPI_self,
.wakeup_cpu = wakeup_secondary_cpu_via_init,
.trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW, .trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW,
.trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH,
.wait_for_init_deassert = NULL, .wait_for_init_deassert = NULL,
...@@ -373,7 +372,6 @@ struct apic apic_physflat = { ...@@ -373,7 +372,6 @@ struct apic apic_physflat = {
.send_IPI_all = physflat_send_IPI_all, .send_IPI_all = physflat_send_IPI_all,
.send_IPI_self = apic_send_IPI_self, .send_IPI_self = apic_send_IPI_self,
.wakeup_cpu = wakeup_secondary_cpu_via_init,
.trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW, .trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW,
.trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH,
.wait_for_init_deassert = NULL, .wait_for_init_deassert = NULL,
......
...@@ -256,7 +256,6 @@ struct apic apic_bigsmp = { ...@@ -256,7 +256,6 @@ struct apic apic_bigsmp = {
.send_IPI_all = bigsmp_send_IPI_all, .send_IPI_all = bigsmp_send_IPI_all,
.send_IPI_self = default_send_IPI_self, .send_IPI_self = default_send_IPI_self,
.wakeup_cpu = wakeup_secondary_cpu_via_init,
.trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW, .trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW,
.trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH,
......
...@@ -741,7 +741,7 @@ struct apic apic_es7000_cluster = { ...@@ -741,7 +741,7 @@ struct apic apic_es7000_cluster = {
.send_IPI_all = es7000_send_IPI_all, .send_IPI_all = es7000_send_IPI_all,
.send_IPI_self = default_send_IPI_self, .send_IPI_self = default_send_IPI_self,
.wakeup_cpu = wakeup_secondary_cpu_via_mip, .wakeup_secondary_cpu = wakeup_secondary_cpu_via_mip,
.trampoline_phys_low = 0x467, .trampoline_phys_low = 0x467,
.trampoline_phys_high = 0x469, .trampoline_phys_high = 0x469,
...@@ -806,8 +806,6 @@ struct apic apic_es7000 = { ...@@ -806,8 +806,6 @@ struct apic apic_es7000 = {
.send_IPI_all = es7000_send_IPI_all, .send_IPI_all = es7000_send_IPI_all,
.send_IPI_self = default_send_IPI_self, .send_IPI_self = default_send_IPI_self,
.wakeup_cpu = wakeup_secondary_cpu_via_init,
.trampoline_phys_low = 0x467, .trampoline_phys_low = 0x467,
.trampoline_phys_high = 0x469, .trampoline_phys_high = 0x469,
......
...@@ -538,7 +538,7 @@ struct apic apic_numaq = { ...@@ -538,7 +538,7 @@ struct apic apic_numaq = {
.send_IPI_all = numaq_send_IPI_all, .send_IPI_all = numaq_send_IPI_all,
.send_IPI_self = default_send_IPI_self, .send_IPI_self = default_send_IPI_self,
.wakeup_cpu = wakeup_secondary_cpu_via_nmi, .wakeup_secondary_cpu = wakeup_secondary_cpu_via_nmi,
.trampoline_phys_low = NUMAQ_TRAMPOLINE_PHYS_LOW, .trampoline_phys_low = NUMAQ_TRAMPOLINE_PHYS_LOW,
.trampoline_phys_high = NUMAQ_TRAMPOLINE_PHYS_HIGH, .trampoline_phys_high = NUMAQ_TRAMPOLINE_PHYS_HIGH,
......
...@@ -138,7 +138,6 @@ struct apic apic_default = { ...@@ -138,7 +138,6 @@ struct apic apic_default = {
.send_IPI_all = default_send_IPI_all, .send_IPI_all = default_send_IPI_all,
.send_IPI_self = default_send_IPI_self, .send_IPI_self = default_send_IPI_self,
.wakeup_cpu = wakeup_secondary_cpu_via_init,
.trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW, .trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW,
.trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH,
......
...@@ -574,7 +574,6 @@ struct apic apic_summit = { ...@@ -574,7 +574,6 @@ struct apic apic_summit = {
.send_IPI_all = summit_send_IPI_all, .send_IPI_all = summit_send_IPI_all,
.send_IPI_self = default_send_IPI_self, .send_IPI_self = default_send_IPI_self,
.wakeup_cpu = wakeup_secondary_cpu_via_init,
.trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW, .trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW,
.trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH,
......
...@@ -224,7 +224,6 @@ struct apic apic_x2apic_cluster = { ...@@ -224,7 +224,6 @@ struct apic apic_x2apic_cluster = {
.send_IPI_all = x2apic_send_IPI_all, .send_IPI_all = x2apic_send_IPI_all,
.send_IPI_self = x2apic_send_IPI_self, .send_IPI_self = x2apic_send_IPI_self,
.wakeup_cpu = wakeup_secondary_cpu_via_init,
.trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW, .trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW,
.trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH,
.wait_for_init_deassert = NULL, .wait_for_init_deassert = NULL,
......
...@@ -213,7 +213,6 @@ struct apic apic_x2apic_phys = { ...@@ -213,7 +213,6 @@ struct apic apic_x2apic_phys = {
.send_IPI_all = x2apic_send_IPI_all, .send_IPI_all = x2apic_send_IPI_all,
.send_IPI_self = x2apic_send_IPI_self, .send_IPI_self = x2apic_send_IPI_self,
.wakeup_cpu = wakeup_secondary_cpu_via_init,
.trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW, .trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW,
.trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH,
.wait_for_init_deassert = NULL, .wait_for_init_deassert = NULL,
......
...@@ -288,7 +288,7 @@ struct apic apic_x2apic_uv_x = { ...@@ -288,7 +288,7 @@ struct apic apic_x2apic_uv_x = {
.send_IPI_all = uv_send_IPI_all, .send_IPI_all = uv_send_IPI_all,
.send_IPI_self = uv_send_IPI_self, .send_IPI_self = uv_send_IPI_self,
.wakeup_cpu = uv_wakeup_secondary, .wakeup_secondary_cpu = uv_wakeup_secondary,
.trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW, .trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW,
.trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH,
.wait_for_init_deassert = NULL, .wait_for_init_deassert = NULL,
......
...@@ -742,7 +742,8 @@ static void __cpuinit do_fork_idle(struct work_struct *work) ...@@ -742,7 +742,8 @@ static void __cpuinit do_fork_idle(struct work_struct *work)
/* /*
* NOTE - on most systems this is a PHYSICAL apic ID, but on multiquad * NOTE - on most systems this is a PHYSICAL apic ID, but on multiquad
* (ie clustered apic addressing mode), this is a LOGICAL apic ID. * (ie clustered apic addressing mode), this is a LOGICAL apic ID.
* Returns zero if CPU booted OK, else error code from ->wakeup_cpu. * Returns zero if CPU booted OK, else error code from
* ->wakeup_secondary_cpu.
*/ */
static int __cpuinit do_boot_cpu(int apicid, int cpu) static int __cpuinit do_boot_cpu(int apicid, int cpu)
{ {
...@@ -829,9 +830,13 @@ do_rest: ...@@ -829,9 +830,13 @@ do_rest:
} }
/* /*
* Starting actual IPI sequence... * Kick the secondary CPU. Use the method in the APIC driver
* if it's defined - or use an INIT boot APIC message otherwise:
*/ */
boot_error = apic->wakeup_cpu(apicid, start_ip); if (apic->wakeup_secondary_cpu)
boot_error = apic->wakeup_secondary_cpu(apicid, start_ip);
else
boot_error = wakeup_secondary_cpu_via_init(apicid, start_ip);
if (!boot_error) { if (!boot_error) {
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment