Skip to content

Commit b64625a

Browse files
Evan Quanalexdeucher
authored andcommitted
drm/amd/pm: correct the address of Arcturus fan related registers
These registers have different address from other SMU V11 ASICs. Signed-off-by: Evan Quan <[email protected]> Reviewed-by: Lijo Lazar <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent bc08cab commit b64625a

File tree

1 file changed

+133
-5
lines changed

1 file changed

+133
-5
lines changed

drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c

Lines changed: 133 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,24 @@
8181

8282
#define smnPCIE_ESM_CTRL 0x111003D0
8383

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+
84102
static const struct cmn2asic_msg_mapping arcturus_message_map[SMU_MSG_MAX_COUNT] = {
85103
MSG_MAP(TestMessage, PPSMC_MSG_TestMessage, 0),
86104
MSG_MAP(GetSmuVersion, PPSMC_MSG_GetSmuVersion, 1),
@@ -1162,9 +1180,28 @@ static int arcturus_read_sensor(struct smu_context *smu,
11621180
return ret;
11631181
}
11641182

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+
11651198
static int arcturus_get_fan_speed_rpm(struct smu_context *smu,
11661199
uint32_t *speed)
11671200
{
1201+
struct amdgpu_device *adev = smu->adev;
1202+
uint32_t crystal_clock_freq = 2500;
1203+
uint32_t tach_status;
1204+
uint64_t tmp64;
11681205
int ret = 0;
11691206

11701207
if (!speed)
@@ -1177,14 +1214,105 @@ static int arcturus_get_fan_speed_rpm(struct smu_context *smu,
11771214
speed);
11781215
break;
11791216
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+
11821233
break;
11831234
}
11841235

11851236
return ret;
11861237
}
11871238

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+
11881316
static int arcturus_get_fan_parameters(struct smu_context *smu)
11891317
{
11901318
PPTable_t *pptable = smu->smu_table.driver_pptable;
@@ -2270,7 +2398,7 @@ static const struct pptable_funcs arcturus_ppt_funcs = {
22702398
.print_clk_levels = arcturus_print_clk_levels,
22712399
.force_clk_levels = arcturus_force_clk_levels,
22722400
.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,
22742402
.get_fan_speed_rpm = arcturus_get_fan_speed_rpm,
22752403
.get_power_profile_mode = arcturus_get_power_profile_mode,
22762404
.set_power_profile_mode = arcturus_set_power_profile_mode,
@@ -2316,8 +2444,8 @@ static const struct pptable_funcs arcturus_ppt_funcs = {
23162444
.display_clock_voltage_request = smu_v11_0_display_clock_voltage_request,
23172445
.get_fan_control_mode = smu_v11_0_get_fan_control_mode,
23182446
.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,
23212449
.set_xgmi_pstate = smu_v11_0_set_xgmi_pstate,
23222450
.gfx_off_control = smu_v11_0_gfx_off_control,
23232451
.register_irq_handler = smu_v11_0_register_irq_handler,

0 commit comments

Comments
 (0)