Skip to content

Commit 55682a8

Browse files
timhuang-amdalexdeucher
authored andcommitted
drm/amd/pm: enable more Pstates profile levels for SMU v13.0.4
This patch enables following UMD stable Pstates profile levels for power_dpm_force_performance_level interface. - profile_peak - profile_min_mclk - profile_min_sclk - profile_standard Signed-off-by: Tim Huang <Tim.Huang@amd.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Reviewed-by: Yifan Zhang <yifan1.zhang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 2d0ee64 commit 55682a8

1 file changed

Lines changed: 53 additions & 1 deletion

File tree

drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@
5454

5555
#define FEATURE_MASK(feature) (1ULL << feature)
5656

57+
#define SMU_13_0_4_UMD_PSTATE_GFXCLK 938
58+
#define SMU_13_0_4_UMD_PSTATE_SOCCLK 938
59+
#define SMU_13_0_4_UMD_PSTATE_FCLK 1875
60+
5761
#define SMC_DPM_FEATURE ( \
5862
FEATURE_MASK(FEATURE_CCLK_DPM_BIT) | \
5963
FEATURE_MASK(FEATURE_VCN_DPM_BIT) | \
@@ -908,6 +912,50 @@ static int smu_v13_0_4_force_clk_levels(struct smu_context *smu,
908912
return ret;
909913
}
910914

915+
static int smu_v13_0_4_get_dpm_profile_freq(struct smu_context *smu,
916+
enum amd_dpm_forced_level level,
917+
enum smu_clk_type clk_type,
918+
uint32_t *min_clk,
919+
uint32_t *max_clk)
920+
{
921+
int ret = 0;
922+
uint32_t clk_limit = 0;
923+
924+
switch (clk_type) {
925+
case SMU_GFXCLK:
926+
case SMU_SCLK:
927+
clk_limit = SMU_13_0_4_UMD_PSTATE_GFXCLK;
928+
if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK)
929+
smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_SCLK, NULL, &clk_limit);
930+
else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK)
931+
smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_SCLK, &clk_limit, NULL);
932+
break;
933+
case SMU_SOCCLK:
934+
clk_limit = SMU_13_0_4_UMD_PSTATE_SOCCLK;
935+
if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK)
936+
smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_SOCCLK, NULL, &clk_limit);
937+
break;
938+
case SMU_FCLK:
939+
clk_limit = SMU_13_0_4_UMD_PSTATE_FCLK;
940+
if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK)
941+
smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_FCLK, NULL, &clk_limit);
942+
else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK)
943+
smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_FCLK, &clk_limit, NULL);
944+
break;
945+
case SMU_VCLK:
946+
smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_VCLK, NULL, &clk_limit);
947+
break;
948+
case SMU_DCLK:
949+
smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_DCLK, NULL, &clk_limit);
950+
break;
951+
default:
952+
ret = -EINVAL;
953+
break;
954+
}
955+
*min_clk = *max_clk = clk_limit;
956+
return ret;
957+
}
958+
911959
static int smu_v13_0_4_set_performance_level(struct smu_context *smu,
912960
enum amd_dpm_forced_level level)
913961
{
@@ -955,7 +1003,11 @@ static int smu_v13_0_4_set_performance_level(struct smu_context *smu,
9551003
case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK:
9561004
case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK:
9571005
case AMD_DPM_FORCED_LEVEL_PROFILE_PEAK:
958-
/* Temporarily do nothing since the optimal clocks haven't been provided yet */
1006+
smu_v13_0_4_get_dpm_profile_freq(smu, level, SMU_SCLK, &sclk_min, &sclk_max);
1007+
smu_v13_0_4_get_dpm_profile_freq(smu, level, SMU_FCLK, &fclk_min, &fclk_max);
1008+
smu_v13_0_4_get_dpm_profile_freq(smu, level, SMU_SOCCLK, &socclk_min, &socclk_max);
1009+
smu_v13_0_4_get_dpm_profile_freq(smu, level, SMU_VCLK, &vclk_min, &vclk_max);
1010+
smu_v13_0_4_get_dpm_profile_freq(smu, level, SMU_DCLK, &dclk_min, &dclk_max);
9591011
break;
9601012
case AMD_DPM_FORCED_LEVEL_MANUAL:
9611013
case AMD_DPM_FORCED_LEVEL_PROFILE_EXIT:

0 commit comments

Comments
 (0)