81
81
82
82
#define smnPCIE_ESM_CTRL 0x111003D0
83
83
84
+ #define mmCG_FDO_CTRL0_ARCT 0x8B
85
+ #define mmCG_FDO_CTRL0_ARCT_BASE_IDX 0
86
+
87
+ #define mmCG_FDO_CTRL1_ARCT 0x8C
88
+ #define mmCG_FDO_CTRL1_ARCT_BASE_IDX 0
89
+
90
+ #define mmCG_FDO_CTRL2_ARCT 0x8D
91
+ #define mmCG_FDO_CTRL2_ARCT_BASE_IDX 0
92
+
93
+ #define mmCG_TACH_CTRL_ARCT 0x8E
94
+ #define mmCG_TACH_CTRL_ARCT_BASE_IDX 0
95
+
96
+ #define mmCG_TACH_STATUS_ARCT 0x8F
97
+ #define mmCG_TACH_STATUS_ARCT_BASE_IDX 0
98
+
99
+ #define mmCG_THERMAL_STATUS_ARCT 0x90
100
+ #define mmCG_THERMAL_STATUS_ARCT_BASE_IDX 0
101
+
84
102
static const struct cmn2asic_msg_mapping arcturus_message_map [SMU_MSG_MAX_COUNT ] = {
85
103
MSG_MAP (TestMessage , PPSMC_MSG_TestMessage , 0 ),
86
104
MSG_MAP (GetSmuVersion , PPSMC_MSG_GetSmuVersion , 1 ),
@@ -1162,9 +1180,28 @@ static int arcturus_read_sensor(struct smu_context *smu,
1162
1180
return ret ;
1163
1181
}
1164
1182
1183
+ static int arcturus_set_fan_static_mode (struct smu_context * smu ,
1184
+ uint32_t mode )
1185
+ {
1186
+ struct amdgpu_device * adev = smu -> adev ;
1187
+
1188
+ WREG32_SOC15 (THM , 0 , mmCG_FDO_CTRL2_ARCT ,
1189
+ REG_SET_FIELD (RREG32_SOC15 (THM , 0 , mmCG_FDO_CTRL2_ARCT ),
1190
+ CG_FDO_CTRL2 , TMIN , 0 ));
1191
+ WREG32_SOC15 (THM , 0 , mmCG_FDO_CTRL2_ARCT ,
1192
+ REG_SET_FIELD (RREG32_SOC15 (THM , 0 , mmCG_FDO_CTRL2_ARCT ),
1193
+ CG_FDO_CTRL2 , FDO_PWM_MODE , mode ));
1194
+
1195
+ return 0 ;
1196
+ }
1197
+
1165
1198
static int arcturus_get_fan_speed_rpm (struct smu_context * smu ,
1166
1199
uint32_t * speed )
1167
1200
{
1201
+ struct amdgpu_device * adev = smu -> adev ;
1202
+ uint32_t crystal_clock_freq = 2500 ;
1203
+ uint32_t tach_status ;
1204
+ uint64_t tmp64 ;
1168
1205
int ret = 0 ;
1169
1206
1170
1207
if (!speed )
@@ -1177,14 +1214,105 @@ static int arcturus_get_fan_speed_rpm(struct smu_context *smu,
1177
1214
speed );
1178
1215
break ;
1179
1216
default :
1180
- ret = smu_v11_0_get_fan_speed_rpm (smu ,
1181
- speed );
1217
+ /*
1218
+ * For pre Sienna Cichlid ASICs, the 0 RPM may be not correctly
1219
+ * detected via register retrieving. To workaround this, we will
1220
+ * report the fan speed as 0 RPM if user just requested such.
1221
+ */
1222
+ if ((smu -> user_dpm_profile .flags & SMU_CUSTOM_FAN_SPEED_RPM )
1223
+ && !smu -> user_dpm_profile .fan_speed_rpm ) {
1224
+ * speed = 0 ;
1225
+ return 0 ;
1226
+ }
1227
+
1228
+ tmp64 = (uint64_t )crystal_clock_freq * 60 * 10000 ;
1229
+ tach_status = RREG32_SOC15 (THM , 0 , mmCG_TACH_STATUS_ARCT );
1230
+ do_div (tmp64 , tach_status );
1231
+ * speed = (uint32_t )tmp64 ;
1232
+
1182
1233
break ;
1183
1234
}
1184
1235
1185
1236
return ret ;
1186
1237
}
1187
1238
1239
+ static int arcturus_set_fan_speed_pwm (struct smu_context * smu ,
1240
+ uint32_t speed )
1241
+ {
1242
+ struct amdgpu_device * adev = smu -> adev ;
1243
+ uint32_t duty100 , duty ;
1244
+ uint64_t tmp64 ;
1245
+
1246
+ speed = MIN (speed , 255 );
1247
+
1248
+ duty100 = REG_GET_FIELD (RREG32_SOC15 (THM , 0 , mmCG_FDO_CTRL1_ARCT ),
1249
+ CG_FDO_CTRL1 , FMAX_DUTY100 );
1250
+ if (!duty100 )
1251
+ return - EINVAL ;
1252
+
1253
+ tmp64 = (uint64_t )speed * duty100 ;
1254
+ do_div (tmp64 , 255 );
1255
+ duty = (uint32_t )tmp64 ;
1256
+
1257
+ WREG32_SOC15 (THM , 0 , mmCG_FDO_CTRL0_ARCT ,
1258
+ REG_SET_FIELD (RREG32_SOC15 (THM , 0 , mmCG_FDO_CTRL0_ARCT ),
1259
+ CG_FDO_CTRL0 , FDO_STATIC_DUTY , duty ));
1260
+
1261
+ return arcturus_set_fan_static_mode (smu , FDO_PWM_MODE_STATIC );
1262
+ }
1263
+
1264
+ static int arcturus_set_fan_speed_rpm (struct smu_context * smu ,
1265
+ uint32_t speed )
1266
+ {
1267
+ struct amdgpu_device * adev = smu -> adev ;
1268
+ /*
1269
+ * crystal_clock_freq used for fan speed rpm calculation is
1270
+ * always 25Mhz. So, hardcode it as 2500(in 10K unit).
1271
+ */
1272
+ uint32_t crystal_clock_freq = 2500 ;
1273
+ uint32_t tach_period ;
1274
+
1275
+ tach_period = 60 * crystal_clock_freq * 10000 / (8 * speed );
1276
+ WREG32_SOC15 (THM , 0 , mmCG_TACH_CTRL_ARCT ,
1277
+ REG_SET_FIELD (RREG32_SOC15 (THM , 0 , mmCG_TACH_CTRL_ARCT ),
1278
+ CG_TACH_CTRL , TARGET_PERIOD ,
1279
+ tach_period ));
1280
+
1281
+ return arcturus_set_fan_static_mode (smu , FDO_PWM_MODE_STATIC_RPM );
1282
+ }
1283
+
1284
+ static int arcturus_get_fan_speed_pwm (struct smu_context * smu ,
1285
+ uint32_t * speed )
1286
+ {
1287
+ struct amdgpu_device * adev = smu -> adev ;
1288
+ uint32_t duty100 , duty ;
1289
+ uint64_t tmp64 ;
1290
+
1291
+ /*
1292
+ * For pre Sienna Cichlid ASICs, the 0 RPM may be not correctly
1293
+ * detected via register retrieving. To workaround this, we will
1294
+ * report the fan speed as 0 PWM if user just requested such.
1295
+ */
1296
+ if ((smu -> user_dpm_profile .flags & SMU_CUSTOM_FAN_SPEED_PWM )
1297
+ && !smu -> user_dpm_profile .fan_speed_pwm ) {
1298
+ * speed = 0 ;
1299
+ return 0 ;
1300
+ }
1301
+
1302
+ duty100 = REG_GET_FIELD (RREG32_SOC15 (THM , 0 , mmCG_FDO_CTRL1_ARCT ),
1303
+ CG_FDO_CTRL1 , FMAX_DUTY100 );
1304
+ duty = REG_GET_FIELD (RREG32_SOC15 (THM , 0 , mmCG_THERMAL_STATUS_ARCT ),
1305
+ CG_THERMAL_STATUS , FDO_PWM_DUTY );
1306
+ if (!duty100 )
1307
+ return - EINVAL ;
1308
+
1309
+ tmp64 = (uint64_t )duty * 255 ;
1310
+ do_div (tmp64 , duty100 );
1311
+ * speed = MIN ((uint32_t )tmp64 , 255 );
1312
+
1313
+ return 0 ;
1314
+ }
1315
+
1188
1316
static int arcturus_get_fan_parameters (struct smu_context * smu )
1189
1317
{
1190
1318
PPTable_t * pptable = smu -> smu_table .driver_pptable ;
@@ -2270,7 +2398,7 @@ static const struct pptable_funcs arcturus_ppt_funcs = {
2270
2398
.print_clk_levels = arcturus_print_clk_levels ,
2271
2399
.force_clk_levels = arcturus_force_clk_levels ,
2272
2400
.read_sensor = arcturus_read_sensor ,
2273
- .get_fan_speed_pwm = smu_v11_0_get_fan_speed_pwm ,
2401
+ .get_fan_speed_pwm = arcturus_get_fan_speed_pwm ,
2274
2402
.get_fan_speed_rpm = arcturus_get_fan_speed_rpm ,
2275
2403
.get_power_profile_mode = arcturus_get_power_profile_mode ,
2276
2404
.set_power_profile_mode = arcturus_set_power_profile_mode ,
@@ -2316,8 +2444,8 @@ static const struct pptable_funcs arcturus_ppt_funcs = {
2316
2444
.display_clock_voltage_request = smu_v11_0_display_clock_voltage_request ,
2317
2445
.get_fan_control_mode = smu_v11_0_get_fan_control_mode ,
2318
2446
.set_fan_control_mode = smu_v11_0_set_fan_control_mode ,
2319
- .set_fan_speed_pwm = smu_v11_0_set_fan_speed_pwm ,
2320
- .set_fan_speed_rpm = smu_v11_0_set_fan_speed_rpm ,
2447
+ .set_fan_speed_pwm = arcturus_set_fan_speed_pwm ,
2448
+ .set_fan_speed_rpm = arcturus_set_fan_speed_rpm ,
2321
2449
.set_xgmi_pstate = smu_v11_0_set_xgmi_pstate ,
2322
2450
.gfx_off_control = smu_v11_0_gfx_off_control ,
2323
2451
.register_irq_handler = smu_v11_0_register_irq_handler ,
0 commit comments