Commit 4f45ed9f authored by Dou Liyang's avatar Dou Liyang Committed by Thomas Gleixner

x86/apic: Mark the apic_intr_mode extern for sanity check cleanup

Calling native_smp_prepare_cpus() to prepare for SMP bootup, does some
sanity checking, enables APIC mode and disables SMP feature.

Now, APIC mode setup has been unified to apic_intr_mode_init(), some sanity
checks are redundant and need to be cleanup.

Mark the apic_intr_mode extern to refine the switch and remove the
redundant sanity check.
Signed-off-by: default avatarDou Liyang <douly.fnst@cn.fujitsu.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: yinghai@kernel.org
Cc: bhe@redhat.com
Link: https://lkml.kernel.org/r/1505293975-26005-7-git-send-email-douly.fnst@cn.fujitsu.com
parent 3e730dad
...@@ -53,6 +53,15 @@ extern int local_apic_timer_c2_ok; ...@@ -53,6 +53,15 @@ extern int local_apic_timer_c2_ok;
extern int disable_apic; extern int disable_apic;
extern unsigned int lapic_timer_frequency; extern unsigned int lapic_timer_frequency;
extern enum apic_intr_mode_id apic_intr_mode;
enum apic_intr_mode_id {
APIC_PIC,
APIC_VIRTUAL_WIRE,
APIC_VIRTUAL_WIRE_NO_CONFIG,
APIC_SYMMETRIC_IO,
APIC_SYMMETRIC_IO_NO_ROUTING
};
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
extern void __inquire_remote_apic(int apicid); extern void __inquire_remote_apic(int apicid);
#else /* CONFIG_SMP */ #else /* CONFIG_SMP */
......
...@@ -1218,13 +1218,7 @@ void __init sync_Arb_IDs(void) ...@@ -1218,13 +1218,7 @@ void __init sync_Arb_IDs(void)
APIC_INT_LEVELTRIG | APIC_DM_INIT); APIC_INT_LEVELTRIG | APIC_DM_INIT);
} }
enum apic_intr_mode { enum apic_intr_mode_id apic_intr_mode;
APIC_PIC,
APIC_VIRTUAL_WIRE,
APIC_VIRTUAL_WIRE_NO_CONFIG,
APIC_SYMMETRIC_IO,
APIC_SYMMETRIC_IO_NO_ROUTING,
};
static int __init apic_intr_mode_select(void) static int __init apic_intr_mode_select(void)
{ {
...@@ -1342,7 +1336,9 @@ void __init apic_intr_mode_init(void) ...@@ -1342,7 +1336,9 @@ void __init apic_intr_mode_init(void)
{ {
bool upmode = false; bool upmode = false;
switch (apic_intr_mode_select()) { apic_intr_mode = apic_intr_mode_select();
switch (apic_intr_mode) {
case APIC_PIC: case APIC_PIC:
pr_info("APIC: Keep in PIC mode(8259)\n"); pr_info("APIC: Keep in PIC mode(8259)\n");
return; return;
...@@ -1974,8 +1970,8 @@ void __init init_apic_mappings(void) ...@@ -1974,8 +1970,8 @@ void __init init_apic_mappings(void)
* yeah -- we lie about apic_version * yeah -- we lie about apic_version
* in case if apic was disabled via boot option * in case if apic was disabled via boot option
* but it's not a problem for SMP compiled kernel * but it's not a problem for SMP compiled kernel
* since smp_sanity_check is prepared for such a case * since apic_intr_mode_select is prepared for such
* and disable smp mode * a case and disable smp mode
*/ */
boot_cpu_apic_version = GET_APIC_VERSION(apic_read(APIC_LVR)); boot_cpu_apic_version = GET_APIC_VERSION(apic_read(APIC_LVR));
} }
......
...@@ -1190,17 +1190,10 @@ static __init void disable_smp(void) ...@@ -1190,17 +1190,10 @@ static __init void disable_smp(void)
cpumask_set_cpu(0, topology_core_cpumask(0)); cpumask_set_cpu(0, topology_core_cpumask(0));
} }
enum {
SMP_OK,
SMP_NO_CONFIG,
SMP_NO_APIC,
SMP_FORCE_UP,
};
/* /*
* Various sanity checks. * Various sanity checks.
*/ */
static int __init smp_sanity_check(unsigned max_cpus) static void __init smp_sanity_check(void)
{ {
preempt_disable(); preempt_disable();
...@@ -1237,16 +1230,6 @@ static int __init smp_sanity_check(unsigned max_cpus) ...@@ -1237,16 +1230,6 @@ static int __init smp_sanity_check(unsigned max_cpus)
physid_set(hard_smp_processor_id(), phys_cpu_present_map); physid_set(hard_smp_processor_id(), phys_cpu_present_map);
} }
/*
* If we couldn't find an SMP configuration at boot time,
* get out of here now!
*/
if (!smp_found_config && !acpi_lapic) {
preempt_enable();
pr_notice("SMP motherboard not detected\n");
return SMP_NO_CONFIG;
}
/* /*
* Should not be necessary because the MP table should list the boot * Should not be necessary because the MP table should list the boot
* CPU too, but we do it for the sake of robustness anyway. * CPU too, but we do it for the sake of robustness anyway.
...@@ -1257,29 +1240,6 @@ static int __init smp_sanity_check(unsigned max_cpus) ...@@ -1257,29 +1240,6 @@ static int __init smp_sanity_check(unsigned max_cpus)
physid_set(hard_smp_processor_id(), phys_cpu_present_map); physid_set(hard_smp_processor_id(), phys_cpu_present_map);
} }
preempt_enable(); preempt_enable();
/*
* If we couldn't find a local APIC, then get out of here now!
*/
if (APIC_INTEGRATED(boot_cpu_apic_version) &&
!boot_cpu_has(X86_FEATURE_APIC)) {
if (!disable_apic) {
pr_err("BIOS bug, local APIC #%d not detected!...\n",
boot_cpu_physical_apicid);
pr_err("... forcing use of dummy APIC emulation (tell your hw vendor)\n");
}
return SMP_NO_APIC;
}
/*
* If SMP should be disabled, then really disable it!
*/
if (!max_cpus) {
pr_info("SMP mode deactivated\n");
return SMP_FORCE_UP;
}
return SMP_OK;
} }
static void __init smp_cpu_index_default(void) static void __init smp_cpu_index_default(void)
...@@ -1338,19 +1298,20 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus) ...@@ -1338,19 +1298,20 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)
apic_intr_mode_init(); apic_intr_mode_init();
switch (smp_sanity_check(max_cpus)) { smp_sanity_check();
case SMP_NO_CONFIG:
disable_smp(); switch (apic_intr_mode) {
return; case APIC_PIC:
case SMP_NO_APIC: case APIC_VIRTUAL_WIRE_NO_CONFIG:
disable_smp(); disable_smp();
return; return;
case SMP_FORCE_UP: case APIC_SYMMETRIC_IO_NO_ROUTING:
disable_smp(); disable_smp();
/* Setup local timer */ /* Setup local timer */
x86_init.timers.setup_percpu_clockev(); x86_init.timers.setup_percpu_clockev();
return; return;
case SMP_OK: case APIC_VIRTUAL_WIRE:
case APIC_SYMMETRIC_IO:
break; break;
} }
......
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