@@ -67,6 +67,7 @@ static struct cpufreq_driver amd_pstate_epp_driver;
67
67
static int cppc_state = AMD_PSTATE_UNDEFINED ;
68
68
static bool cppc_enabled ;
69
69
static bool amd_pstate_prefcore = true;
70
+ static struct quirk_entry * quirks ;
70
71
71
72
/*
72
73
* AMD Energy Preference Performance (EPP)
@@ -111,6 +112,41 @@ static unsigned int epp_values[] = {
111
112
112
113
typedef int (* cppc_mode_transition_fn )(int );
113
114
115
+ static struct quirk_entry quirk_amd_7k62 = {
116
+ .nominal_freq = 2600 ,
117
+ .lowest_freq = 550 ,
118
+ };
119
+
120
+ static int __init dmi_matched_7k62_bios_bug (const struct dmi_system_id * dmi )
121
+ {
122
+ /**
123
+ * match the broken bios for family 17h processor support CPPC V2
124
+ * broken BIOS lack of nominal_freq and lowest_freq capabilities
125
+ * definition in ACPI tables
126
+ */
127
+ if (boot_cpu_has (X86_FEATURE_ZEN2 )) {
128
+ quirks = dmi -> driver_data ;
129
+ pr_info ("Overriding nominal and lowest frequencies for %s\n" , dmi -> ident );
130
+ return 1 ;
131
+ }
132
+
133
+ return 0 ;
134
+ }
135
+
136
+ static const struct dmi_system_id amd_pstate_quirks_table [] __initconst = {
137
+ {
138
+ .callback = dmi_matched_7k62_bios_bug ,
139
+ .ident = "AMD EPYC 7K62" ,
140
+ .matches = {
141
+ DMI_MATCH (DMI_BIOS_VERSION , "5.14" ),
142
+ DMI_MATCH (DMI_BIOS_RELEASE , "12/12/2019" ),
143
+ },
144
+ .driver_data = & quirk_amd_7k62 ,
145
+ },
146
+ {}
147
+ };
148
+ MODULE_DEVICE_TABLE (dmi , amd_pstate_quirks_table );
149
+
114
150
static inline int get_mode_idx_from_str (const char * str , size_t size )
115
151
{
116
152
int i ;
@@ -604,78 +640,6 @@ static void amd_pstate_adjust_perf(unsigned int cpu,
604
640
cpufreq_cpu_put (policy );
605
641
}
606
642
607
- static int amd_get_min_freq (struct amd_cpudata * cpudata )
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 ;
617
- }
618
-
619
- static int amd_get_max_freq (struct amd_cpudata * cpudata )
620
- {
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 ;
640
- }
641
-
642
- static int amd_get_nominal_freq (struct amd_cpudata * cpudata )
643
- {
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 ;
652
- }
653
-
654
- static int amd_get_lowest_nonlinear_freq (struct amd_cpudata * cpudata )
655
- {
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 ;
677
- }
678
-
679
643
static int amd_pstate_set_boost (struct cpufreq_policy * policy , int state )
680
644
{
681
645
struct amd_cpudata * cpudata = policy -> driver_data ;
@@ -828,9 +792,93 @@ static void amd_pstate_update_limits(unsigned int cpu)
828
792
mutex_unlock (& amd_pstate_driver_lock );
829
793
}
830
794
795
+ /*
796
+ * Get pstate transition delay time from ACPI tables that firmware set
797
+ * instead of using hardcode value directly.
798
+ */
799
+ static u32 amd_pstate_get_transition_delay_us (unsigned int cpu )
800
+ {
801
+ u32 transition_delay_ns ;
802
+
803
+ transition_delay_ns = cppc_get_transition_latency (cpu );
804
+ if (transition_delay_ns == CPUFREQ_ETERNAL )
805
+ return AMD_PSTATE_TRANSITION_DELAY ;
806
+
807
+ return transition_delay_ns / NSEC_PER_USEC ;
808
+ }
809
+
810
+ /*
811
+ * Get pstate transition latency value from ACPI tables that firmware
812
+ * set instead of using hardcode value directly.
813
+ */
814
+ static u32 amd_pstate_get_transition_latency (unsigned int cpu )
815
+ {
816
+ u32 transition_latency ;
817
+
818
+ transition_latency = cppc_get_transition_latency (cpu );
819
+ if (transition_latency == CPUFREQ_ETERNAL )
820
+ return AMD_PSTATE_TRANSITION_LATENCY ;
821
+
822
+ return transition_latency ;
823
+ }
824
+
825
+ /*
826
+ * amd_pstate_init_freq: Initialize the max_freq, min_freq,
827
+ * nominal_freq and lowest_nonlinear_freq for
828
+ * the @cpudata object.
829
+ *
830
+ * Requires: highest_perf, lowest_perf, nominal_perf and
831
+ * lowest_nonlinear_perf members of @cpudata to be
832
+ * initialized.
833
+ *
834
+ * Returns 0 on success, non-zero value on failure.
835
+ */
836
+ static int amd_pstate_init_freq (struct amd_cpudata * cpudata )
837
+ {
838
+ int ret ;
839
+ u32 min_freq ;
840
+ u32 highest_perf , max_freq ;
841
+ u32 nominal_perf , nominal_freq ;
842
+ u32 lowest_nonlinear_perf , lowest_nonlinear_freq ;
843
+ u32 boost_ratio , lowest_nonlinear_ratio ;
844
+ struct cppc_perf_caps cppc_perf ;
845
+
846
+ ret = cppc_get_perf_caps (cpudata -> cpu , & cppc_perf );
847
+ if (ret )
848
+ return ret ;
849
+
850
+ if (quirks && quirks -> lowest_freq )
851
+ min_freq = quirks -> lowest_freq * 1000 ;
852
+ else
853
+ min_freq = cppc_perf .lowest_freq * 1000 ;
854
+
855
+ if (quirks && quirks -> nominal_freq )
856
+ nominal_freq = quirks -> nominal_freq ;
857
+ else
858
+ nominal_freq = cppc_perf .nominal_freq ;
859
+
860
+ nominal_perf = READ_ONCE (cpudata -> nominal_perf );
861
+
862
+ highest_perf = READ_ONCE (cpudata -> highest_perf );
863
+ boost_ratio = div_u64 (highest_perf << SCHED_CAPACITY_SHIFT , nominal_perf );
864
+ max_freq = (nominal_freq * boost_ratio >> SCHED_CAPACITY_SHIFT ) * 1000 ;
865
+
866
+ lowest_nonlinear_perf = READ_ONCE (cpudata -> lowest_nonlinear_perf );
867
+ lowest_nonlinear_ratio = div_u64 (lowest_nonlinear_perf << SCHED_CAPACITY_SHIFT ,
868
+ nominal_perf );
869
+ lowest_nonlinear_freq = (nominal_freq * lowest_nonlinear_ratio >> SCHED_CAPACITY_SHIFT ) * 1000 ;
870
+
871
+ WRITE_ONCE (cpudata -> min_freq , min_freq );
872
+ WRITE_ONCE (cpudata -> lowest_nonlinear_freq , lowest_nonlinear_freq );
873
+ WRITE_ONCE (cpudata -> nominal_freq , nominal_freq );
874
+ WRITE_ONCE (cpudata -> max_freq , max_freq );
875
+
876
+ return 0 ;
877
+ }
878
+
831
879
static int amd_pstate_cpu_init (struct cpufreq_policy * policy )
832
880
{
833
- int min_freq , max_freq , nominal_freq , lowest_nonlinear_freq , ret ;
881
+ int min_freq , max_freq , nominal_freq , ret ;
834
882
struct device * dev ;
835
883
struct amd_cpudata * cpudata ;
836
884
@@ -855,20 +903,25 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
855
903
if (ret )
856
904
goto free_cpudata1 ;
857
905
858
- min_freq = amd_get_min_freq (cpudata );
859
- max_freq = amd_get_max_freq (cpudata );
860
- nominal_freq = amd_get_nominal_freq (cpudata );
861
- lowest_nonlinear_freq = amd_get_lowest_nonlinear_freq (cpudata );
906
+ ret = amd_pstate_init_freq (cpudata );
907
+ if (ret )
908
+ goto free_cpudata1 ;
862
909
863
- if (min_freq < 0 || max_freq < 0 || min_freq > max_freq ) {
864
- dev_err (dev , "min_freq(%d) or max_freq(%d) value is incorrect\n" ,
865
- min_freq , max_freq );
910
+ min_freq = READ_ONCE (cpudata -> min_freq );
911
+ max_freq = READ_ONCE (cpudata -> max_freq );
912
+ nominal_freq = READ_ONCE (cpudata -> nominal_freq );
913
+
914
+ if (min_freq <= 0 || max_freq <= 0 ||
915
+ nominal_freq <= 0 || min_freq > max_freq ) {
916
+ dev_err (dev ,
917
+ "min_freq(%d) or max_freq(%d) or nominal_freq (%d) value is incorrect, check _CPC in ACPI tables\n" ,
918
+ min_freq , max_freq , nominal_freq );
866
919
ret = - EINVAL ;
867
920
goto free_cpudata1 ;
868
921
}
869
922
870
- policy -> cpuinfo .transition_latency = AMD_PSTATE_TRANSITION_LATENCY ;
871
- policy -> transition_delay_us = AMD_PSTATE_TRANSITION_DELAY ;
923
+ policy -> cpuinfo .transition_latency = amd_pstate_get_transition_latency ( policy -> cpu ) ;
924
+ policy -> transition_delay_us = amd_pstate_get_transition_delay_us ( policy -> cpu ) ;
872
925
873
926
policy -> min = min_freq ;
874
927
policy -> max = max_freq ;
@@ -896,13 +949,8 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
896
949
goto free_cpudata2 ;
897
950
}
898
951
899
- /* Initial processor data capability frequencies */
900
- cpudata -> max_freq = max_freq ;
901
- cpudata -> min_freq = min_freq ;
902
952
cpudata -> max_limit_freq = max_freq ;
903
953
cpudata -> min_limit_freq = min_freq ;
904
- cpudata -> nominal_freq = nominal_freq ;
905
- cpudata -> lowest_nonlinear_freq = lowest_nonlinear_freq ;
906
954
907
955
policy -> driver_data = cpudata ;
908
956
@@ -966,7 +1014,7 @@ static ssize_t show_amd_pstate_max_freq(struct cpufreq_policy *policy,
966
1014
int max_freq ;
967
1015
struct amd_cpudata * cpudata = policy -> driver_data ;
968
1016
969
- max_freq = amd_get_max_freq (cpudata );
1017
+ max_freq = READ_ONCE (cpudata -> max_freq );
970
1018
if (max_freq < 0 )
971
1019
return max_freq ;
972
1020
@@ -979,7 +1027,7 @@ static ssize_t show_amd_pstate_lowest_nonlinear_freq(struct cpufreq_policy *poli
979
1027
int freq ;
980
1028
struct amd_cpudata * cpudata = policy -> driver_data ;
981
1029
982
- freq = amd_get_lowest_nonlinear_freq (cpudata );
1030
+ freq = READ_ONCE (cpudata -> lowest_nonlinear_freq );
983
1031
if (freq < 0 )
984
1032
return freq ;
985
1033
@@ -1290,7 +1338,7 @@ static bool amd_pstate_acpi_pm_profile_undefined(void)
1290
1338
1291
1339
static int amd_pstate_epp_cpu_init (struct cpufreq_policy * policy )
1292
1340
{
1293
- int min_freq , max_freq , nominal_freq , lowest_nonlinear_freq , ret ;
1341
+ int min_freq , max_freq , nominal_freq , ret ;
1294
1342
struct amd_cpudata * cpudata ;
1295
1343
struct device * dev ;
1296
1344
u64 value ;
@@ -1317,13 +1365,18 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
1317
1365
if (ret )
1318
1366
goto free_cpudata1 ;
1319
1367
1320
- min_freq = amd_get_min_freq (cpudata );
1321
- max_freq = amd_get_max_freq (cpudata );
1322
- nominal_freq = amd_get_nominal_freq (cpudata );
1323
- lowest_nonlinear_freq = amd_get_lowest_nonlinear_freq (cpudata );
1324
- if (min_freq < 0 || max_freq < 0 || min_freq > max_freq ) {
1325
- dev_err (dev , "min_freq(%d) or max_freq(%d) value is incorrect\n" ,
1326
- min_freq , max_freq );
1368
+ ret = amd_pstate_init_freq (cpudata );
1369
+ if (ret )
1370
+ goto free_cpudata1 ;
1371
+
1372
+ min_freq = READ_ONCE (cpudata -> min_freq );
1373
+ max_freq = READ_ONCE (cpudata -> max_freq );
1374
+ nominal_freq = READ_ONCE (cpudata -> nominal_freq );
1375
+ if (min_freq <= 0 || max_freq <= 0 ||
1376
+ nominal_freq <= 0 || min_freq > max_freq ) {
1377
+ dev_err (dev ,
1378
+ "min_freq(%d) or max_freq(%d) or nominal_freq(%d) value is incorrect, check _CPC in ACPI tables\n" ,
1379
+ min_freq , max_freq , nominal_freq );
1327
1380
ret = - EINVAL ;
1328
1381
goto free_cpudata1 ;
1329
1382
}
@@ -1333,12 +1386,6 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
1333
1386
/* It will be updated by governor */
1334
1387
policy -> cur = policy -> cpuinfo .min_freq ;
1335
1388
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
1389
policy -> driver_data = cpudata ;
1343
1390
1344
1391
cpudata -> epp_cached = amd_pstate_get_epp (cpudata , 0 );
@@ -1656,6 +1703,11 @@ static int __init amd_pstate_init(void)
1656
1703
if (cpufreq_get_current_driver ())
1657
1704
return - EEXIST ;
1658
1705
1706
+ quirks = NULL ;
1707
+
1708
+ /* check if this machine need CPPC quirks */
1709
+ dmi_check_system (amd_pstate_quirks_table );
1710
+
1659
1711
switch (cppc_state ) {
1660
1712
case AMD_PSTATE_UNDEFINED :
1661
1713
/* Disable on the following configs by default:
0 commit comments