x86/amd: Move amd_get_highest_perf() out of amd-pstate
authorMario Limonciello <mario.limonciello@amd.com>
Mon, 26 Aug 2024 21:13:54 +0000 (16:13 -0500)
committerMario Limonciello <mario.limonciello@amd.com>
Wed, 11 Sep 2024 15:23:23 +0000 (10:23 -0500)
amd_pstate_get_highest_perf() is a helper used to get the highest perf
value on AMD systems.  It's used in amd-pstate as part of preferred
core handling, but applicable for acpi-cpufreq as well.

Move it out to cppc handling code as amd_get_highest_perf().

Reviewed-by: Perry Yuan <perry.yuan@amd.com>
Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
arch/x86/kernel/acpi/cppc.c
drivers/cpufreq/amd-pstate.c
include/acpi/cppc_acpi.h

index f0328ce98a8fec3055ce667e283965f6b7f3f98c..a75dcb382c786ba24dc789582082fbedd062ba89 100644 (file)
@@ -116,6 +116,36 @@ void init_freq_invariance_cppc(void)
        mutex_unlock(&freq_invariance_lock);
 }
 
+/*
+ * Get the highest performance register value.
+ * @cpu: CPU from which to get highest performance.
+ * @highest_perf: Return address for highest performance value.
+ *
+ * Return: 0 for success, negative error code otherwise.
+ */
+int amd_get_highest_perf(unsigned int cpu, u32 *highest_perf)
+{
+       u64 val;
+       int ret;
+
+       if (cpu_feature_enabled(X86_FEATURE_CPPC)) {
+               ret = rdmsrl_safe_on_cpu(cpu, MSR_AMD_CPPC_CAP1, &val);
+               if (ret)
+                       goto out;
+
+               val = AMD_CPPC_HIGHEST_PERF(val);
+       } else {
+               ret = cppc_get_highest_perf(cpu, &val);
+               if (ret)
+                       goto out;
+       }
+
+       WRITE_ONCE(*highest_perf, (u32)val);
+out:
+       return ret;
+}
+EXPORT_SYMBOL_GPL(amd_get_highest_perf);
+
 /**
  * amd_get_boost_ratio_numerator: Get the numerator to use for boost ratio calculation
  * @cpu: CPU to get numerator for.
index f4b9fef3342b00fef2db8c39125134cc18705c48..8da567913f63a23a7a5cf3add146fb99922dcdd8 100644 (file)
@@ -811,36 +811,6 @@ static void amd_pstste_sched_prefcore_workfn(struct work_struct *work)
 }
 static DECLARE_WORK(sched_prefcore_work, amd_pstste_sched_prefcore_workfn);
 
-/*
- * Get the highest performance register value.
- * @cpu: CPU from which to get highest performance.
- * @highest_perf: Return address.
- *
- * Return: 0 for success, -EIO otherwise.
- */
-static int amd_pstate_get_highest_perf(int cpu, u32 *highest_perf)
-{
-       int ret;
-
-       if (cpu_feature_enabled(X86_FEATURE_CPPC)) {
-               u64 cap1;
-
-               ret = rdmsrl_safe_on_cpu(cpu, MSR_AMD_CPPC_CAP1, &cap1);
-               if (ret)
-                       return ret;
-               WRITE_ONCE(*highest_perf, AMD_CPPC_HIGHEST_PERF(cap1));
-       } else {
-               u64 cppc_highest_perf;
-
-               ret = cppc_get_highest_perf(cpu, &cppc_highest_perf);
-               if (ret)
-                       return ret;
-               WRITE_ONCE(*highest_perf, cppc_highest_perf);
-       }
-
-       return (ret);
-}
-
 #define CPPC_MAX_PERF  U8_MAX
 
 static void amd_pstate_init_prefcore(struct amd_cpudata *cpudata)
@@ -848,7 +818,7 @@ static void amd_pstate_init_prefcore(struct amd_cpudata *cpudata)
        int ret, prio;
        u32 highest_perf;
 
-       ret = amd_pstate_get_highest_perf(cpudata->cpu, &highest_perf);
+       ret = amd_get_highest_perf(cpudata->cpu, &highest_perf);
        if (ret)
                return;
 
@@ -892,7 +862,7 @@ static void amd_pstate_update_limits(unsigned int cpu)
        if ((!amd_pstate_prefcore) || (!cpudata->hw_prefcore))
                goto free_cpufreq_put;
 
-       ret = amd_pstate_get_highest_perf(cpu, &cur_high);
+       ret = amd_get_highest_perf(cpu, &cur_high);
        if (ret)
                goto free_cpufreq_put;
 
index 97861abc5f5b8e8e46db1a9c84acd543fb80b8de..f7c7abf2a95e9ce854aee63f5ca612e90837b518 100644 (file)
@@ -159,6 +159,7 @@ extern int cppc_get_epp_perf(int cpunum, u64 *epp_perf);
 extern int cppc_set_epp_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls, bool enable);
 extern int cppc_get_auto_sel_caps(int cpunum, struct cppc_perf_caps *perf_caps);
 extern int cppc_set_auto_sel(int cpu, bool enable);
+extern int amd_get_highest_perf(unsigned int cpu, u32 *highest_perf);
 extern int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator);
 #else /* !CONFIG_ACPI_CPPC_LIB */
 static inline int cppc_get_desired_perf(int cpunum, u64 *desired_perf)
@@ -233,6 +234,10 @@ static inline int cppc_get_auto_sel_caps(int cpunum, struct cppc_perf_caps *perf
 {
        return -EOPNOTSUPP;
 }
+static inline int amd_get_highest_perf(unsigned int cpu, u32 *highest_perf)
+{
+       return -ENODEV;
+}
 static inline int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator)
 {
        return -EOPNOTSUPP;