lkml.org 
[lkml]   [2017]   [Sep]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v8 01/13] x86/apic: Construct a selector for the interrupt delivery mode
    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
    >
    >
    >

    \
     
     \ /
      Last update: 2017-09-06 12:18    [W:3.366 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site