PS5 Slim (CFI-2015): autoservo table never uploaded and boot target temp does not take — console runs 11.7 C hotter than intended #32
Labels
No labels
bug
documentation
duplicate
enhancement
good first issue
help wanted
invalid
question
wontfix
No milestone
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
gh-ps5-linux/ps5-linux-patches#32
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
On a PS5 Slim (CFI-2015 B01X) the fan autoservo table is never uploaded, and the
boot-time target temperature write reports success but does not take effect. The
console ends up running with an EMC fan setpoint of 91 °C instead of the
intended 80 °C.
Measured cost: 11.7 °C mean / 14.2 °C peak under real game load. Peak
temperature was 94.25 °C against a Zen 2 TjMax of 95 °C — i.e. 0.75 °C of
headroom.
Setting the setpoint by hand via the existing
target_tempsysfs attributefixes it completely and costs nothing in performance.
Environment
linux-ps57.1.3-1miafork (git.etawen.dev)k10temp/ Tctl (the only temperature sensor present; no SMU)Boot log:
Bug 1 — GDDR6 revision is decoded without a nibble mask
In
icc_fan_update_autoservo_param():The board is identified correctly as
D-Eiger/Denali(board_id decoding is fine— it uses
be64_to_cpu). The vendor nibble is also correct. Only the revisionfails to match, so control reaches
goto not_updatedand the autoservo table isnever uploaded.
Every revision the match table tests against is a single nibble (0, 1, 2, 8, 9),
and the vendor field is masked to a nibble. Masked the same way,
0xb9 & 0xfis9 — and
D-Eiger/Denali+ Samsung + revision 9 maps toautoservo_param_d_eiger_denali_samsung_d1z, which already exists in the tree.Equivalently, the field may be a single byte at
0x1184(0x91→ vendor 1,revision 9) and
readwis pulling in an unrelated neighbouring byte. Bothreadings give revision 9.
Caveat, stated honestly: I tested this. I uploaded
autoservo_param_d_eiger_denali_samsung_d1zdirectly via the exportedicc_fan_update_param()from an out-of-tree module. The EMC accepted it(returned 0) but there was no measurable thermal change — a controlled A/B
against an otherwise identical run gave an identical 86.51 °C mean. So please
treat the missing mask as a hypothesis rather than a confirmed fix. The table
genuinely is never uploaded, which seems worth fixing regardless, but it is not
what was causing the temperature problem.
Note also that on phat consoles the unmasked shift evidently works, so bits 8-11
must be zero there and are
0xbhere. Either those bits are a new field on Slimor the layout moved — someone with the bootparam layout can settle this
instantly.
Secondary: the failure is invisible
icc_fan_update_autoservo_param()returns 0 on thenot_updatedpath, sothis in
ps5_fan_probe()never fires:A complete failure to configure the fan is reported as success. Only the
pr_info("FanServo: Not update\n")hints at it.Bug 2 — boot-time
fan_set_target_temp()reports success but does not takeThis is the one that costs the 11.7 °C.
This returns success — there is no
boot target temp set failedanywhere indmesg — and yet:
The EMC holds 91 °C and does so accurately. All the "the fan doesn't work"
symptoms on this console were actually a working servo tracking a setpoint
11 °C higher than the driver asked for.
Runtime writes to the same attribute do work. 91 → 75 → 60 → 75 all stuck
and all took effect within seconds, with the fan audibly responding. So the ICC
curset path is functional; something about boot time is not. Possibly ordering —
this runs immediately after the autoservo step, which had just failed.
Measurements
Three runs of the same game (007 First Light), same chapter section, same
settings (1440p, FSR Quality, all Low), boost ON, 2 Hz sampling. The only
variable is the fan setpoint.
target_tempRun C's median landed on exactly 75.00 — the servo tracks its setpoint
precisely once it has the right one.
Frametimes were statistically unchanged across all three (median 17.6 / 17.2 /
17.9 ms; >100 ms stalls per minute 0.72 / 0.88 / 0.64), so the 94 °C peaks were
not causing HTC throttling and the improvement is free.
Note run A vs run B: uploading the autoservo table changed nothing. Run B vs
run C is the meaningful comparison.
Suggested fixes
gddr6_revision = (gddr6_id >> 4) & 0xf;(orreadb). Offered as a hypothesis; see the caveat above.icc_fan_update_autoservo_param()return an error on the
not_updatedpath so the existingdev_warnfires,and verify the target-temp write by reading it back.
sticks later at runtime.
Documentation gap
/sys/devices/platform/ps5-fan/target_tempis the only fan interface on thisconsole that works, and it is undocumented — it is not mentioned in
ps5_control's usage text or in the ps5-linux guide. Users reach forps5_control --fan, which is a silent no-op here, and reasonably conclude thefan cannot be controlled at all. I spent two days on that conclusion before
finding this attribute.
Documenting it, and/or adding a
ps5_control --target-temp <celsius>wrapper,would likely help a lot of Slim owners. (The
ps5_control --fanno-op is aseparate issue against
ps5-linux-tools.)Workaround for other Slim owners
Takes effect immediately, does not persist across reboot. Lower is cooler and
louder; on this console the fan saturates around a 75 °C target under heavy
load (peaks reached 80 °C), so ~75 is roughly the practical floor.
Userspace counterpart filed as ps5-linux/ps5-linux-tools#7 —
ps5_control --fansilently reporting success, plus a request to exposetarget_tempfrom the tool.