diff options
Diffstat (limited to 'arch/x86/kernel/cpu')
| -rw-r--r-- | arch/x86/kernel/cpu/amd.c | 6 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/common.c | 32 | 
2 files changed, 31 insertions, 7 deletions
| diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index b81fe2d63e15..1e81a37c034e 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -347,7 +347,6 @@ static void amd_detect_cmp(struct cpuinfo_x86 *c)  #ifdef CONFIG_SMP  	unsigned bits;  	int cpu = smp_processor_id(); -	unsigned int socket_id, core_complex_id;  	bits = c->x86_coreid_bits;  	/* Low order bits define the core id (index of core in socket) */ @@ -365,10 +364,7 @@ static void amd_detect_cmp(struct cpuinfo_x86 *c)  	 if (c->x86 != 0x17 || !cpuid_edx(0x80000006))  		return; -	socket_id	= (c->apicid >> bits) - 1; -	core_complex_id	= (c->apicid & ((1 << bits) - 1)) >> 3; - -	per_cpu(cpu_llc_id, cpu) = (socket_id << 3) | core_complex_id; +	per_cpu(cpu_llc_id, cpu) = c->apicid >> 3;  #endif  } diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 9bd910a7dd0a..cc9e980c68ec 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -979,6 +979,35 @@ static void x86_init_cache_qos(struct cpuinfo_x86 *c)  }  /* + * The physical to logical package id mapping is initialized from the + * acpi/mptables information. Make sure that CPUID actually agrees with + * that. + */ +static void sanitize_package_id(struct cpuinfo_x86 *c) +{ +#ifdef CONFIG_SMP +	unsigned int pkg, apicid, cpu = smp_processor_id(); + +	apicid = apic->cpu_present_to_apicid(cpu); +	pkg = apicid >> boot_cpu_data.x86_coreid_bits; + +	if (apicid != c->initial_apicid) { +		pr_err(FW_BUG "CPU%u: APIC id mismatch. Firmware: %x CPUID: %x\n", +		       cpu, apicid, c->initial_apicid); +		c->initial_apicid = apicid; +	} +	if (pkg != c->phys_proc_id) { +		pr_err(FW_BUG "CPU%u: Using firmware package id %u instead of %u\n", +		       cpu, pkg, c->phys_proc_id); +		c->phys_proc_id = pkg; +	} +	c->logical_proc_id = topology_phys_to_logical_pkg(pkg); +#else +	c->logical_proc_id = 0; +#endif +} + +/*   * This does the hard work of actually picking apart the CPU stuff...   */  static void identify_cpu(struct cpuinfo_x86 *c) @@ -1103,8 +1132,7 @@ static void identify_cpu(struct cpuinfo_x86 *c)  #ifdef CONFIG_NUMA  	numa_add_cpu(smp_processor_id());  #endif -	/* The boot/hotplug time assigment got cleared, restore it */ -	c->logical_proc_id = topology_phys_to_logical_pkg(c->phys_proc_id); +	sanitize_package_id(c);  }  /* |