ps5_control --fan is a silent no-op on PS5 Slim; please expose target_temp #7

Open
opened 2026-08-03 17:24:33 -05:00 by BrenoRippel · 1 comment
BrenoRippel commented 2026-08-03 17:24:33 -05:00 (Migrated from github.com)

Summary

On a PS5 Slim (CFI-2015 B01X), ps5_control --fan reports success while having
no effect whatsoever. Separately, the one fan interface that does work on this
console — the target_temp sysfs attribute — is not exposed by ps5_control
at all.

Environment

Console PlayStation 5 Slim, CFI-2015 B01X, firmware 7.61
Kernel linux-ps5 7.1.3-1
Tools ps5-linux-tools, ps5_control from /usr/local/sbin
Sensor k10temp / Tctl (the only temperature sensor; no SMU on this APU)

Bug — --fan is a silent no-op

$ sudo ps5_control --fan max
Set fan to 'max'
$ echo $?
0

Exit code 0, success message printed, nothing happens. No audible change, no
temperature change, and no kernel log entry when the ioctl fires.

Controlled A/B with system load held constant at idle, 150 samples:

pattern n mean temp
1 (on) 53 70.920 °C
3 (max) 97 70.938 °C

Settled delta 0.07 °C, which is below the sensor's 0.25 °C quantization
step. The fan is not responding at all.

Likely cause

This is probably downstream of a kernel-side bug rather than a fault in
ps5_control itself. ICC_FAN_CHANGE_SERVO_PATTERN selects a pattern from the
autoservo table, and on this console that table is never populated — the boot
log shows:

FanServo: D-Eiger/Denali Unknown Vendor/Revision 0x1/0xb9
FanServo: Not update

I've filed the kernel-side detail separately against ps5-linux-patches.

Regardless of the root cause, the tool should not report success when the
ioctl has no effect.
Silent success is what led me to spend two days
concluding the fan was uncontrollable on this hardware. Even just documenting
that the pattern ioctl is a no-op when the servo table is unpopulated would
help.

Minor, related: the usage text advertises only <on|off>, but the source also
accepts max (pattern 3). Undocumented.


Feature request — expose target_temp

There is a working fan control on this console, and ps5_control doesn't
expose it:

$ cat /sys/devices/platform/ps5-fan/target_temp
91
$ echo 75 | sudo tee /sys/devices/platform/ps5-fan/target_temp

This works immediately and reliably — the fan audibly ramps and temperature
tracks the setpoint. Measured on this console with 007 First Light, same
chapter section and settings, boost ON, 2 Hz sampling:

setpoint 91 (default) setpoint 75
mean CPU temp 86.51 °C 74.80 °C
median 89.50 °C 75.00 °C
max 94.25 °C 80.00 °C
samples > 80 °C 81.3 % 0.0 %

11.7 °C on the mean, 14.2 °C on the peak, with frametimes statistically
unchanged (median 17.6 → 17.9 ms) and no clock-speed cost. The default 91 °C
setpoint leaves only 0.75 °C of headroom under the Zen 2 TjMax of 95 °C.

Suggested:

ps5_control --target-temp <celsius>    # read/write /sys/devices/platform/ps5-fan/target_temp
ps5_control --target-temp              # print current value

Since --fan is what users naturally reach for and it silently does nothing on
this hardware, having the working interface available from the same tool would
make a real difference. Right now nothing in the tooling or documentation points
to target_temp — I only found it by reading linux.patch.

## Summary On a PS5 Slim (CFI-2015 B01X), `ps5_control --fan` reports success while having no effect whatsoever. Separately, the one fan interface that *does* work on this console — the `target_temp` sysfs attribute — is not exposed by `ps5_control` at all. ## Environment | | | |---|---| | Console | PlayStation 5 Slim, CFI-2015 B01X, firmware 7.61 | | Kernel | `linux-ps5` 7.1.3-1 | | Tools | `ps5-linux-tools`, `ps5_control` from `/usr/local/sbin` | | Sensor | `k10temp` / Tctl (the only temperature sensor; no SMU on this APU) | --- ## Bug — `--fan` is a silent no-op ```console $ sudo ps5_control --fan max Set fan to 'max' $ echo $? 0 ``` Exit code 0, success message printed, nothing happens. No audible change, no temperature change, and no kernel log entry when the ioctl fires. Controlled A/B with system load held constant at idle, 150 samples: | pattern | n | mean temp | |---|---|---| | 1 (`on`) | 53 | 70.920 °C | | 3 (`max`) | 97 | 70.938 °C | Settled delta **0.07 °C**, which is below the sensor's 0.25 °C quantization step. The fan is not responding at all. ### Likely cause This is probably downstream of a kernel-side bug rather than a fault in `ps5_control` itself. `ICC_FAN_CHANGE_SERVO_PATTERN` selects a pattern from the autoservo table, and on this console that table is never populated — the boot log shows: ``` FanServo: D-Eiger/Denali Unknown Vendor/Revision 0x1/0xb9 FanServo: Not update ``` I've filed the kernel-side detail separately against `ps5-linux-patches`. Regardless of the root cause, **the tool should not report success when the ioctl has no effect.** Silent success is what led me to spend two days concluding the fan was uncontrollable on this hardware. Even just documenting that the pattern ioctl is a no-op when the servo table is unpopulated would help. Minor, related: the usage text advertises only `<on|off>`, but the source also accepts `max` (pattern 3). Undocumented. --- ## Feature request — expose `target_temp` There *is* a working fan control on this console, and `ps5_control` doesn't expose it: ```console $ cat /sys/devices/platform/ps5-fan/target_temp 91 $ echo 75 | sudo tee /sys/devices/platform/ps5-fan/target_temp ``` This works immediately and reliably — the fan audibly ramps and temperature tracks the setpoint. Measured on this console with 007 First Light, same chapter section and settings, boost ON, 2 Hz sampling: | | setpoint 91 (default) | setpoint 75 | |---|---|---| | mean CPU temp | 86.51 °C | **74.80 °C** | | median | 89.50 °C | **75.00 °C** | | max | 94.25 °C | **80.00 °C** | | samples > 80 °C | 81.3 % | **0.0 %** | 11.7 °C on the mean, 14.2 °C on the peak, with frametimes statistically unchanged (median 17.6 → 17.9 ms) and no clock-speed cost. The default 91 °C setpoint leaves only 0.75 °C of headroom under the Zen 2 TjMax of 95 °C. Suggested: ``` ps5_control --target-temp <celsius> # read/write /sys/devices/platform/ps5-fan/target_temp ps5_control --target-temp # print current value ``` Since `--fan` is what users naturally reach for and it silently does nothing on this hardware, having the working interface available from the same tool would make a real difference. Right now nothing in the tooling or documentation points to `target_temp` — I only found it by reading `linux.patch`.
BrenoRippel commented 2026-08-03 17:24:51 -05:00 (Migrated from github.com)

Kernel-side counterpart filed as ps5-linux/ps5-linux-patches#32 — that one covers why the autoservo table is never populated on this console, which is the likely root cause of the --fan no-op described above.

Kernel-side counterpart filed as ps5-linux/ps5-linux-patches#32 — that one covers why the autoservo table is never populated on this console, which is the likely root cause of the `--fan` no-op described above.
Sign in to join this conversation.
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
gh-ps5-linux/ps5-linux-tools#7
No description provided.