diff options
Diffstat (limited to 'arch/x86/kernel/cpu/cacheinfo.c')
| -rw-r--r-- | arch/x86/kernel/cpu/cacheinfo.c | 31 | 
1 files changed, 29 insertions, 2 deletions
| diff --git a/arch/x86/kernel/cpu/cacheinfo.c b/arch/x86/kernel/cpu/cacheinfo.c index 0c5fcbd998cf..dc1b9342e9c4 100644 --- a/arch/x86/kernel/cpu/cacheinfo.c +++ b/arch/x86/kernel/cpu/cacheinfo.c @@ -602,6 +602,10 @@ cpuid4_cache_lookup_regs(int index, struct _cpuid4_info_regs *this_leaf)  		else  			amd_cpuid4(index, &eax, &ebx, &ecx);  		amd_init_l3_cache(this_leaf, index); +	} else if (boot_cpu_data.x86_vendor == X86_VENDOR_HYGON) { +		cpuid_count(0x8000001d, index, &eax.full, +			    &ebx.full, &ecx.full, &edx); +		amd_init_l3_cache(this_leaf, index);  	} else {  		cpuid_count(4, index, &eax.full, &ebx.full, &ecx.full, &edx);  	} @@ -625,7 +629,8 @@ static int find_num_cache_leaves(struct cpuinfo_x86 *c)  	union _cpuid4_leaf_eax	cache_eax;  	int 			i = -1; -	if (c->x86_vendor == X86_VENDOR_AMD) +	if (c->x86_vendor == X86_VENDOR_AMD || +	    c->x86_vendor == X86_VENDOR_HYGON)  		op = 0x8000001d;  	else  		op = 4; @@ -678,6 +683,22 @@ void cacheinfo_amd_init_llc_id(struct cpuinfo_x86 *c, int cpu, u8 node_id)  	}  } +void cacheinfo_hygon_init_llc_id(struct cpuinfo_x86 *c, int cpu, u8 node_id) +{ +	/* +	 * We may have multiple LLCs if L3 caches exist, so check if we +	 * have an L3 cache by looking at the L3 cache CPUID leaf. +	 */ +	if (!cpuid_edx(0x80000006)) +		return; + +	/* +	 * LLC is at the core complex level. +	 * Core complex ID is ApicId[3] for these processors. +	 */ +	per_cpu(cpu_llc_id, cpu) = c->apicid >> 3; +} +  void init_amd_cacheinfo(struct cpuinfo_x86 *c)  { @@ -691,6 +712,11 @@ void init_amd_cacheinfo(struct cpuinfo_x86 *c)  	}  } +void init_hygon_cacheinfo(struct cpuinfo_x86 *c) +{ +	num_cache_leaves = find_num_cache_leaves(c); +} +  void init_intel_cacheinfo(struct cpuinfo_x86 *c)  {  	/* Cache sizes */ @@ -913,7 +939,8 @@ static void __cache_cpumap_setup(unsigned int cpu, int index,  	int index_msb, i;  	struct cpuinfo_x86 *c = &cpu_data(cpu); -	if (c->x86_vendor == X86_VENDOR_AMD) { +	if (c->x86_vendor == X86_VENDOR_AMD || +	    c->x86_vendor == X86_VENDOR_HYGON) {  		if (__cache_amd_cpumap_setup(cpu, index, base))  			return;  	} |