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
4 changed files with 41 additions and 6 deletions
|
@ -1061,6 +1061,7 @@
|
||||||
|
|
||||||
/* - AMD: */
|
/* - AMD: */
|
||||||
#define MSR_IA32_MBA_BW_BASE 0xc0000200
|
#define MSR_IA32_MBA_BW_BASE 0xc0000200
|
||||||
|
#define MSR_IA32_SMBA_BW_BASE 0xc0000280
|
||||||
|
|
||||||
/* MSR_IA32_VMX_MISC bits */
|
/* MSR_IA32_VMX_MISC bits */
|
||||||
#define MSR_IA32_VMX_MISC_INTEL_PT (1ULL << 14)
|
#define MSR_IA32_VMX_MISC_INTEL_PT (1ULL << 14)
|
||||||
|
|
|
@ -162,6 +162,13 @@ bool is_mba_sc(struct rdt_resource *r)
|
||||||
if (!r)
|
if (!r)
|
||||||
return rdt_resources_all[RDT_RESOURCE_MBA].r_resctrl.membw.mba_sc;
|
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;
|
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);
|
struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r);
|
||||||
union cpuid_0x10_3_eax eax;
|
union cpuid_0x10_3_eax eax;
|
||||||
union cpuid_0x10_x_edx edx;
|
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;
|
hw_res->num_closid = edx.split.cos_max + 1;
|
||||||
r->default_ctrl = MAX_MBA_BW_AMD;
|
r->default_ctrl = MAX_MBA_BW_AMD;
|
||||||
|
|
||||||
|
@ -750,6 +763,19 @@ static __init bool get_mem_config(void)
|
||||||
return false;
|
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)
|
static __init bool get_rdt_alloc_resources(void)
|
||||||
{
|
{
|
||||||
struct rdt_resource *r;
|
struct rdt_resource *r;
|
||||||
|
@ -780,6 +806,9 @@ static __init bool get_rdt_alloc_resources(void)
|
||||||
if (get_mem_config())
|
if (get_mem_config())
|
||||||
ret = true;
|
ret = true;
|
||||||
|
|
||||||
|
if (get_slow_mem_config())
|
||||||
|
ret = true;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -869,6 +898,9 @@ static __init void rdt_init_res_defs_amd(void)
|
||||||
} else if (r->rid == RDT_RESOURCE_MBA) {
|
} else if (r->rid == RDT_RESOURCE_MBA) {
|
||||||
hw_res->msr_base = MSR_IA32_MBA_BW_BASE;
|
hw_res->msr_base = MSR_IA32_MBA_BW_BASE;
|
||||||
hw_res->msr_update = mba_wrmsr_amd;
|
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;
|
unsigned long dom_id;
|
||||||
|
|
||||||
if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP &&
|
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");
|
rdt_last_cmd_puts("Cannot pseudo-lock MBA resource\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1210,7 +1210,7 @@ static bool rdtgroup_mode_test_exclusive(struct rdtgroup *rdtgrp)
|
||||||
|
|
||||||
list_for_each_entry(s, &resctrl_schema_all, list) {
|
list_for_each_entry(s, &resctrl_schema_all, list) {
|
||||||
r = s->res;
|
r = s->res;
|
||||||
if (r->rid == RDT_RESOURCE_MBA)
|
if (r->rid == RDT_RESOURCE_MBA || r->rid == RDT_RESOURCE_SMBA)
|
||||||
continue;
|
continue;
|
||||||
has_cache = true;
|
has_cache = true;
|
||||||
list_for_each_entry(d, &r->domains, list) {
|
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,
|
ctrl = resctrl_arch_get_config(r, d,
|
||||||
closid,
|
closid,
|
||||||
type);
|
type);
|
||||||
if (r->rid == RDT_RESOURCE_MBA)
|
if (r->rid == RDT_RESOURCE_MBA ||
|
||||||
|
r->rid == RDT_RESOURCE_SMBA)
|
||||||
size = ctrl;
|
size = ctrl;
|
||||||
else
|
else
|
||||||
size = rdtgroup_cbm_to_size(r, d, ctrl);
|
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) {
|
list_for_each_entry(s, &resctrl_schema_all, list) {
|
||||||
r = s->res;
|
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);
|
rdtgroup_init_mba(r, rdtgrp->closid);
|
||||||
if (is_mba_sc(r))
|
if (is_mba_sc(r))
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Add table
Reference in a new issue