Hi Dou,

On 08/28/17 at 11:20am, Dou Liyang wrote:
> +static int __init apic_intr_mode_select(void)
> +{
> +     /* Check kernel option */
> +     if (disable_apic) {
> +             pr_info("APIC disabled via kernel command line\n");
> +             return APIC_PIC;
> +     }
> +

I am not very familiar with cpu registers, not sure if we can adjust
below code flow as:

        /* If APIC is integrated, check local APIC only */
        if (lapic_is_integrated() && !boot_cpu_has(X86_FEATURE_APIC)) {
                disable_apic = 1;
                pr_info("APIC disabled by BIOS\n");
                return APIC_PIC;
        }

        /* If APIC is on a separate chip, check if smp_found_config is found*/
        if (!lapic_is_integrated() && !smp_found_config) {
                disable_apic = 1;
                return APIC_PIC;
        }
        ~~~~ Now, I haven't think of why smp_found_config has to be
             checked here.

In this way, we don't need the CONFIG_X86_64 checking since it's
contained in lapic_is_integrated() already. And the checking is obvious
for understanding. Just not very sure if the checking is adequate.

Just my personal opinion.

> +     /* Check BIOS */
> +#ifdef CONFIG_X86_64
> +     /* On 64-bit, the APIC must be integrated, Check local APIC only */
> +     if (!boot_cpu_has(X86_FEATURE_APIC)) {
> +             disable_apic = 1;
> +             pr_info("APIC disabled by BIOS\n");
> +             return APIC_PIC;
> +     }
> +#else
> +     /*
> +      * On 32-bit, check whether there is a separate chip or integrated
> +      * APIC
> +      */
> +
> +     /* Has a separate chip ? */
> +     if (!boot_cpu_has(X86_FEATURE_APIC) && !smp_found_config) {
> +             disable_apic = 1;
> +
> +             return APIC_PIC;
> +     }
> +
> +     /* Has a local APIC ? */
> +     if (!boot_cpu_has(X86_FEATURE_APIC) &&
> +             APIC_INTEGRATED(boot_cpu_apic_version)) {
> +             disable_apic = 1;
> +             pr_err(FW_BUG "Local APIC %d not detected, force emulation\n",
> +                                    boot_cpu_physical_apicid);
> +
> +             return APIC_PIC;
> +     }
> +#endif
> +
> +     /* Check MP table or ACPI MADT configuration */
> +     if (!smp_found_config) {
> +             disable_ioapic_support();
> +
> +             if (!acpi_lapic)
> +                     pr_info("APIC: ACPI MADT or MP tables are not 
> detected\n");
> +
> +             return APIC_VIRTUAL_WIRE;
> +     }
> +
> +     return APIC_SYMMETRIC_IO;
> +}
> +
>  /*
>   * An initial setup of the virtual wire mode.
>   */
> -- 
> 2.5.5
> 
> 
> 

Reply via email to