|
@@ -602,6 +602,10 @@ cpuid4_cache_lookup_regs(int index, struct _cpuid4_info_regs *this_leaf)
|
|
else
|
|
else
|
|
amd_cpuid4(index, &eax, &ebx, &ecx);
|
|
amd_cpuid4(index, &eax, &ebx, &ecx);
|
|
amd_init_l3_cache(this_leaf, index);
|
|
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 {
|
|
} else {
|
|
cpuid_count(4, index, &eax.full, &ebx.full, &ecx.full, &edx);
|
|
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;
|
|
union _cpuid4_leaf_eax cache_eax;
|
|
int i = -1;
|
|
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;
|
|
op = 0x8000001d;
|
|
else
|
|
else
|
|
op = 4;
|
|
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)
|
|
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)
|
|
void init_intel_cacheinfo(struct cpuinfo_x86 *c)
|
|
{
|
|
{
|
|
/* Cache sizes */
|
|
/* Cache sizes */
|
|
@@ -913,7 +939,8 @@ static void __cache_cpumap_setup(unsigned int cpu, int index,
|
|
int index_msb, i;
|
|
int index_msb, i;
|
|
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
|
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))
|
|
if (__cache_amd_cpumap_setup(cpu, index, base))
|
|
return;
|
|
return;
|
|
}
|
|
}
|