Initialize the resource functions that are different between the
vendors. Some features are initialized differently between the vendors.

For example, MBA feature varies significantly between Intel and AMD.
Separate the initialization of these resource functions. That way we
can easily add AMD's functions later.

Signed-off-by: Babu Moger <[email protected]>
---
 arch/x86/kernel/cpu/rdt.c | 28 +++++++++++++++++++++++++---
 arch/x86/kernel/cpu/rdt.h |  4 ++++
 2 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/cpu/rdt.c b/arch/x86/kernel/cpu/rdt.c
index 736715b81fd8..6dec45bf81d6 100644
--- a/arch/x86/kernel/cpu/rdt.c
+++ b/arch/x86/kernel/cpu/rdt.c
@@ -174,10 +174,7 @@ struct rdt_resource rdt_resources_all[] = {
                .rid                    = RDT_RESOURCE_MBA,
                .name                   = "MB",
                .domains                = domain_init(RDT_RESOURCE_MBA),
-               .msr_base               = IA32_MBA_THRTL_BASE,
-               .msr_update             = mba_wrmsr,
                .cache_level            = 3,
-               .parse_ctrlval          = parse_bw,
                .format_str             = "%d=%*u",
                .fflags                 = RFTYPE_RES_MB,
        },
@@ -865,6 +862,25 @@ static __init void rdt_check_mba(void)
                rdt_get_mem_config(&rdt_resources_all[RDT_RESOURCE_MBA]);
 }
 
+static __init void rdt_init_res_defs_intel(void)
+{
+       struct rdt_resource *r;
+
+       for_each_rdt_resource(r) {
+               if (r->rid == RDT_RESOURCE_MBA) {
+                       r->msr_base = IA32_MBA_THRTL_BASE;
+                       r->msr_update = mba_wrmsr;
+                       r->parse_ctrlval = parse_bw;
+               }
+       }
+}
+
+static __init void rdt_init_res_defs(void)
+{
+       if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
+               rdt_init_res_defs_intel();
+}
+
 static enum cpuhp_state rdt_online;
 
 static int __init rdt_late_init(void)
@@ -875,6 +891,12 @@ static int __init rdt_late_init(void)
        /* Run quirks first */
        rdt_quirks();
 
+       /*
+        * Initialize functions(or definitions) that are different
+        * between vendors here.
+        */
+       rdt_init_res_defs();
+
        rdt_alloc_capable = get_rdt_alloc_resources();
        rdt_mon_capable = get_rdt_mon_resources();
 
diff --git a/arch/x86/kernel/cpu/rdt.h b/arch/x86/kernel/cpu/rdt.h
index c15417a6b1af..2569c10c37f4 100644
--- a/arch/x86/kernel/cpu/rdt.h
+++ b/arch/x86/kernel/cpu/rdt.h
@@ -455,6 +455,10 @@ enum {
        RDT_NUM_RESOURCES,
 };
 
+#define for_each_rdt_resource(r)                                             \
+       for (r = rdt_resources_all; r < rdt_resources_all + RDT_NUM_RESOURCES;\
+            r++)
+
 #define for_each_capable_rdt_resource(r)                                     \
        for (r = rdt_resources_all; r < rdt_resources_all + RDT_NUM_RESOURCES;\
             r++)                                                             \
-- 
2.17.1

Reply via email to