Commit f3d44f18 authored by Reinette Chatre's avatar Reinette Chatre Committed by Borislav Petkov

x86/resctrl: Support CPUID enumeration of MBM counter width

The original Memory Bandwidth Monitoring (MBM) architectural
definition defines counters of up to 62 bits in the
IA32_QM_CTR MSR while the first-generation MBM implementation
uses statically defined 24 bit counters.

Expand the MBM CPUID enumeration properties to include the MBM
counter width. The previously undefined EAX output register contains,
in bits [7:0], the MBM counter width encoded as an offset from
24 bits. Enumerating this property is only specified for Intel
CPUs.
Suggested-by: default avatarBorislav Petkov <bp@suse.de>
Signed-off-by: default avatarReinette Chatre <reinette.chatre@intel.com>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/afa3af2f753f6bc301fb743bc8944e749cb24afa.1588715690.git.reinette.chatre@intel.com
parent 46637d45
...@@ -113,9 +113,10 @@ struct cpuinfo_x86 { ...@@ -113,9 +113,10 @@ struct cpuinfo_x86 {
/* in KB - valid for CPUS which support this call: */ /* in KB - valid for CPUS which support this call: */
unsigned int x86_cache_size; unsigned int x86_cache_size;
int x86_cache_alignment; /* In bytes */ int x86_cache_alignment; /* In bytes */
/* Cache QoS architectural values: */ /* Cache QoS architectural values, valid only on the BSP: */
int x86_cache_max_rmid; /* max index */ int x86_cache_max_rmid; /* max index */
int x86_cache_occ_scale; /* scale to bytes */ int x86_cache_occ_scale; /* scale to bytes */
int x86_cache_mbm_width_offset;
int x86_power; int x86_power;
unsigned long loops_per_jiffy; unsigned long loops_per_jiffy;
/* cpuid returned max cores value: */ /* cpuid returned max cores value: */
......
...@@ -964,6 +964,7 @@ void resctrl_cpu_detect(struct cpuinfo_x86 *c) ...@@ -964,6 +964,7 @@ void resctrl_cpu_detect(struct cpuinfo_x86 *c)
if (!cpu_has(c, X86_FEATURE_CQM_LLC)) { if (!cpu_has(c, X86_FEATURE_CQM_LLC)) {
c->x86_cache_max_rmid = -1; c->x86_cache_max_rmid = -1;
c->x86_cache_occ_scale = -1; c->x86_cache_occ_scale = -1;
c->x86_cache_mbm_width_offset = -1;
return; return;
} }
...@@ -980,6 +981,10 @@ void resctrl_cpu_detect(struct cpuinfo_x86 *c) ...@@ -980,6 +981,10 @@ void resctrl_cpu_detect(struct cpuinfo_x86 *c)
c->x86_cache_max_rmid = ecx; c->x86_cache_max_rmid = ecx;
c->x86_cache_occ_scale = ebx; c->x86_cache_occ_scale = ebx;
if (c->x86_vendor == X86_VENDOR_INTEL)
c->x86_cache_mbm_width_offset = eax & 0xff;
else
c->x86_cache_mbm_width_offset = -1;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment