x86/amd: Move amd_get_highest_perf() out of amd-pstate
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>
This commit is contained in:
parent
21fb59ab4b
commit
2819bfef64
@ -116,6 +116,36 @@ void init_freq_invariance_cppc(void)
|
|||||||
mutex_unlock(&freq_invariance_lock);
|
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
|
* amd_get_boost_ratio_numerator: Get the numerator to use for boost ratio calculation
|
||||||
* @cpu: CPU to get numerator for.
|
* @cpu: CPU to get numerator for.
|
||||||
|
@ -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);
|
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
|
#define CPPC_MAX_PERF U8_MAX
|
||||||
|
|
||||||
static void amd_pstate_init_prefcore(struct amd_cpudata *cpudata)
|
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;
|
int ret, prio;
|
||||||
u32 highest_perf;
|
u32 highest_perf;
|
||||||
|
|
||||||
ret = amd_pstate_get_highest_perf(cpudata->cpu, &highest_perf);
|
ret = amd_get_highest_perf(cpudata->cpu, &highest_perf);
|
||||||
if (ret)
|
if (ret)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -892,7 +862,7 @@ static void amd_pstate_update_limits(unsigned int cpu)
|
|||||||
if ((!amd_pstate_prefcore) || (!cpudata->hw_prefcore))
|
if ((!amd_pstate_prefcore) || (!cpudata->hw_prefcore))
|
||||||
goto free_cpufreq_put;
|
goto free_cpufreq_put;
|
||||||
|
|
||||||
ret = amd_pstate_get_highest_perf(cpu, &cur_high);
|
ret = amd_get_highest_perf(cpu, &cur_high);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto free_cpufreq_put;
|
goto free_cpufreq_put;
|
||||||
|
|
||||||
|
@ -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_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_get_auto_sel_caps(int cpunum, struct cppc_perf_caps *perf_caps);
|
||||||
extern int cppc_set_auto_sel(int cpu, bool enable);
|
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);
|
extern int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator);
|
||||||
#else /* !CONFIG_ACPI_CPPC_LIB */
|
#else /* !CONFIG_ACPI_CPPC_LIB */
|
||||||
static inline int cppc_get_desired_perf(int cpunum, u64 *desired_perf)
|
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;
|
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)
|
static inline int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator)
|
||||||
{
|
{
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
Loading…
Reference in New Issue
Block a user