lkml.org 
[lkml]   [2009]   [May]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH] x86: read apic id if it is not acpi_lapic

    Ed found that on 32bit, boot_cpu_physical_apicid is not read right,
    when mptable is broken.

    interesting, actually three path
    1. acpi: at that time, at that time that is already read from reg.
    2. mptable: that only read from mptable.
    3. no madt, and no mptable, that use default apic id 0 for 64bit, -1 for 32bit

    so could read that apic id for 2/3 path.

    also could avoid set fixmap that lapic two times when acpi_lapic is used.
    and need to move cpu_has_apic earlier and call apic_disable()

    Reported-by: Ed Swierk <eswierk@aristanetworks.com>
    Signed-off-by: Yinghai Lu <yinghai@kernel.org>
    Cc: Cyrill Gorcunov <gorcunov@openvz.org>

    ---
    arch/x86/kernel/apic/apic.c | 29 +++++++++++++++++++++--------
    1 file changed, 21 insertions(+), 8 deletions(-)
    Index: linux-2.6/arch/x86/kernel/apic/apic.c
    ===================================================================
    --- linux-2.6.orig/arch/x86/kernel/apic/apic.c
    +++ linux-2.6/arch/x86/kernel/apic/apic.c
    @@ -1574,6 +1574,8 @@ void __init early_init_lapic_mapping(voi
    */
    void __init init_apic_mappings(void)
    {
    + unsigned int new_apicid;
    +
    if (x2apic_mode) {
    boot_cpu_physical_apicid = read_apic_id();
    return;
    @@ -1590,21 +1592,32 @@ void __init init_apic_mappings(void)
    } else
    apic_phys = mp_lapic_addr;

    - set_fixmap_nocache(FIX_APIC_BASE, apic_phys);
    + /* lets check if we may to NOP'ify apic operations */
    + if (!cpu_has_apic) {
    + pr_info("APIC: disable apic facility\n");
    + apic_disable();
    + return;
    + }
    +
    + /*
    + * acpi lapic path already map that address in
    + * acpi_register_lapic_address()
    + */
    apic_printk(APIC_VERBOSE, "mapped APIC to %08lx (%08lx)\n",
    APIC_BASE, apic_phys);
    + if (acpi_lapic)
    + return;

    + set_fixmap_nocache(FIX_APIC_BASE, apic_phys);
    /*
    * Fetch the APIC ID of the BSP in case we have a
    * default configuration (or the MP table is broken).
    */
    - if (boot_cpu_physical_apicid == -1U)
    - boot_cpu_physical_apicid = read_apic_id();
    -
    - /* lets check if we may to NOP'ify apic operations */
    - if (!cpu_has_apic) {
    - pr_info("APIC: disable apic facility\n");
    - apic_disable();
    + new_apicid = read_apic_id();
    + if (boot_cpu_physical_apicid != new_apicid) {
    + boot_cpu_physical_apicid = new_apicid;
    + apic_version[new_apicid] =
    + GET_APIC_VERSION(apic_read(APIC_LVR));
    }
    }


    \
     
     \ /
      Last update: 2009-05-02 06:51    [from the cache]
    ©2003-2014 Jasper Spaans. Advertise on this site