mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 22:51:35 +00:00
x86/resctrl: Detect and configure Slow Memory Bandwidth Allocation
The QoS slow memory configuration details are available via CPUID_Fn80000020_EDX_x02. Detect the available details and initialize the rest to defaults. Signed-off-by: Babu Moger <babu.moger@amd.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Reinette Chatre <reinette.chatre@intel.com> Link: https://lore.kernel.org/r/20230113152039.770054-7-babu.moger@amd.com
This commit is contained in:
parent
a76f65c89f
commit
5b6fac3fa4
@ -1061,6 +1061,7 @@
|
||||
|
||||
/* - AMD: */
|
||||
#define MSR_IA32_MBA_BW_BASE 0xc0000200
|
||||
#define MSR_IA32_SMBA_BW_BASE 0xc0000280
|
||||
|
||||
/* MSR_IA32_VMX_MISC bits */
|
||||
#define MSR_IA32_VMX_MISC_INTEL_PT (1ULL << 14)
|
||||
|
@ -162,6 +162,13 @@ bool is_mba_sc(struct rdt_resource *r)
|
||||
if (!r)
|
||||
return rdt_resources_all[RDT_RESOURCE_MBA].r_resctrl.membw.mba_sc;
|
||||
|
||||
/*
|
||||
* The software controller support is only applicable to MBA resource.
|
||||
* Make sure to check for resource type.
|
||||
*/
|
||||
if (r->rid != RDT_RESOURCE_MBA)
|
||||
return false;
|
||||
|
||||
return r->membw.mba_sc;
|
||||
}
|
||||
|
||||
@ -225,9 +232,15 @@ static bool __rdt_get_mem_config_amd(struct rdt_resource *r)
|
||||
struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r);
|
||||
union cpuid_0x10_3_eax eax;
|
||||
union cpuid_0x10_x_edx edx;
|
||||
u32 ebx, ecx;
|
||||
u32 ebx, ecx, subleaf;
|
||||
|
||||
cpuid_count(0x80000020, 1, &eax.full, &ebx, &ecx, &edx.full);
|
||||
/*
|
||||
* Query CPUID_Fn80000020_EDX_x01 for MBA and
|
||||
* CPUID_Fn80000020_EDX_x02 for SMBA
|
||||
*/
|
||||
subleaf = (r->rid == RDT_RESOURCE_SMBA) ? 2 : 1;
|
||||
|
||||
cpuid_count(0x80000020, subleaf, &eax.full, &ebx, &ecx, &edx.full);
|
||||
hw_res->num_closid = edx.split.cos_max + 1;
|
||||
r->default_ctrl = MAX_MBA_BW_AMD;
|
||||
|
||||
@ -750,6 +763,19 @@ static __init bool get_mem_config(void)
|
||||
return false;
|
||||
}
|
||||
|
||||
static __init bool get_slow_mem_config(void)
|
||||
{
|
||||
struct rdt_hw_resource *hw_res = &rdt_resources_all[RDT_RESOURCE_SMBA];
|
||||
|
||||
if (!rdt_cpu_has(X86_FEATURE_SMBA))
|
||||
return false;
|
||||
|
||||
if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD)
|
||||
return __rdt_get_mem_config_amd(&hw_res->r_resctrl);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static __init bool get_rdt_alloc_resources(void)
|
||||
{
|
||||
struct rdt_resource *r;
|
||||
@ -780,6 +806,9 @@ static __init bool get_rdt_alloc_resources(void)
|
||||
if (get_mem_config())
|
||||
ret = true;
|
||||
|
||||
if (get_slow_mem_config())
|
||||
ret = true;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -869,6 +898,9 @@ static __init void rdt_init_res_defs_amd(void)
|
||||
} else if (r->rid == RDT_RESOURCE_MBA) {
|
||||
hw_res->msr_base = MSR_IA32_MBA_BW_BASE;
|
||||
hw_res->msr_update = mba_wrmsr_amd;
|
||||
} else if (r->rid == RDT_RESOURCE_SMBA) {
|
||||
hw_res->msr_base = MSR_IA32_SMBA_BW_BASE;
|
||||
hw_res->msr_update = mba_wrmsr_amd;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -209,7 +209,7 @@ static int parse_line(char *line, struct resctrl_schema *s,
|
||||
unsigned long dom_id;
|
||||
|
||||
if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP &&
|
||||
r->rid == RDT_RESOURCE_MBA) {
|
||||
(r->rid == RDT_RESOURCE_MBA || r->rid == RDT_RESOURCE_SMBA)) {
|
||||
rdt_last_cmd_puts("Cannot pseudo-lock MBA resource\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -1210,7 +1210,7 @@ static bool rdtgroup_mode_test_exclusive(struct rdtgroup *rdtgrp)
|
||||
|
||||
list_for_each_entry(s, &resctrl_schema_all, list) {
|
||||
r = s->res;
|
||||
if (r->rid == RDT_RESOURCE_MBA)
|
||||
if (r->rid == RDT_RESOURCE_MBA || r->rid == RDT_RESOURCE_SMBA)
|
||||
continue;
|
||||
has_cache = true;
|
||||
list_for_each_entry(d, &r->domains, list) {
|
||||
@ -1399,7 +1399,8 @@ static int rdtgroup_size_show(struct kernfs_open_file *of,
|
||||
ctrl = resctrl_arch_get_config(r, d,
|
||||
closid,
|
||||
type);
|
||||
if (r->rid == RDT_RESOURCE_MBA)
|
||||
if (r->rid == RDT_RESOURCE_MBA ||
|
||||
r->rid == RDT_RESOURCE_SMBA)
|
||||
size = ctrl;
|
||||
else
|
||||
size = rdtgroup_cbm_to_size(r, d, ctrl);
|
||||
@ -2842,7 +2843,8 @@ static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp)
|
||||
|
||||
list_for_each_entry(s, &resctrl_schema_all, list) {
|
||||
r = s->res;
|
||||
if (r->rid == RDT_RESOURCE_MBA) {
|
||||
if (r->rid == RDT_RESOURCE_MBA ||
|
||||
r->rid == RDT_RESOURCE_SMBA) {
|
||||
rdtgroup_init_mba(r, rdtgrp->closid);
|
||||
if (is_mba_sc(r))
|
||||
continue;
|
||||
|
Loading…
Reference in New Issue
Block a user