@@ -575,6 +575,14 @@ static int smu_v13_0_7_set_default_dpm_table(struct smu_context *smu)
575
575
dpm_table );
576
576
if (ret )
577
577
return ret ;
578
+
579
+ if (skutable -> DriverReportedClocks .GameClockAc &&
580
+ (dpm_table -> dpm_levels [dpm_table -> count - 1 ].value >
581
+ skutable -> DriverReportedClocks .GameClockAc )) {
582
+ dpm_table -> dpm_levels [dpm_table -> count - 1 ].value =
583
+ skutable -> DriverReportedClocks .GameClockAc ;
584
+ dpm_table -> max = skutable -> DriverReportedClocks .GameClockAc ;
585
+ }
578
586
} else {
579
587
dpm_table -> count = 1 ;
580
588
dpm_table -> dpm_levels [0 ].value = smu -> smu_table .boot_values .gfxclk / 100 ;
@@ -828,6 +836,57 @@ static int smu_v13_0_7_get_smu_metrics_data(struct smu_context *smu,
828
836
return ret ;
829
837
}
830
838
839
+ static int smu_v13_0_7_get_dpm_ultimate_freq (struct smu_context * smu ,
840
+ enum smu_clk_type clk_type ,
841
+ uint32_t * min ,
842
+ uint32_t * max )
843
+ {
844
+ struct smu_13_0_dpm_context * dpm_context =
845
+ smu -> smu_dpm .dpm_context ;
846
+ struct smu_13_0_dpm_table * dpm_table ;
847
+
848
+ switch (clk_type ) {
849
+ case SMU_MCLK :
850
+ case SMU_UCLK :
851
+ /* uclk dpm table */
852
+ dpm_table = & dpm_context -> dpm_tables .uclk_table ;
853
+ break ;
854
+ case SMU_GFXCLK :
855
+ case SMU_SCLK :
856
+ /* gfxclk dpm table */
857
+ dpm_table = & dpm_context -> dpm_tables .gfx_table ;
858
+ break ;
859
+ case SMU_SOCCLK :
860
+ /* socclk dpm table */
861
+ dpm_table = & dpm_context -> dpm_tables .soc_table ;
862
+ break ;
863
+ case SMU_FCLK :
864
+ /* fclk dpm table */
865
+ dpm_table = & dpm_context -> dpm_tables .fclk_table ;
866
+ break ;
867
+ case SMU_VCLK :
868
+ case SMU_VCLK1 :
869
+ /* vclk dpm table */
870
+ dpm_table = & dpm_context -> dpm_tables .vclk_table ;
871
+ break ;
872
+ case SMU_DCLK :
873
+ case SMU_DCLK1 :
874
+ /* dclk dpm table */
875
+ dpm_table = & dpm_context -> dpm_tables .dclk_table ;
876
+ break ;
877
+ default :
878
+ dev_err (smu -> adev -> dev , "Unsupported clock type!\n" );
879
+ return - EINVAL ;
880
+ }
881
+
882
+ if (min )
883
+ * min = dpm_table -> min ;
884
+ if (max )
885
+ * max = dpm_table -> max ;
886
+
887
+ return 0 ;
888
+ }
889
+
831
890
static int smu_v13_0_7_read_sensor (struct smu_context * smu ,
832
891
enum amd_pp_sensors sensor ,
833
892
void * data ,
@@ -1074,8 +1133,8 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,
1074
1133
(pcie_table -> pcie_lane [i ] == 5 ) ? "x12" :
1075
1134
(pcie_table -> pcie_lane [i ] == 6 ) ? "x16" : "" ,
1076
1135
pcie_table -> clk_freq [i ],
1077
- (gen_speed == pcie_table -> pcie_gen [i ]) &&
1078
- (lane_width == pcie_table -> pcie_lane [i ]) ?
1136
+ (gen_speed == DECODE_GEN_SPEED ( pcie_table -> pcie_gen [i ]) ) &&
1137
+ (lane_width == DECODE_LANE_WIDTH ( pcie_table -> pcie_lane [i ]) ) ?
1079
1138
"*" : "" );
1080
1139
break ;
1081
1140
@@ -1329,9 +1388,17 @@ static int smu_v13_0_7_populate_umd_state_clk(struct smu_context *smu)
1329
1388
& dpm_context -> dpm_tables .fclk_table ;
1330
1389
struct smu_umd_pstate_table * pstate_table =
1331
1390
& smu -> pstate_table ;
1391
+ struct smu_table_context * table_context = & smu -> smu_table ;
1392
+ PPTable_t * pptable = table_context -> driver_pptable ;
1393
+ DriverReportedClocks_t driver_clocks =
1394
+ pptable -> SkuTable .DriverReportedClocks ;
1332
1395
1333
1396
pstate_table -> gfxclk_pstate .min = gfx_table -> min ;
1334
- pstate_table -> gfxclk_pstate .peak = gfx_table -> max ;
1397
+ if (driver_clocks .GameClockAc &&
1398
+ (driver_clocks .GameClockAc < gfx_table -> max ))
1399
+ pstate_table -> gfxclk_pstate .peak = driver_clocks .GameClockAc ;
1400
+ else
1401
+ pstate_table -> gfxclk_pstate .peak = gfx_table -> max ;
1335
1402
1336
1403
pstate_table -> uclk_pstate .min = mem_table -> min ;
1337
1404
pstate_table -> uclk_pstate .peak = mem_table -> max ;
@@ -1348,12 +1415,12 @@ static int smu_v13_0_7_populate_umd_state_clk(struct smu_context *smu)
1348
1415
pstate_table -> fclk_pstate .min = fclk_table -> min ;
1349
1416
pstate_table -> fclk_pstate .peak = fclk_table -> max ;
1350
1417
1351
- /*
1352
- * For now, just use the mininum clock frequency.
1353
- * TODO: update them when the real pstate settings available
1354
- */
1355
- pstate_table -> gfxclk_pstate .standard = gfx_table -> min ;
1356
- pstate_table -> uclk_pstate .standard = mem_table -> min ;
1418
+ if ( driver_clocks . BaseClockAc &&
1419
+ driver_clocks . BaseClockAc < gfx_table -> max )
1420
+ pstate_table -> gfxclk_pstate . standard = driver_clocks . BaseClockAc ;
1421
+ else
1422
+ pstate_table -> gfxclk_pstate .standard = gfx_table -> max ;
1423
+ pstate_table -> uclk_pstate .standard = mem_table -> max ;
1357
1424
pstate_table -> socclk_pstate .standard = soc_table -> min ;
1358
1425
pstate_table -> vclk_pstate .standard = vclk_table -> min ;
1359
1426
pstate_table -> dclk_pstate .standard = dclk_table -> min ;
@@ -1676,7 +1743,7 @@ static const struct pptable_funcs smu_v13_0_7_ppt_funcs = {
1676
1743
.dpm_set_jpeg_enable = smu_v13_0_set_jpeg_enable ,
1677
1744
.init_pptable_microcode = smu_v13_0_init_pptable_microcode ,
1678
1745
.populate_umd_state_clk = smu_v13_0_7_populate_umd_state_clk ,
1679
- .get_dpm_ultimate_freq = smu_v13_0_get_dpm_ultimate_freq ,
1746
+ .get_dpm_ultimate_freq = smu_v13_0_7_get_dpm_ultimate_freq ,
1680
1747
.get_vbios_bootup_values = smu_v13_0_get_vbios_bootup_values ,
1681
1748
.read_sensor = smu_v13_0_7_read_sensor ,
1682
1749
.feature_is_enabled = smu_cmn_feature_is_enabled ,
0 commit comments