diff options
Diffstat (limited to 'arch/x86/kernel/cpu/amd.c')
| -rw-r--r-- | arch/x86/kernel/cpu/amd.c | 12 | 
1 files changed, 11 insertions, 1 deletions
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 7e4a459daa6..e5b27d8f1b4 100644 --- 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> @@ -272,7 +273,7 @@ static void __cpuinit srat_detect_node(struct cpuinfo_x86 *c)  #if defined(CONFIG_NUMA) && defined(CONFIG_X86_64)  	int cpu = smp_processor_id();  	int node; -	unsigned apicid = hard_smp_processor_id(); +	unsigned apicid = cpu_has_apic ? hard_smp_processor_id() : c->apicid;  	node = c->phys_proc_id;  	if (apicid_to_node[apicid] != NUMA_NO_NODE) @@ -351,6 +352,15 @@ static void __cpuinit early_init_amd(struct cpuinfo_x86 *c)  		    (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)  |