x86, smp: refactor ->wait_for_init_deassert()
- spread out the namespace on a per APIC driver basis - handle a NULL ->wait_for_init_deassert() as a 'dont wait' default method - remove NUMAQ and Summit handlers Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
abfa584c8d
commit
a965936643
arch/x86
include/asm
kernel
mach-generic
|
@ -4,7 +4,7 @@
|
||||||
#define ES7000_TRAMPOLINE_PHYS_LOW 0x467
|
#define ES7000_TRAMPOLINE_PHYS_LOW 0x467
|
||||||
#define ES7000_TRAMPOLINE_PHYS_HIGH 0x469
|
#define ES7000_TRAMPOLINE_PHYS_HIGH 0x469
|
||||||
|
|
||||||
static inline void wait_for_init_deassert(atomic_t *deassert)
|
static inline void es7000_wait_for_init_deassert(atomic_t *deassert)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_ES7000_CLUSTERED_APIC
|
#ifndef CONFIG_ES7000_CLUSTERED_APIC
|
||||||
while (!atomic_read(deassert))
|
while (!atomic_read(deassert))
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef _ASM_X86_MACH_DEFAULT_MACH_WAKECPU_H
|
#ifndef _ASM_X86_MACH_DEFAULT_MACH_WAKECPU_H
|
||||||
#define _ASM_X86_MACH_DEFAULT_MACH_WAKECPU_H
|
#define _ASM_X86_MACH_DEFAULT_MACH_WAKECPU_H
|
||||||
|
|
||||||
static inline void wait_for_init_deassert(atomic_t *deassert)
|
static inline void default_wait_for_init_deassert(atomic_t *deassert)
|
||||||
{
|
{
|
||||||
while (!atomic_read(deassert))
|
while (!atomic_read(deassert))
|
||||||
cpu_relax();
|
cpu_relax();
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#ifndef _ASM_X86_MACH_GENERIC_MACH_WAKECPU_H
|
#ifndef _ASM_X86_MACH_GENERIC_MACH_WAKECPU_H
|
||||||
#define _ASM_X86_MACH_GENERIC_MACH_WAKECPU_H
|
#define _ASM_X86_MACH_GENERIC_MACH_WAKECPU_H
|
||||||
|
|
||||||
#define wait_for_init_deassert (apic->wait_for_init_deassert)
|
|
||||||
#define smp_callin_clear_local_apic (apic->smp_callin_clear_local_apic)
|
#define smp_callin_clear_local_apic (apic->smp_callin_clear_local_apic)
|
||||||
#define store_NMI_vector (apic->store_NMI_vector)
|
#define store_NMI_vector (apic->store_NMI_vector)
|
||||||
#define restore_NMI_vector (apic->restore_NMI_vector)
|
#define restore_NMI_vector (apic->restore_NMI_vector)
|
||||||
|
|
|
@ -6,11 +6,6 @@
|
||||||
#define NUMAQ_TRAMPOLINE_PHYS_LOW (0x8)
|
#define NUMAQ_TRAMPOLINE_PHYS_LOW (0x8)
|
||||||
#define NUMAQ_TRAMPOLINE_PHYS_HIGH (0xa)
|
#define NUMAQ_TRAMPOLINE_PHYS_HIGH (0xa)
|
||||||
|
|
||||||
/* We don't do anything here because we use NMI's to boot instead */
|
|
||||||
static inline void wait_for_init_deassert(atomic_t *deassert)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Because we use NMIs rather than the INIT-STARTUP sequence to
|
* Because we use NMIs rather than the INIT-STARTUP sequence to
|
||||||
* bootstrap the CPUs, the APIC may be in a weird state. Kick it.
|
* bootstrap the CPUs, the APIC may be in a weird state. Kick it.
|
||||||
|
|
|
@ -182,10 +182,6 @@ static int wakeup_secondary_cpu_via_mip(int cpu, unsigned long eip)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void noop_wait_for_deassert(atomic_t *deassert_not_used)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __init es7000_update_genapic(void)
|
static int __init es7000_update_genapic(void)
|
||||||
{
|
{
|
||||||
apic->wakeup_cpu = wakeup_secondary_cpu_via_mip;
|
apic->wakeup_cpu = wakeup_secondary_cpu_via_mip;
|
||||||
|
@ -194,7 +190,7 @@ static int __init es7000_update_genapic(void)
|
||||||
if (boot_cpu_data.x86 == 6 &&
|
if (boot_cpu_data.x86 == 6 &&
|
||||||
(boot_cpu_data.x86_model >= 7 || boot_cpu_data.x86_model <= 11)) {
|
(boot_cpu_data.x86_model >= 7 || boot_cpu_data.x86_model <= 11)) {
|
||||||
es7000_update_genapic_to_cluster();
|
es7000_update_genapic_to_cluster();
|
||||||
apic->wait_for_init_deassert = noop_wait_for_deassert;
|
apic->wait_for_init_deassert = NULL;
|
||||||
apic->wakeup_cpu = wakeup_secondary_cpu_via_mip;
|
apic->wakeup_cpu = wakeup_secondary_cpu_via_mip;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -196,7 +196,8 @@ static void __cpuinit smp_callin(void)
|
||||||
* our local APIC. We have to wait for the IPI or we'll
|
* our local APIC. We have to wait for the IPI or we'll
|
||||||
* lock up on an APIC access.
|
* lock up on an APIC access.
|
||||||
*/
|
*/
|
||||||
wait_for_init_deassert(&init_deasserted);
|
if (apic->wait_for_init_deassert)
|
||||||
|
apic->wait_for_init_deassert(&init_deasserted);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (This works even if the APIC is not enabled.)
|
* (This works even if the APIC is not enabled.)
|
||||||
|
|
|
@ -106,7 +106,9 @@ struct genapic apic_bigsmp = {
|
||||||
.wakeup_cpu = NULL,
|
.wakeup_cpu = NULL,
|
||||||
.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 = wait_for_init_deassert,
|
|
||||||
|
.wait_for_init_deassert = default_wait_for_init_deassert,
|
||||||
|
|
||||||
.smp_callin_clear_local_apic = smp_callin_clear_local_apic,
|
.smp_callin_clear_local_apic = smp_callin_clear_local_apic,
|
||||||
.store_NMI_vector = store_NMI_vector,
|
.store_NMI_vector = store_NMI_vector,
|
||||||
.restore_NMI_vector = restore_NMI_vector,
|
.restore_NMI_vector = restore_NMI_vector,
|
||||||
|
|
|
@ -87,7 +87,9 @@ struct genapic apic_default = {
|
||||||
.wakeup_cpu = NULL,
|
.wakeup_cpu = NULL,
|
||||||
.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 = wait_for_init_deassert,
|
|
||||||
|
.wait_for_init_deassert = default_wait_for_init_deassert,
|
||||||
|
|
||||||
.smp_callin_clear_local_apic = smp_callin_clear_local_apic,
|
.smp_callin_clear_local_apic = smp_callin_clear_local_apic,
|
||||||
.store_NMI_vector = store_NMI_vector,
|
.store_NMI_vector = store_NMI_vector,
|
||||||
.restore_NMI_vector = restore_NMI_vector,
|
.restore_NMI_vector = restore_NMI_vector,
|
||||||
|
|
|
@ -142,7 +142,9 @@ struct genapic apic_es7000 = {
|
||||||
.wakeup_cpu = NULL,
|
.wakeup_cpu = NULL,
|
||||||
.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 = wait_for_init_deassert,
|
|
||||||
|
.wait_for_init_deassert = default_wait_for_init_deassert,
|
||||||
|
|
||||||
.smp_callin_clear_local_apic = smp_callin_clear_local_apic,
|
.smp_callin_clear_local_apic = smp_callin_clear_local_apic,
|
||||||
.store_NMI_vector = store_NMI_vector,
|
.store_NMI_vector = store_NMI_vector,
|
||||||
.restore_NMI_vector = restore_NMI_vector,
|
.restore_NMI_vector = restore_NMI_vector,
|
||||||
|
|
|
@ -106,7 +106,10 @@ struct genapic apic_numaq = {
|
||||||
.wakeup_cpu = NULL,
|
.wakeup_cpu = NULL,
|
||||||
.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,
|
||||||
.wait_for_init_deassert = wait_for_init_deassert,
|
|
||||||
|
/* We don't do anything here because we use NMI's to boot instead */
|
||||||
|
.wait_for_init_deassert = NULL,
|
||||||
|
|
||||||
.smp_callin_clear_local_apic = smp_callin_clear_local_apic,
|
.smp_callin_clear_local_apic = smp_callin_clear_local_apic,
|
||||||
.store_NMI_vector = store_NMI_vector,
|
.store_NMI_vector = store_NMI_vector,
|
||||||
.restore_NMI_vector = restore_NMI_vector,
|
.restore_NMI_vector = restore_NMI_vector,
|
||||||
|
|
|
@ -86,7 +86,9 @@ struct genapic apic_summit = {
|
||||||
.wakeup_cpu = NULL,
|
.wakeup_cpu = NULL,
|
||||||
.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 = wait_for_init_deassert,
|
|
||||||
|
.wait_for_init_deassert = default_wait_for_init_deassert,
|
||||||
|
|
||||||
.smp_callin_clear_local_apic = smp_callin_clear_local_apic,
|
.smp_callin_clear_local_apic = smp_callin_clear_local_apic,
|
||||||
.store_NMI_vector = store_NMI_vector,
|
.store_NMI_vector = store_NMI_vector,
|
||||||
.restore_NMI_vector = restore_NMI_vector,
|
.restore_NMI_vector = restore_NMI_vector,
|
||||||
|
|
Loading…
Reference in New Issue