Home Home > GIT Browse
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBorislav Petkov <bp@suse.de>2019-05-17 16:06:56 +0200
committerBorislav Petkov <bp@suse.de>2019-05-17 16:06:56 +0200
commit79134f014967e6654ef8b2786b26f9da032998df (patch)
treee3aed8458b2f9ef9b4cce23fb758af30e8e01df3
parent7161933b5882746769f7f8f24a0d6386875d4e98 (diff)
x86/cpu: Get cache info and setup cache cpumap for Hygon Dhyana
-rw-r--r--patches.arch/x86-cpu-get-cache-info-and-setup-cache-cpumap-for-hygon-dhyana.patch141
-rw-r--r--series.conf1
2 files changed, 142 insertions, 0 deletions
diff --git a/patches.arch/x86-cpu-get-cache-info-and-setup-cache-cpumap-for-hygon-dhyana.patch b/patches.arch/x86-cpu-get-cache-info-and-setup-cache-cpumap-for-hygon-dhyana.patch
new file mode 100644
index 0000000000..fa08958b4a
--- /dev/null
+++ b/patches.arch/x86-cpu-get-cache-info-and-setup-cache-cpumap-for-hygon-dhyana.patch
@@ -0,0 +1,141 @@
+From: Pu Wen <puwen@hygon.cn>
+Date: Sun, 23 Sep 2018 17:33:44 +0800
+Subject: x86/cpu: Get cache info and setup cache cpumap for Hygon Dhyana
+Git-commit: d4f7423efdd1419b17524d090ff9ff4024bcf09b
+Patch-mainline: v4.20-rc1
+References: fate#327735
+
+The Hygon Dhyana CPU has a topology extensions bit in CPUID. With
+this bit, the kernel can get the cache information. So add support in
+cpuid4_cache_lookup_regs() to get the correct cache size.
+
+The Hygon Dhyana CPU also discovers num_cache_leaves via CPUID leaf
+0x8000001d, so add support to it in find_num_cache_leaves().
+
+Also add cacheinfo_hygon_init_llc_id() and init_hygon_cacheinfo()
+functions to initialize Dhyana cache info. Setup cache cpumap in the
+same way as AMD does.
+
+Signed-off-by: Pu Wen <puwen@hygon.cn>
+Signed-off-by: Borislav Petkov <bp@suse.de>
+Reviewed-by: Borislav Petkov <bp@suse.de>
+Cc: bp@alien8.de
+Cc: tglx@linutronix.de
+Cc: mingo@redhat.com
+Cc: hpa@zytor.com
+Cc: x86@kernel.org
+Cc: thomas.lendacky@amd.com
+Link: https://lkml.kernel.org/r/2a686b2ac0e2f5a1f2f5f101124d9dd44f949731.1537533369.git.puwen@hygon.cn
+---
+ arch/x86/include/asm/cacheinfo.h | 1 +
+ arch/x86/kernel/cpu/cacheinfo.c | 31 +++++++++++++++++++++++++++++--
+ arch/x86/kernel/cpu/cpu.h | 1 +
+ arch/x86/kernel/cpu/hygon.c | 3 +++
+ 4 files changed, 34 insertions(+), 2 deletions(-)
+
+--- a/arch/x86/include/asm/cacheinfo.h
++++ b/arch/x86/include/asm/cacheinfo.h
+@@ -3,5 +3,6 @@
+ #define _ASM_X86_CACHEINFO_H
+
+ 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);
+
+ #endif /* _ASM_X86_CACHEINFO_H */
+--- a/arch/x86/kernel/cpu/cacheinfo.c
++++ b/arch/x86/kernel/cpu/cacheinfo.c
+@@ -599,6 +599,10 @@ cpuid4_cache_lookup_regs(int index, stru
+ 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);
+ }
+@@ -622,7 +626,8 @@ static int find_num_cache_leaves(struct
+ 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;
+@@ -675,6 +680,22 @@ void cacheinfo_amd_init_llc_id(struct cp
+ }
+ }
+
++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)
+ {
+
+@@ -688,6 +709,11 @@ void init_amd_cacheinfo(struct cpuinfo_x
+ }
+ }
+
++void init_hygon_cacheinfo(struct cpuinfo_x86 *c)
++{
++ num_cache_leaves = find_num_cache_leaves(c);
++}
++
+ unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c)
+ {
+ /* Cache sizes */
+@@ -910,7 +936,8 @@ static void __cache_cpumap_setup(unsigne
+ 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;
+ }
+--- a/arch/x86/kernel/cpu/cpu.h
++++ b/arch/x86/kernel/cpu/cpu.h
+@@ -27,6 +27,7 @@ struct cpu_dev {
+ } legacy_models[5];
+ #endif
+ };
++extern void init_hygon_cacheinfo(struct cpuinfo_x86 *c);
+
+ struct _tlb_table {
+ unsigned char descriptor;
+--- a/arch/x86/kernel/cpu/hygon.c
++++ b/arch/x86/kernel/cpu/hygon.c
+@@ -87,6 +87,7 @@ static void hygon_get_topology(struct cp
+ if (!err)
+ c->x86_coreid_bits = get_count_order(c->x86_max_cores);
+
++ cacheinfo_hygon_init_llc_id(c, cpu, node_id);
+ } else if (cpu_has(c, X86_FEATURE_NODEID_MSR)) {
+ u64 value;
+
+@@ -321,6 +322,8 @@ static void init_hygon(struct cpuinfo_x8
+ hygon_get_topology(c);
+ srat_detect_node(c);
+
++ init_hygon_cacheinfo(c);
++
+ if (cpu_has(c, X86_FEATURE_XMM2)) {
+ unsigned long long val;
+ int ret;
diff --git a/series.conf b/series.conf
index f5334e4ad0..65c84a662b 100644
--- a/series.conf
+++ b/series.conf
@@ -40254,6 +40254,7 @@
patches.arch/x86-fsgsbase-64-clean-up-various-details.patch
patches.arch/x86-corruption-check-fix-panic-in-memory_corruption_check-when-boot-option-without-value-is-provided
patches.arch/x86-cpu-create-hygon-dhyana-architecture-support-file.patch
+ patches.arch/x86-cpu-get-cache-info-and-setup-cache-cpumap-for-hygon-dhyana.patch
patches.fixes/0001-x86-xen-Fix-boot-loader-version-reported-for-PVH-gue.patch
patches.suse/msft-hv-1772-x86-hyperv-Suppress-PCI-Fatal-No-config-space-access.patch
patches.suse/msft-hv-1773-x86-hyperv-Remove-unused-include.patch