Fan control
rmux has added hwmon fan curve control to both ps5-linux-patches repositories (the original and his own). The fan now adjusts its speed to the APU temperature automatically, so if your kernel is up to date, you don't need to set anything manually. The options below are for fine-tuning.
The fan is driven by the ICC's autoservo firmware. The kernel sets a target SoC temperature and the firmware ramps the fan up or down by itself to hold that temperature. There is no manual PWM or RPM control, only the target.
The kernel driver lives in drivers/ps5/fan/ (merged in ps5-linux-patches #25). The default target is 80 °C.
Sysfs interface
/sys/bus/platform/devices/ps5-fan/target_temp
Read the current target:
cat /sys/bus/platform/devices/ps5-fan/target_temp
Set a lower target for more aggressive cooling (louder, but keeps the SoC cooler under load), for example 65 °C:
echo 65 | sudo tee /sys/bus/platform/devices/ps5-fan/target_temp
The valid range is 0–100 °C. There is no need to force a fixed "max" setting: once it has a target, the servo ramps up as needed. Just pick a temperature you're happy with.
Reported idle temperatures: with the default 80 °C target, the SoC idles around 59 °C. A target of about 40 °C brings idle down to about 46 °C, but the fan is then constantly audible ("jet mode"). Going lower gives little benefit, as the servo is already close to its maximum.
ps5ctl
ps5ctl wraps the fan target (as well as the LED, buzzer and GPU clock) in a TUI, CLI and web control panel:
sudo ps5ctl --temp 65
Or use the Fan tab in sudo ps5ctl.
Standalone fan_mode kernel module
A separate, minimal alternative for benchmarking. It forces the fan into a fixed EMC mode (auto, max or min) instead of following a target temperature. It was reverse-engineered directly from the EMC ICC commands.
Build it:
make -C /lib/modules/$(uname -r)/build M=$PWD obj-m=fan_mode.o modules
Force maximum speed:
sudo insmod fan_mode.ko zone=0 fan_mode=2 ; sudo rmmod fan_mode
Return to automatic mode:
sudo insmod fan_mode.ko zone=0 fan_mode=1 ; sudo rmmod fan_mode
There is no percentage setting: the EMC only supports auto, max and min. Max is loud; testers describe it as "turbine mode".
No separate GPU temperature sensor
The CPU and GPU share one die, so there is no GPU-only temperature reading. The only value is the combined APU temperature, Tctl:
cat /sys/class/hwmon/hwmon*/temp*_label # find Tctl
cat /sys/class/hwmon/hwmon*/temp*_input # value in millidegrees Celsius
This question has come up repeatedly since early testing. Tctl is the closest available number and covers both the CPU and GPU.
Reference reading: with the GPU at its minimum clock (400 MHz, from /sys/class/devfreq/ps5-gpufreq/cur_freq), Tctl was 42.75 °C. The CPU normally idles at about 798 MHz, but an active SSH session at the time of the reading kept the cores busier (roughly 1.6–3.2 GHz).