111 lines
3.3 KiB
Diff
111 lines
3.3 KiB
Diff
From: Borislav Petkov <bp@suse.de>
|
|
Date: Wed, 19 Jun 2019 17:24:34 +0200
|
|
Subject: x86/cpufeatures: Carve out CQM features retrieval
|
|
Origin: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=16ad0b63f382a16454cb927f2eb45b32dbb71b94
|
|
|
|
commit 45fc56e629caa451467e7664fbd4c797c434a6c4 upstream
|
|
|
|
... into a separate function for better readability. Split out from a
|
|
patch from Fenghua Yu <fenghua.yu@intel.com> to keep the mechanical,
|
|
sole code movement separate for easy review.
|
|
|
|
No functional changes.
|
|
|
|
Signed-off-by: Borislav Petkov <bp@suse.de>
|
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
Cc: Fenghua Yu <fenghua.yu@intel.com>
|
|
Cc: x86@kernel.org
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
---
|
|
arch/x86/kernel/cpu/common.c | 60 ++++++++++++++++++++----------------
|
|
1 file changed, 33 insertions(+), 27 deletions(-)
|
|
|
|
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
|
|
index 1073118b9bf0..a315e475e484 100644
|
|
--- a/arch/x86/kernel/cpu/common.c
|
|
+++ b/arch/x86/kernel/cpu/common.c
|
|
@@ -808,6 +808,38 @@ static void init_speculation_control(struct cpuinfo_x86 *c)
|
|
}
|
|
}
|
|
|
|
+static void init_cqm(struct cpuinfo_x86 *c)
|
|
+{
|
|
+ u32 eax, ebx, ecx, edx;
|
|
+
|
|
+ /* Additional Intel-defined flags: level 0x0000000F */
|
|
+ if (c->cpuid_level >= 0x0000000F) {
|
|
+
|
|
+ /* QoS sub-leaf, EAX=0Fh, ECX=0 */
|
|
+ cpuid_count(0x0000000F, 0, &eax, &ebx, &ecx, &edx);
|
|
+ c->x86_capability[CPUID_F_0_EDX] = edx;
|
|
+
|
|
+ if (cpu_has(c, X86_FEATURE_CQM_LLC)) {
|
|
+ /* will be overridden if occupancy monitoring exists */
|
|
+ c->x86_cache_max_rmid = ebx;
|
|
+
|
|
+ /* QoS sub-leaf, EAX=0Fh, ECX=1 */
|
|
+ cpuid_count(0x0000000F, 1, &eax, &ebx, &ecx, &edx);
|
|
+ c->x86_capability[CPUID_F_1_EDX] = edx;
|
|
+
|
|
+ if ((cpu_has(c, X86_FEATURE_CQM_OCCUP_LLC)) ||
|
|
+ ((cpu_has(c, X86_FEATURE_CQM_MBM_TOTAL)) ||
|
|
+ (cpu_has(c, X86_FEATURE_CQM_MBM_LOCAL)))) {
|
|
+ c->x86_cache_max_rmid = ecx;
|
|
+ c->x86_cache_occ_scale = ebx;
|
|
+ }
|
|
+ } else {
|
|
+ c->x86_cache_max_rmid = -1;
|
|
+ c->x86_cache_occ_scale = -1;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
void get_cpu_cap(struct cpuinfo_x86 *c)
|
|
{
|
|
u32 eax, ebx, ecx, edx;
|
|
@@ -839,33 +871,6 @@ void get_cpu_cap(struct cpuinfo_x86 *c)
|
|
c->x86_capability[CPUID_D_1_EAX] = eax;
|
|
}
|
|
|
|
- /* Additional Intel-defined flags: level 0x0000000F */
|
|
- if (c->cpuid_level >= 0x0000000F) {
|
|
-
|
|
- /* QoS sub-leaf, EAX=0Fh, ECX=0 */
|
|
- cpuid_count(0x0000000F, 0, &eax, &ebx, &ecx, &edx);
|
|
- c->x86_capability[CPUID_F_0_EDX] = edx;
|
|
-
|
|
- if (cpu_has(c, X86_FEATURE_CQM_LLC)) {
|
|
- /* will be overridden if occupancy monitoring exists */
|
|
- c->x86_cache_max_rmid = ebx;
|
|
-
|
|
- /* QoS sub-leaf, EAX=0Fh, ECX=1 */
|
|
- cpuid_count(0x0000000F, 1, &eax, &ebx, &ecx, &edx);
|
|
- c->x86_capability[CPUID_F_1_EDX] = edx;
|
|
-
|
|
- if ((cpu_has(c, X86_FEATURE_CQM_OCCUP_LLC)) ||
|
|
- ((cpu_has(c, X86_FEATURE_CQM_MBM_TOTAL)) ||
|
|
- (cpu_has(c, X86_FEATURE_CQM_MBM_LOCAL)))) {
|
|
- c->x86_cache_max_rmid = ecx;
|
|
- c->x86_cache_occ_scale = ebx;
|
|
- }
|
|
- } else {
|
|
- c->x86_cache_max_rmid = -1;
|
|
- c->x86_cache_occ_scale = -1;
|
|
- }
|
|
- }
|
|
-
|
|
/* AMD-defined flags: level 0x80000001 */
|
|
eax = cpuid_eax(0x80000000);
|
|
c->extended_cpuid_level = eax;
|
|
@@ -896,6 +901,7 @@ void get_cpu_cap(struct cpuinfo_x86 *c)
|
|
|
|
init_scattered_cpuid_features(c);
|
|
init_speculation_control(c);
|
|
+ init_cqm(c);
|
|
|
|
/*
|
|
* Clear/Set all flags overridden by options, after probe.
|
|
--
|
|
2.20.1
|
|
|