@@ -606,74 +606,22 @@ static void amd_pstate_adjust_perf(unsigned int cpu,
606606
607607static 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
619612static 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
642617static 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
654622static 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
679627static 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+
831826static 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