Messages in this thread Patch in this message | | | Date | Fri, 01 May 2009 21:48:34 -0700 | From | Yinghai Lu <> | 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)); } }
| |