Skip to content

Commit 5547c0e

Browse files
Perry Yuanrafaeljw
authored andcommitted
cpufreq: amd-pstate: Unify computation of {max,min,nominal,lowest_nonlinear}_freq
Currently the amd_get_{min, max, nominal, lowest_nonlinear}_freq() helpers computes the values of min_freq, max_freq, nominal_freq and lowest_nominal_freq respectively afresh from cppc_get_perf_caps(). This is not necessary as there are fields in cpudata to cache these values. To simplify this, add a single helper function named amd_pstate_init_freq() which computes all these frequencies at once, and caches it in cpudata. Use the cached values everywhere else in the code. Acked-by: Huang Rui <[email protected]> Reviewed-by: Li Meng <[email protected]> Tested-by: Dhananjay Ugwekar <[email protected]> Co-developed-by: Gautham R. Shenoy <[email protected]> Signed-off-by: Gautham R. Shenoy <[email protected]> Signed-off-by: Perry Yuan <[email protected]> Signed-off-by: Rafael J. Wysocki <[email protected]>
1 parent 4fcfd19 commit 5547c0e

File tree

1 file changed

+59
-67
lines changed

1 file changed

+59
-67
lines changed

drivers/cpufreq/amd-pstate.c

Lines changed: 59 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -606,74 +606,22 @@ static void amd_pstate_adjust_perf(unsigned int cpu,
606606

607607
static int amd_get_min_freq(struct amd_cpudata *cpudata)
608608
{
609-
struct cppc_perf_caps cppc_perf;
610-
611-
int ret = cppc_get_perf_caps(cpudata->cpu, &cppc_perf);
612-
if (ret)
613-
return ret;
614-
615-
/* Switch to khz */
616-
return cppc_perf.lowest_freq * 1000;
609+
return READ_ONCE(cpudata->min_freq);
617610
}
618611

619612
static int amd_get_max_freq(struct amd_cpudata *cpudata)
620613
{
621-
struct cppc_perf_caps cppc_perf;
622-
u32 max_perf, max_freq, nominal_freq, nominal_perf;
623-
u64 boost_ratio;
624-
625-
int ret = cppc_get_perf_caps(cpudata->cpu, &cppc_perf);
626-
if (ret)
627-
return ret;
628-
629-
nominal_freq = cppc_perf.nominal_freq;
630-
nominal_perf = READ_ONCE(cpudata->nominal_perf);
631-
max_perf = READ_ONCE(cpudata->highest_perf);
632-
633-
boost_ratio = div_u64(max_perf << SCHED_CAPACITY_SHIFT,
634-
nominal_perf);
635-
636-
max_freq = nominal_freq * boost_ratio >> SCHED_CAPACITY_SHIFT;
637-
638-
/* Switch to khz */
639-
return max_freq * 1000;
614+
return READ_ONCE(cpudata->max_freq);
640615
}
641616

642617
static int amd_get_nominal_freq(struct amd_cpudata *cpudata)
643618
{
644-
struct cppc_perf_caps cppc_perf;
645-
646-
int ret = cppc_get_perf_caps(cpudata->cpu, &cppc_perf);
647-
if (ret)
648-
return ret;
649-
650-
/* Switch to khz */
651-
return cppc_perf.nominal_freq * 1000;
619+
return READ_ONCE(cpudata->nominal_freq);
652620
}
653621

654622
static int amd_get_lowest_nonlinear_freq(struct amd_cpudata *cpudata)
655623
{
656-
struct cppc_perf_caps cppc_perf;
657-
u32 lowest_nonlinear_freq, lowest_nonlinear_perf,
658-
nominal_freq, nominal_perf;
659-
u64 lowest_nonlinear_ratio;
660-
661-
int ret = cppc_get_perf_caps(cpudata->cpu, &cppc_perf);
662-
if (ret)
663-
return ret;
664-
665-
nominal_freq = cppc_perf.nominal_freq;
666-
nominal_perf = READ_ONCE(cpudata->nominal_perf);
667-
668-
lowest_nonlinear_perf = cppc_perf.lowest_nonlinear_perf;
669-
670-
lowest_nonlinear_ratio = div_u64(lowest_nonlinear_perf << SCHED_CAPACITY_SHIFT,
671-
nominal_perf);
672-
673-
lowest_nonlinear_freq = nominal_freq * lowest_nonlinear_ratio >> SCHED_CAPACITY_SHIFT;
674-
675-
/* Switch to khz */
676-
return lowest_nonlinear_freq * 1000;
624+
return READ_ONCE(cpudata->lowest_nonlinear_freq);
677625
}
678626

679627
static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
@@ -828,6 +776,53 @@ static void amd_pstate_update_limits(unsigned int cpu)
828776
mutex_unlock(&amd_pstate_driver_lock);
829777
}
830778

779+
/**
780+
* amd_pstate_init_freq: Initialize the max_freq, min_freq,
781+
* nominal_freq and lowest_nonlinear_freq for
782+
* the @cpudata object.
783+
*
784+
* Requires: highest_perf, lowest_perf, nominal_perf and
785+
* lowest_nonlinear_perf members of @cpudata to be
786+
* initialized.
787+
*
788+
* Returns 0 on success, non-zero value on failure.
789+
*/
790+
static int amd_pstate_init_freq(struct amd_cpudata *cpudata)
791+
{
792+
int ret;
793+
u32 min_freq;
794+
u32 highest_perf, max_freq;
795+
u32 nominal_perf, nominal_freq;
796+
u32 lowest_nonlinear_perf, lowest_nonlinear_freq;
797+
u32 boost_ratio, lowest_nonlinear_ratio;
798+
struct cppc_perf_caps cppc_perf;
799+
800+
801+
ret = cppc_get_perf_caps(cpudata->cpu, &cppc_perf);
802+
if (ret)
803+
return ret;
804+
805+
min_freq = cppc_perf.lowest_freq * 1000;
806+
nominal_freq = cppc_perf.nominal_freq;
807+
nominal_perf = READ_ONCE(cpudata->nominal_perf);
808+
809+
highest_perf = READ_ONCE(cpudata->highest_perf);
810+
boost_ratio = div_u64(highest_perf << SCHED_CAPACITY_SHIFT, nominal_perf);
811+
max_freq = (nominal_freq * boost_ratio >> SCHED_CAPACITY_SHIFT) * 1000;
812+
813+
lowest_nonlinear_perf = READ_ONCE(cpudata->lowest_nonlinear_perf);
814+
lowest_nonlinear_ratio = div_u64(lowest_nonlinear_perf << SCHED_CAPACITY_SHIFT,
815+
nominal_perf);
816+
lowest_nonlinear_freq = (nominal_freq * lowest_nonlinear_ratio >> SCHED_CAPACITY_SHIFT) * 1000;
817+
818+
WRITE_ONCE(cpudata->min_freq, min_freq);
819+
WRITE_ONCE(cpudata->lowest_nonlinear_freq, lowest_nonlinear_freq);
820+
WRITE_ONCE(cpudata->nominal_freq, nominal_freq);
821+
WRITE_ONCE(cpudata->max_freq, max_freq);
822+
823+
return 0;
824+
}
825+
831826
static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
832827
{
833828
int min_freq, max_freq, nominal_freq, lowest_nonlinear_freq, ret;
@@ -855,6 +850,10 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
855850
if (ret)
856851
goto free_cpudata1;
857852

853+
ret = amd_pstate_init_freq(cpudata);
854+
if (ret)
855+
goto free_cpudata1;
856+
858857
min_freq = amd_get_min_freq(cpudata);
859858
max_freq = amd_get_max_freq(cpudata);
860859
nominal_freq = amd_get_nominal_freq(cpudata);
@@ -896,13 +895,8 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
896895
goto free_cpudata2;
897896
}
898897

899-
/* Initial processor data capability frequencies */
900-
cpudata->max_freq = max_freq;
901-
cpudata->min_freq = min_freq;
902898
cpudata->max_limit_freq = max_freq;
903899
cpudata->min_limit_freq = min_freq;
904-
cpudata->nominal_freq = nominal_freq;
905-
cpudata->lowest_nonlinear_freq = lowest_nonlinear_freq;
906900

907901
policy->driver_data = cpudata;
908902

@@ -1317,6 +1311,10 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
13171311
if (ret)
13181312
goto free_cpudata1;
13191313

1314+
ret = amd_pstate_init_freq(cpudata);
1315+
if (ret)
1316+
goto free_cpudata1;
1317+
13201318
min_freq = amd_get_min_freq(cpudata);
13211319
max_freq = amd_get_max_freq(cpudata);
13221320
nominal_freq = amd_get_nominal_freq(cpudata);
@@ -1333,12 +1331,6 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
13331331
/* It will be updated by governor */
13341332
policy->cur = policy->cpuinfo.min_freq;
13351333

1336-
/* Initial processor data capability frequencies */
1337-
cpudata->max_freq = max_freq;
1338-
cpudata->min_freq = min_freq;
1339-
cpudata->nominal_freq = nominal_freq;
1340-
cpudata->lowest_nonlinear_freq = lowest_nonlinear_freq;
1341-
13421334
policy->driver_data = cpudata;
13431335

13441336
cpudata->epp_cached = amd_pstate_get_epp(cpudata, 0);

0 commit comments

Comments
 (0)