lkml.org 
[lkml]   [2021]   [Nov]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 07/22] cpufreq: amd: add fast switch function for amd-pstate
    Date
    Introduce the fast switch function for amd-pstate on the AMD processors
    which support the full MSR register control. It's able to decrease the
    latency on interrupt context.

    Signed-off-by: Huang Rui <ray.huang@amd.com>
    ---
    drivers/cpufreq/amd-pstate.c | 36 ++++++++++++++++++++++++++++++++++++
    1 file changed, 36 insertions(+)

    diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
    index 20ffbc30118f..cab266b8bf35 100644
    --- a/drivers/cpufreq/amd-pstate.c
    +++ b/drivers/cpufreq/amd-pstate.c
    @@ -177,6 +177,39 @@ static int amd_pstate_target(struct cpufreq_policy *policy,
    return 0;
    }

    +static void amd_pstate_adjust_perf(unsigned int cpu,
    + unsigned long _min_perf,
    + unsigned long target_perf,
    + unsigned long capacity)
    +{
    + unsigned long max_perf, min_perf, des_perf,
    + cap_perf, lowest_nonlinear_perf;
    + struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
    + struct amd_cpudata *cpudata = policy->driver_data;
    +
    + cap_perf = READ_ONCE(cpudata->highest_perf);
    + lowest_nonlinear_perf = READ_ONCE(cpudata->lowest_nonlinear_perf);
    +
    + des_perf = cap_perf;
    + if (target_perf < capacity)
    + des_perf = DIV_ROUND_UP(cap_perf * target_perf, capacity);
    +
    + min_perf = READ_ONCE(cpudata->highest_perf);
    + if (_min_perf < capacity)
    + min_perf = DIV_ROUND_UP(cap_perf * _min_perf, capacity);
    +
    + if (min_perf < lowest_nonlinear_perf)
    + min_perf = lowest_nonlinear_perf;
    +
    + max_perf = cap_perf;
    + if (max_perf < min_perf)
    + max_perf = min_perf;
    +
    + des_perf = clamp_t(unsigned long, des_perf, min_perf, max_perf);
    +
    + amd_pstate_update(cpudata, min_perf, des_perf, max_perf, true);
    +}
    +
    static int amd_get_min_freq(struct amd_cpudata *cpudata)
    {
    struct cppc_perf_caps cppc_perf;
    @@ -293,6 +326,8 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
    /* It will be updated by governor */
    policy->cur = policy->cpuinfo.min_freq;

    + policy->fast_switch_possible = true;
    +
    ret = freq_qos_add_request(&policy->constraints, &cpudata->req[0],
    FREQ_QOS_MIN, policy->cpuinfo.min_freq);
    if (ret < 0) {
    @@ -341,6 +376,7 @@ static struct cpufreq_driver amd_pstate_driver = {
    .flags = CPUFREQ_CONST_LOOPS | CPUFREQ_NEED_UPDATE_LIMITS,
    .verify = amd_pstate_verify,
    .target = amd_pstate_target,
    + .adjust_perf = amd_pstate_adjust_perf,
    .init = amd_pstate_cpu_init,
    .exit = amd_pstate_cpu_exit,
    .name = "amd-pstate",
    --
    2.25.1
    \
     
     \ /
      Last update: 2021-11-30 13:39    [W:2.613 / U:1.416 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site