47
47
#define SMUIO_GFX_MISC_CNTL__PWR_GFXOFF_STATUS_MASK 0x00000006L
48
48
#define SMUIO_GFX_MISC_CNTL__PWR_GFXOFF_STATUS__SHIFT 0x1L
49
49
50
+ #define SMU_13_0_8_UMD_PSTATE_GFXCLK 533
51
+ #define SMU_13_0_8_UMD_PSTATE_SOCCLK 533
52
+ #define SMU_13_0_8_UMD_PSTATE_FCLK 800
53
+
54
+ #define SMU_13_0_1_UMD_PSTATE_GFXCLK 700
55
+ #define SMU_13_0_1_UMD_PSTATE_SOCCLK 678
56
+ #define SMU_13_0_1_UMD_PSTATE_FCLK 1800
57
+
50
58
#define FEATURE_MASK (feature ) (1ULL << feature)
51
59
#define SMC_DPM_FEATURE ( \
52
60
FEATURE_MASK(FEATURE_CCLK_DPM_BIT) | \
@@ -957,6 +965,9 @@ static int yellow_carp_set_soft_freq_limited_range(struct smu_context *smu,
957
965
uint32_t max )
958
966
{
959
967
enum smu_message_type msg_set_min , msg_set_max ;
968
+ uint32_t min_clk = min ;
969
+ uint32_t max_clk = max ;
970
+
960
971
int ret = 0 ;
961
972
962
973
if (!yellow_carp_clk_dpm_is_enabled (smu , clk_type ))
@@ -985,24 +996,67 @@ static int yellow_carp_set_soft_freq_limited_range(struct smu_context *smu,
985
996
return - EINVAL ;
986
997
}
987
998
988
- ret = smu_cmn_send_smc_msg_with_param (smu , msg_set_min , min , NULL );
999
+ if (clk_type == SMU_VCLK ) {
1000
+ min_clk = min << SMU_13_VCLK_SHIFT ;
1001
+ max_clk = max << SMU_13_VCLK_SHIFT ;
1002
+ }
1003
+
1004
+ ret = smu_cmn_send_smc_msg_with_param (smu , msg_set_min , min_clk , NULL );
1005
+
989
1006
if (ret )
990
1007
goto out ;
991
1008
992
- ret = smu_cmn_send_smc_msg_with_param (smu , msg_set_max , max , NULL );
1009
+ ret = smu_cmn_send_smc_msg_with_param (smu , msg_set_max , max_clk , NULL );
993
1010
if (ret )
994
1011
goto out ;
995
1012
996
1013
out :
997
1014
return ret ;
998
1015
}
999
1016
1017
+ static uint32_t yellow_carp_get_umd_pstate_clk_default (struct smu_context * smu ,
1018
+ enum smu_clk_type clk_type )
1019
+ {
1020
+ uint32_t clk_limit = 0 ;
1021
+ struct amdgpu_device * adev = smu -> adev ;
1022
+
1023
+ switch (clk_type ) {
1024
+ case SMU_GFXCLK :
1025
+ case SMU_SCLK :
1026
+ if ((adev -> ip_versions [MP1_HWIP ][0 ]) == IP_VERSION (13 , 0 , 8 ))
1027
+ clk_limit = SMU_13_0_8_UMD_PSTATE_GFXCLK ;
1028
+ if ((adev -> ip_versions [MP1_HWIP ][0 ]) == IP_VERSION (13 , 0 , 1 ) ||
1029
+ (adev -> ip_versions [MP1_HWIP ][0 ]) == IP_VERSION (13 , 0 , 3 ))
1030
+ clk_limit = SMU_13_0_1_UMD_PSTATE_GFXCLK ;
1031
+ break ;
1032
+ case SMU_SOCCLK :
1033
+ if ((adev -> ip_versions [MP1_HWIP ][0 ]) == IP_VERSION (13 , 0 , 8 ))
1034
+ clk_limit = SMU_13_0_8_UMD_PSTATE_SOCCLK ;
1035
+ if ((adev -> ip_versions [MP1_HWIP ][0 ]) == IP_VERSION (13 , 0 , 1 ) ||
1036
+ (adev -> ip_versions [MP1_HWIP ][0 ]) == IP_VERSION (13 , 0 , 3 ))
1037
+ clk_limit = SMU_13_0_1_UMD_PSTATE_SOCCLK ;
1038
+ break ;
1039
+ case SMU_FCLK :
1040
+ if ((adev -> ip_versions [MP1_HWIP ][0 ]) == IP_VERSION (13 , 0 , 8 ))
1041
+ clk_limit = SMU_13_0_8_UMD_PSTATE_FCLK ;
1042
+ if ((adev -> ip_versions [MP1_HWIP ][0 ]) == IP_VERSION (13 , 0 , 1 ) ||
1043
+ (adev -> ip_versions [MP1_HWIP ][0 ]) == IP_VERSION (13 , 0 , 3 ))
1044
+ clk_limit = SMU_13_0_1_UMD_PSTATE_FCLK ;
1045
+ break ;
1046
+ default :
1047
+ break ;
1048
+ }
1049
+
1050
+ return clk_limit ;
1051
+ }
1052
+
1000
1053
static int yellow_carp_print_clk_levels (struct smu_context * smu ,
1001
1054
enum smu_clk_type clk_type , char * buf )
1002
1055
{
1003
1056
int i , idx , size = 0 , ret = 0 ;
1004
1057
uint32_t cur_value = 0 , value = 0 , count = 0 ;
1005
1058
uint32_t min , max ;
1059
+ uint32_t clk_limit = 0 ;
1006
1060
1007
1061
smu_cmn_get_sysfs_buf (& buf , & size );
1008
1062
@@ -1044,6 +1098,7 @@ static int yellow_carp_print_clk_levels(struct smu_context *smu,
1044
1098
break ;
1045
1099
case SMU_GFXCLK :
1046
1100
case SMU_SCLK :
1101
+ clk_limit = yellow_carp_get_umd_pstate_clk_default (smu , clk_type );
1047
1102
ret = yellow_carp_get_current_clk_freq (smu , clk_type , & cur_value );
1048
1103
if (ret )
1049
1104
goto print_clk_out ;
@@ -1058,7 +1113,7 @@ static int yellow_carp_print_clk_levels(struct smu_context *smu,
1058
1113
size += sysfs_emit_at (buf , size , "0: %uMhz %s\n" , min ,
1059
1114
i == 0 ? "*" : "" );
1060
1115
size += sysfs_emit_at (buf , size , "1: %uMhz %s\n" ,
1061
- i == 1 ? cur_value : YELLOW_CARP_UMD_PSTATE_GFXCLK ,
1116
+ i == 1 ? cur_value : clk_limit ,
1062
1117
i == 1 ? "*" : "" );
1063
1118
size += sysfs_emit_at (buf , size , "2: %uMhz %s\n" , max ,
1064
1119
i == 2 ? "*" : "" );
@@ -1107,42 +1162,102 @@ static int yellow_carp_force_clk_levels(struct smu_context *smu,
1107
1162
return ret ;
1108
1163
}
1109
1164
1165
+ static int yellow_carp_get_dpm_profile_freq (struct smu_context * smu ,
1166
+ enum amd_dpm_forced_level level ,
1167
+ enum smu_clk_type clk_type ,
1168
+ uint32_t * min_clk ,
1169
+ uint32_t * max_clk )
1170
+ {
1171
+ int ret = 0 ;
1172
+ uint32_t clk_limit = 0 ;
1173
+
1174
+ clk_limit = yellow_carp_get_umd_pstate_clk_default (smu , clk_type );
1175
+
1176
+ switch (clk_type ) {
1177
+ case SMU_GFXCLK :
1178
+ case SMU_SCLK :
1179
+ if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK )
1180
+ yellow_carp_get_dpm_ultimate_freq (smu , SMU_SCLK , NULL , & clk_limit );
1181
+ else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK )
1182
+ yellow_carp_get_dpm_ultimate_freq (smu , SMU_SCLK , & clk_limit , NULL );
1183
+ break ;
1184
+ case SMU_SOCCLK :
1185
+ if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK )
1186
+ yellow_carp_get_dpm_ultimate_freq (smu , SMU_SOCCLK , NULL , & clk_limit );
1187
+ break ;
1188
+ case SMU_FCLK :
1189
+ if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK )
1190
+ yellow_carp_get_dpm_ultimate_freq (smu , SMU_FCLK , NULL , & clk_limit );
1191
+ else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK )
1192
+ yellow_carp_get_dpm_ultimate_freq (smu , SMU_FCLK , & clk_limit , NULL );
1193
+ break ;
1194
+ case SMU_VCLK :
1195
+ yellow_carp_get_dpm_ultimate_freq (smu , SMU_VCLK , NULL , & clk_limit );
1196
+ break ;
1197
+ case SMU_DCLK :
1198
+ yellow_carp_get_dpm_ultimate_freq (smu , SMU_DCLK , NULL , & clk_limit );
1199
+ break ;
1200
+ default :
1201
+ ret = - EINVAL ;
1202
+ break ;
1203
+ }
1204
+ * min_clk = * max_clk = clk_limit ;
1205
+ return ret ;
1206
+ }
1207
+
1110
1208
static int yellow_carp_set_performance_level (struct smu_context * smu ,
1111
1209
enum amd_dpm_forced_level level )
1112
1210
{
1113
1211
struct amdgpu_device * adev = smu -> adev ;
1114
1212
uint32_t sclk_min = 0 , sclk_max = 0 ;
1115
1213
uint32_t fclk_min = 0 , fclk_max = 0 ;
1116
1214
uint32_t socclk_min = 0 , socclk_max = 0 ;
1215
+ uint32_t vclk_min = 0 , vclk_max = 0 ;
1216
+ uint32_t dclk_min = 0 , dclk_max = 0 ;
1217
+
1117
1218
int ret = 0 ;
1118
1219
1119
1220
switch (level ) {
1120
1221
case AMD_DPM_FORCED_LEVEL_HIGH :
1121
1222
yellow_carp_get_dpm_ultimate_freq (smu , SMU_SCLK , NULL , & sclk_max );
1122
1223
yellow_carp_get_dpm_ultimate_freq (smu , SMU_FCLK , NULL , & fclk_max );
1123
1224
yellow_carp_get_dpm_ultimate_freq (smu , SMU_SOCCLK , NULL , & socclk_max );
1225
+ yellow_carp_get_dpm_ultimate_freq (smu , SMU_VCLK , NULL , & vclk_max );
1226
+ yellow_carp_get_dpm_ultimate_freq (smu , SMU_DCLK , NULL , & dclk_max );
1124
1227
sclk_min = sclk_max ;
1125
1228
fclk_min = fclk_max ;
1126
1229
socclk_min = socclk_max ;
1230
+ vclk_min = vclk_max ;
1231
+ dclk_min = dclk_max ;
1127
1232
break ;
1128
1233
case AMD_DPM_FORCED_LEVEL_LOW :
1129
1234
yellow_carp_get_dpm_ultimate_freq (smu , SMU_SCLK , & sclk_min , NULL );
1130
1235
yellow_carp_get_dpm_ultimate_freq (smu , SMU_FCLK , & fclk_min , NULL );
1131
1236
yellow_carp_get_dpm_ultimate_freq (smu , SMU_SOCCLK , & socclk_min , NULL );
1237
+ yellow_carp_get_dpm_ultimate_freq (smu , SMU_VCLK , & vclk_min , NULL );
1238
+ yellow_carp_get_dpm_ultimate_freq (smu , SMU_DCLK , & dclk_min , NULL );
1132
1239
sclk_max = sclk_min ;
1133
1240
fclk_max = fclk_min ;
1134
1241
socclk_max = socclk_min ;
1242
+ vclk_max = vclk_min ;
1243
+ dclk_max = dclk_min ;
1135
1244
break ;
1136
1245
case AMD_DPM_FORCED_LEVEL_AUTO :
1137
1246
yellow_carp_get_dpm_ultimate_freq (smu , SMU_SCLK , & sclk_min , & sclk_max );
1138
1247
yellow_carp_get_dpm_ultimate_freq (smu , SMU_FCLK , & fclk_min , & fclk_max );
1139
1248
yellow_carp_get_dpm_ultimate_freq (smu , SMU_SOCCLK , & socclk_min , & socclk_max );
1249
+ yellow_carp_get_dpm_ultimate_freq (smu , SMU_VCLK , & vclk_min , & vclk_max );
1250
+ yellow_carp_get_dpm_ultimate_freq (smu , SMU_DCLK , & dclk_min , & dclk_max );
1140
1251
break ;
1141
1252
case AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD :
1142
1253
case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK :
1143
1254
case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK :
1144
1255
case AMD_DPM_FORCED_LEVEL_PROFILE_PEAK :
1145
- /* Temporarily do nothing since the optimal clocks haven't been provided yet */
1256
+ yellow_carp_get_dpm_profile_freq (smu , level , SMU_SCLK , & sclk_min , & sclk_max );
1257
+ yellow_carp_get_dpm_profile_freq (smu , level , SMU_FCLK , & fclk_min , & fclk_max );
1258
+ yellow_carp_get_dpm_profile_freq (smu , level , SMU_SOCCLK , & socclk_min , & socclk_max );
1259
+ yellow_carp_get_dpm_profile_freq (smu , level , SMU_VCLK , & vclk_min , & vclk_max );
1260
+ yellow_carp_get_dpm_profile_freq (smu , level , SMU_DCLK , & dclk_min , & dclk_max );
1146
1261
break ;
1147
1262
case AMD_DPM_FORCED_LEVEL_MANUAL :
1148
1263
case AMD_DPM_FORCED_LEVEL_PROFILE_EXIT :
@@ -1182,6 +1297,24 @@ static int yellow_carp_set_performance_level(struct smu_context *smu,
1182
1297
return ret ;
1183
1298
}
1184
1299
1300
+ if (vclk_min && vclk_max ) {
1301
+ ret = yellow_carp_set_soft_freq_limited_range (smu ,
1302
+ SMU_VCLK ,
1303
+ vclk_min ,
1304
+ vclk_max );
1305
+ if (ret )
1306
+ return ret ;
1307
+ }
1308
+
1309
+ if (dclk_min && dclk_max ) {
1310
+ ret = yellow_carp_set_soft_freq_limited_range (smu ,
1311
+ SMU_DCLK ,
1312
+ dclk_min ,
1313
+ dclk_max );
1314
+ if (ret )
1315
+ return ret ;
1316
+ }
1317
+
1185
1318
return ret ;
1186
1319
}
1187
1320
0 commit comments