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: Dou Liyang <douly.fnst@cn.fujitsu.com> Signed-off-by: Thomas 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
This commit is contained in:
parent
3e730dad3b
commit
4f45ed9f84
@ -53,6 +53,15 @@ extern int local_apic_timer_c2_ok;
|
||||
extern int disable_apic;
|
||||
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
|
||||
extern void __inquire_remote_apic(int apicid);
|
||||
#else /* CONFIG_SMP */
|
||||
|
@ -1218,13 +1218,7 @@ void __init sync_Arb_IDs(void)
|
||||
APIC_INT_LEVELTRIG | APIC_DM_INIT);
|
||||
}
|
||||
|
||||
enum apic_intr_mode {
|
||||
APIC_PIC,
|
||||
APIC_VIRTUAL_WIRE,
|
||||
APIC_VIRTUAL_WIRE_NO_CONFIG,
|
||||
APIC_SYMMETRIC_IO,
|
||||
APIC_SYMMETRIC_IO_NO_ROUTING,
|
||||
};
|
||||
enum apic_intr_mode_id apic_intr_mode;
|
||||
|
||||
static int __init apic_intr_mode_select(void)
|
||||
{
|
||||
@ -1342,7 +1336,9 @@ void __init apic_intr_mode_init(void)
|
||||
{
|
||||
bool upmode = false;
|
||||
|
||||
switch (apic_intr_mode_select()) {
|
||||
apic_intr_mode = apic_intr_mode_select();
|
||||
|
||||
switch (apic_intr_mode) {
|
||||
case APIC_PIC:
|
||||
pr_info("APIC: Keep in PIC mode(8259)\n");
|
||||
return;
|
||||
@ -1974,8 +1970,8 @@ void __init init_apic_mappings(void)
|
||||
* yeah -- we lie about apic_version
|
||||
* in case if apic was disabled via boot option
|
||||
* but it's not a problem for SMP compiled kernel
|
||||
* since smp_sanity_check is prepared for such a case
|
||||
* and disable smp mode
|
||||
* since apic_intr_mode_select is prepared for such
|
||||
* a case and disable smp mode
|
||||
*/
|
||||
boot_cpu_apic_version = GET_APIC_VERSION(apic_read(APIC_LVR));
|
||||
}
|
||||
|
@ -1190,17 +1190,10 @@ static __init void disable_smp(void)
|
||||
cpumask_set_cpu(0, topology_core_cpumask(0));
|
||||
}
|
||||
|
||||
enum {
|
||||
SMP_OK,
|
||||
SMP_NO_CONFIG,
|
||||
SMP_NO_APIC,
|
||||
SMP_FORCE_UP,
|
||||
};
|
||||
|
||||
/*
|
||||
* Various sanity checks.
|
||||
*/
|
||||
static int __init smp_sanity_check(unsigned max_cpus)
|
||||
static void __init smp_sanity_check(void)
|
||||
{
|
||||
preempt_disable();
|
||||
|
||||
@ -1237,16 +1230,6 @@ static int __init smp_sanity_check(unsigned max_cpus)
|
||||
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
|
||||
* 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)
|
||||
physid_set(hard_smp_processor_id(), phys_cpu_present_map);
|
||||
}
|
||||
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)
|
||||
@ -1338,19 +1298,20 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)
|
||||
|
||||
apic_intr_mode_init();
|
||||
|
||||
switch (smp_sanity_check(max_cpus)) {
|
||||
case SMP_NO_CONFIG:
|
||||
smp_sanity_check();
|
||||
|
||||
switch (apic_intr_mode) {
|
||||
case APIC_PIC:
|
||||
case APIC_VIRTUAL_WIRE_NO_CONFIG:
|
||||
disable_smp();
|
||||
return;
|
||||
case SMP_NO_APIC:
|
||||
disable_smp();
|
||||
return;
|
||||
case SMP_FORCE_UP:
|
||||
case APIC_SYMMETRIC_IO_NO_ROUTING:
|
||||
disable_smp();
|
||||
/* Setup local timer */
|
||||
x86_init.timers.setup_percpu_clockev();
|
||||
return;
|
||||
case SMP_OK:
|
||||
case APIC_VIRTUAL_WIRE:
|
||||
case APIC_SYMMETRIC_IO:
|
||||
break;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user