Skip to content

Commit 8ac1696

Browse files
Evan Quanalexdeucher
authored andcommitted
drm/amd/pm: a quick fix for "divided by zero" error
Considering Arcturus is a dedicated ASIC for computing, it will be more proper to drop the support for fan speed reading and setting. That's on the TODO list. Signed-off-by: Evan Quan <[email protected]> Reported-by: Rui Teng <[email protected]> Reviewed-by: Guchun Chen <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 36a7aee commit 8ac1696

File tree

2 files changed

+20
-9
lines changed

2 files changed

+20
-9
lines changed

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

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1227,8 +1227,12 @@ static int arcturus_get_fan_speed_rpm(struct smu_context *smu,
12271227

12281228
tmp64 = (uint64_t)crystal_clock_freq * 60 * 10000;
12291229
tach_status = RREG32_SOC15(THM, 0, mmCG_TACH_STATUS_ARCT);
1230-
do_div(tmp64, tach_status);
1231-
*speed = (uint32_t)tmp64;
1230+
if (tach_status) {
1231+
do_div(tmp64, tach_status);
1232+
*speed = (uint32_t)tmp64;
1233+
} else {
1234+
*speed = 0;
1235+
}
12321236

12331237
break;
12341238
}
@@ -1303,12 +1307,14 @@ static int arcturus_get_fan_speed_pwm(struct smu_context *smu,
13031307
CG_FDO_CTRL1, FMAX_DUTY100);
13041308
duty = REG_GET_FIELD(RREG32_SOC15(THM, 0, mmCG_THERMAL_STATUS_ARCT),
13051309
CG_THERMAL_STATUS, FDO_PWM_DUTY);
1306-
if (!duty100)
1307-
return -EINVAL;
13081310

1309-
tmp64 = (uint64_t)duty * 255;
1310-
do_div(tmp64, duty100);
1311-
*speed = MIN((uint32_t)tmp64, 255);
1311+
if (duty100) {
1312+
tmp64 = (uint64_t)duty * 255;
1313+
do_div(tmp64, duty100);
1314+
*speed = MIN((uint32_t)tmp64, 255);
1315+
} else {
1316+
*speed = 0;
1317+
}
13121318

13131319
return 0;
13141320
}

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1306,8 +1306,13 @@ int smu_v11_0_get_fan_speed_rpm(struct smu_context *smu,
13061306
tmp64 = (uint64_t)crystal_clock_freq * 60 * 10000;
13071307

13081308
tach_status = RREG32_SOC15(THM, 0, mmCG_TACH_STATUS);
1309-
do_div(tmp64, tach_status);
1310-
*speed = (uint32_t)tmp64;
1309+
if (tach_status) {
1310+
do_div(tmp64, tach_status);
1311+
*speed = (uint32_t)tmp64;
1312+
} else {
1313+
dev_warn_once(adev->dev, "Got zero output on CG_TACH_STATUS reading!\n");
1314+
*speed = 0;
1315+
}
13111316

13121317
return 0;
13131318
}

0 commit comments

Comments
 (0)