lkml.org 
[lkml]   [2009]   [Jun]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 030/108] x86: Detect use of extended APIC ID for AMD CPUs
    2.6.30-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Andreas Herrmann <andreas.herrmann3@amd.com>

    commit 42937e81a82b6bbc51a309c83da140b3a7ca5945 upstream.

    Booting a 32-bit kernel on Magny-Cours results in the following panic:

    ...
    Using APIC driver default
    ...
    Overriding APIC driver with bigsmp
    ...
    Getting VERSION: 80050010
    Getting VERSION: 80050010
    Getting ID: 10000000
    Getting ID: ef000000
    Getting LVT0: 700
    Getting LVT1: 10000
    Kernel panic - not syncing: Boot APIC ID in local APIC unexpected (16 vs 0)
    Pid: 1, comm: swapper Not tainted 2.6.30-rcX #2
    Call Trace:
    [<c05194da>] ? panic+0x38/0xd3
    [<c0743102>] ? native_smp_prepare_cpus+0x259/0x31f
    [<c073b19d>] ? kernel_init+0x3e/0x141
    [<c073b15f>] ? kernel_init+0x0/0x141
    [<c020325f>] ? kernel_thread_helper+0x7/0x10

    The reason is that default_get_apic_id handled extension of local APIC
    ID field just in case of XAPIC.

    Thus for this AMD CPU, default_get_apic_id() returns 0 and
    bigsmp_get_apic_id() returns 16 which leads to the respective kernel
    panic.

    This patch introduces a Linux specific feature flag to indicate
    support for extended APIC id (8 bits instead of 4 bits width) and sets
    the flag on AMD CPUs if applicable.

    Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com>
    LKML-Reference: <20090608135509.GA12431@alberich.amd.com>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    arch/x86/include/asm/apic.h | 2 +-
    arch/x86/include/asm/cpufeature.h | 1 +
    arch/x86/kernel/cpu/amd.c | 10 ++++++++++
    3 files changed, 12 insertions(+), 1 deletion(-)

    --- a/arch/x86/include/asm/apic.h
    +++ b/arch/x86/include/asm/apic.h
    @@ -410,7 +410,7 @@ static inline unsigned default_get_apic_
    {
    unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR));

    - if (APIC_XAPIC(ver))
    + if (APIC_XAPIC(ver) || boot_cpu_has(X86_FEATURE_EXTD_APICID))
    return (x >> 24) & 0xFF;
    else
    return (x >> 24) & 0x0F;
    --- a/arch/x86/include/asm/cpufeature.h
    +++ b/arch/x86/include/asm/cpufeature.h
    @@ -94,6 +94,7 @@
    #define X86_FEATURE_TSC_RELIABLE (3*32+23) /* TSC is known to be reliable */
    #define X86_FEATURE_NONSTOP_TSC (3*32+24) /* TSC does not stop in C states */
    #define X86_FEATURE_CLFLUSH_MONITOR (3*32+25) /* "" clflush reqd with monitor */
    +#define X86_FEATURE_EXTD_APICID (3*32+26) /* has extended APICID (8 bits) */

    /* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */
    #define X86_FEATURE_XMM3 (4*32+ 0) /* "pni" SSE-3 */
    --- a/arch/x86/kernel/cpu/amd.c
    +++ b/arch/x86/kernel/cpu/amd.c
    @@ -6,6 +6,7 @@
    #include <asm/processor.h>
    #include <asm/apic.h>
    #include <asm/cpu.h>
    +#include <asm/pci-direct.h>

    #ifdef CONFIG_X86_64
    # include <asm/numa_64.h>
    @@ -351,6 +352,15 @@ static void __cpuinit early_init_amd(str
    (c->x86_model == 8 && c->x86_mask >= 8))
    set_cpu_cap(c, X86_FEATURE_K6_MTRR);
    #endif
    +#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_PCI)
    + /* check CPU config space for extended APIC ID */
    + if (c->x86 >= 0xf) {
    + unsigned int val;
    + val = read_pci_config(0, 24, 0, 0x68);
    + if ((val & ((1 << 17) | (1 << 18))) == ((1 << 17) | (1 << 18)))
    + set_cpu_cap(c, X86_FEATURE_EXTD_APICID);
    + }
    +#endif
    }

    static void __cpuinit init_amd(struct cpuinfo_x86 *c)



    \
     
     \ /
      Last update: 2009-07-01 03:09    [W:2.159 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site