@@ -575,6 +575,14 @@ static int smu_v13_0_7_set_default_dpm_table(struct smu_context *smu)
575575 dpm_table );
576576 if (ret )
577577 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+ }
578586 } else {
579587 dpm_table -> count = 1 ;
580588 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,
828836 return ret ;
829837}
830838
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+
831890static int smu_v13_0_7_read_sensor (struct smu_context * smu ,
832891 enum amd_pp_sensors sensor ,
833892 void * data ,
@@ -1074,8 +1133,8 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,
10741133 (pcie_table -> pcie_lane [i ] == 5 ) ? "x12" :
10751134 (pcie_table -> pcie_lane [i ] == 6 ) ? "x16" : "" ,
10761135 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 ]) ) ?
10791138 "*" : "" );
10801139 break ;
10811140
@@ -1329,9 +1388,17 @@ static int smu_v13_0_7_populate_umd_state_clk(struct smu_context *smu)
13291388 & dpm_context -> dpm_tables .fclk_table ;
13301389 struct smu_umd_pstate_table * pstate_table =
13311390 & 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 ;
13321395
13331396 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 ;
13351402
13361403 pstate_table -> uclk_pstate .min = mem_table -> min ;
13371404 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)
13481415 pstate_table -> fclk_pstate .min = fclk_table -> min ;
13491416 pstate_table -> fclk_pstate .peak = fclk_table -> max ;
13501417
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 ;
13571424 pstate_table -> socclk_pstate .standard = soc_table -> min ;
13581425 pstate_table -> vclk_pstate .standard = vclk_table -> min ;
13591426 pstate_table -> dclk_pstate .standard = dclk_table -> min ;
@@ -1676,7 +1743,7 @@ static const struct pptable_funcs smu_v13_0_7_ppt_funcs = {
16761743 .dpm_set_jpeg_enable = smu_v13_0_set_jpeg_enable ,
16771744 .init_pptable_microcode = smu_v13_0_init_pptable_microcode ,
16781745 .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 ,
16801747 .get_vbios_bootup_values = smu_v13_0_get_vbios_bootup_values ,
16811748 .read_sensor = smu_v13_0_7_read_sensor ,
16821749 .feature_is_enabled = smu_cmn_feature_is_enabled ,
0 commit comments