diff options
Diffstat (limited to 'arch/x86/kernel/cpu/intel_cacheinfo.c')
| -rw-r--r-- | arch/x86/kernel/cpu/intel_cacheinfo.c | 44 | 
1 files changed, 36 insertions, 8 deletions
diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c index 6b45e5e7a90..73d08ed98a6 100644 --- a/arch/x86/kernel/cpu/intel_cacheinfo.c +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c @@ -326,8 +326,7 @@ static void __cpuinit amd_calc_l3_indices(struct amd_northbridge *nb)  	l3->indices = (max(max3(sc0, sc1, sc2), sc3) << 10) - 1;  } -static void __cpuinit amd_init_l3_cache(struct _cpuid4_info_regs *this_leaf, -					int index) +static void __cpuinit amd_init_l3_cache(struct _cpuid4_info_regs *this_leaf, int index)  {  	int node; @@ -725,14 +724,16 @@ static DEFINE_PER_CPU(struct _cpuid4_info *, ici_cpuid4_info);  #define CPUID4_INFO_IDX(x, y)	(&((per_cpu(ici_cpuid4_info, x))[y]))  #ifdef CONFIG_SMP -static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index) + +static int __cpuinit cache_shared_amd_cpu_map_setup(unsigned int cpu, int index)  { -	struct _cpuid4_info	*this_leaf, *sibling_leaf; -	unsigned long num_threads_sharing; -	int index_msb, i, sibling; +	struct _cpuid4_info *this_leaf; +	int ret, i, sibling;  	struct cpuinfo_x86 *c = &cpu_data(cpu); -	if ((index == 3) && (c->x86_vendor == X86_VENDOR_AMD)) { +	ret = 0; +	if (index == 3) { +		ret = 1;  		for_each_cpu(i, cpu_llc_shared_mask(cpu)) {  			if (!per_cpu(ici_cpuid4_info, i))  				continue; @@ -743,8 +744,35 @@ static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index)  				set_bit(sibling, this_leaf->shared_cpu_map);  			}  		} -		return; +	} else if ((c->x86 == 0x15) && ((index == 1) || (index == 2))) { +		ret = 1; +		for_each_cpu(i, cpu_sibling_mask(cpu)) { +			if (!per_cpu(ici_cpuid4_info, i)) +				continue; +			this_leaf = CPUID4_INFO_IDX(i, index); +			for_each_cpu(sibling, cpu_sibling_mask(cpu)) { +				if (!cpu_online(sibling)) +					continue; +				set_bit(sibling, this_leaf->shared_cpu_map); +			} +		}  	} + +	return ret; +} + +static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index) +{ +	struct _cpuid4_info *this_leaf, *sibling_leaf; +	unsigned long num_threads_sharing; +	int index_msb, i; +	struct cpuinfo_x86 *c = &cpu_data(cpu); + +	if (c->x86_vendor == X86_VENDOR_AMD) { +		if (cache_shared_amd_cpu_map_setup(cpu, index)) +			return; +	} +  	this_leaf = CPUID4_INFO_IDX(cpu, index);  	num_threads_sharing = 1 + this_leaf->base.eax.split.num_threads_sharing;  |