x86/resctrl: Detect and configure Slow Memory Bandwidth Allocation
authorBabu Moger <babu.moger@amd.com>
Fri, 13 Jan 2023 15:20:32 +0000 (09:20 -0600)
committerBorislav Petkov (AMD) <bp@alien8.de>
Mon, 23 Jan 2023 16:38:44 +0000 (17:38 +0100)
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
arch/x86/include/asm/msr-index.h
arch/x86/kernel/cpu/resctrl/core.c
arch/x86/kernel/cpu/resctrl/ctrlmondata.c
arch/x86/kernel/cpu/resctrl/rdtgroup.c

index 37ff47552bcb7b57fdc75bc0246f2bb3876add4a..e0a40027aa62e02d5f3df99f1ffc359a5abddde6 100644 (file)
 
 /* - 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)
index 10a8c9d96f32ed003c14e95904ebb67366397b8b..b4fc851f6489accc541a9489a7be8feddf5962a6 100644 (file)
@@ -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;
                }
        }
 }
index 7eece3d2d0c3c79d7ac91c92531b7081fc534475..eb07d4435391bedc4db1a2d6483bda477c093bea 100644 (file)
@@ -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;
        }
index d23fbc45ecd13c874d290a7595d1c3e75434e393..75169680516b03635879f707e9b091b75e04194f 100644 (file)
@@ -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;