@@ -606,74 +606,22 @@ static void amd_pstate_adjust_perf(unsigned int cpu,
606
606
607
607
static int amd_get_min_freq (struct amd_cpudata * cpudata )
608
608
{
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 );
617
610
}
618
611
619
612
static int amd_get_max_freq (struct amd_cpudata * cpudata )
620
613
{
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 );
640
615
}
641
616
642
617
static int amd_get_nominal_freq (struct amd_cpudata * cpudata )
643
618
{
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 );
652
620
}
653
621
654
622
static int amd_get_lowest_nonlinear_freq (struct amd_cpudata * cpudata )
655
623
{
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 );
677
625
}
678
626
679
627
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)
828
776
mutex_unlock (& amd_pstate_driver_lock );
829
777
}
830
778
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
+
831
826
static int amd_pstate_cpu_init (struct cpufreq_policy * policy )
832
827
{
833
828
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)
855
850
if (ret )
856
851
goto free_cpudata1 ;
857
852
853
+ ret = amd_pstate_init_freq (cpudata );
854
+ if (ret )
855
+ goto free_cpudata1 ;
856
+
858
857
min_freq = amd_get_min_freq (cpudata );
859
858
max_freq = amd_get_max_freq (cpudata );
860
859
nominal_freq = amd_get_nominal_freq (cpudata );
@@ -896,13 +895,8 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
896
895
goto free_cpudata2 ;
897
896
}
898
897
899
- /* Initial processor data capability frequencies */
900
- cpudata -> max_freq = max_freq ;
901
- cpudata -> min_freq = min_freq ;
902
898
cpudata -> max_limit_freq = max_freq ;
903
899
cpudata -> min_limit_freq = min_freq ;
904
- cpudata -> nominal_freq = nominal_freq ;
905
- cpudata -> lowest_nonlinear_freq = lowest_nonlinear_freq ;
906
900
907
901
policy -> driver_data = cpudata ;
908
902
@@ -1317,6 +1311,10 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
1317
1311
if (ret )
1318
1312
goto free_cpudata1 ;
1319
1313
1314
+ ret = amd_pstate_init_freq (cpudata );
1315
+ if (ret )
1316
+ goto free_cpudata1 ;
1317
+
1320
1318
min_freq = amd_get_min_freq (cpudata );
1321
1319
max_freq = amd_get_max_freq (cpudata );
1322
1320
nominal_freq = amd_get_nominal_freq (cpudata );
@@ -1333,12 +1331,6 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
1333
1331
/* It will be updated by governor */
1334
1332
policy -> cur = policy -> cpuinfo .min_freq ;
1335
1333
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
-
1342
1334
policy -> driver_data = cpudata ;
1343
1335
1344
1336
cpudata -> epp_cached = amd_pstate_get_epp (cpudata , 0 );
0 commit comments