How to lock fan speed for amd gpu in Ubuntu 20.04?

5,600

Solution 1

In case anyone is interested the solution I made and the corresponding systemd service is here: redfan https://github.com/nmtitov/redfan

So far my best guess is to write the following script and keep it always running in the background:

while sleep 1; do echo 0 > /sys/class/drm/card1/device/hwmon/hwmon1/pwm1_enable; done

Every second I "disable" pwm and make fans running at max speed. The driver (or something else) restores the value, but the next second I immediately disable it again.

Solution 2

I wanted to lock fans at 80% but in a slightly different manner. I've changed nothing in /sys/class/drm/. Just

readlink -f /sys/class/drm/card1/device

, where card1 is my amd videocard.

Thus I know the path to the file I want to change.

And after that:

sudo sh -c "echo '1' > /sys/devices/pci0000:00/0000:00:03.0/0000:06:00.0/hwmon/hwmon1/pwm1_enable"
sudo sh -c "echo '200' > /sys/devices/pci0000:00/0000:00:03.0/0000:06:00.0/hwmon/hwmon1/pwm1"

Works! Ubuntu kernel 5.4

Solution 3

My config is

sinix@sinix-garage:~$ lspci -v | grep VGA
lspci: Unable to load libkmod resources: error -12
        Flags: bus master, VGA palette snoop, 66MHz, medium devsel, latency 64, NUMA node 0
01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Hawaii XT / Grenada XT [Radeon R9 290X/390X] (prog-if 00 [VGA controller])
04:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (rev e7) (prog-if 00 [VGA controller])
06:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Baffin [Radeon RX 550 640SP / RX 560/560X] (rev cf) (prog-if 00 [VGA controller])

I setup Hawai & Baffin to work with amdgpu-fan, and Ellesmere only work with redfan. That is not solution because I can't setup pwm on Ellesmere. So PC constantly frozen with this solution. I know that is problem on relation between amdgpu-20.45 and kernel 5.4.65.

So I decide to experiment with diferent kernels, and I find the right one.

https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.19.180/

After install 4.19, Ellesmere boot with pwm1_enable=2 but finaly they listen "echo" to 1, and all other daemons work, like amdgpu-fan.

So "matrix" in /etc/amdgpu-fan-config.yaml work the job.

GPU0 t=66°C fan 67% power 134.09W, GPU1 t=54°C fan 56% power 104.09W, GPU2 t=51°C fan 53% power 47.23W. Total power: 285.41W
Share:
5,600

Related videos on Youtube

Nik
Author by

Nik

Updated on September 18, 2022

Comments

  • Nik
    Nik over 1 year

    I'm trying to lock RPM of my AMD Radeon videocard fans at the full speed:

    echo 1 > /sys/class/hwmon/hwmon1/pwm1_enable
    echo 255 > /sys/class/hwmon/hwmon1/pwm1
    

    What I have tried so far

    Obviously, it doesn't work due to missing permissions (even with sudo/root) because it is /sys:

    $ sudo su
    $ echo 255 > /sys/class/drm/card1/device/hwmon/hwmon1/pwm1
    bash: echo: write error: Invalid argument
    

    I have also tried sysfs config to edit these params but it didn't work:

    $ cat /etc/sysfs.conf
    class/drm/card1/device/hwmon/hwmon1/pwm1 = 255
    class/drm/card1/device/hwmon/hwmon1/pwm1_enable = 1
    

    echo 5 | sudo tee ... also doesn't work.

    Neither does sudo sh -c:

    sudo sh -c 'echo 225 > /sys/class/drm/card1/device/hwmon/hwmon1/pwm1'
    sh: 1: echo: echo: I/O error
    

    Archilinux Wiki states it should be possible though https://wiki.archlinux.org/index.php/fan_speed_control#Configuration_of_manual_control They edit values directly with echo and looks like it works for them.

    Another guide also recommends configuring fans this way https://linuxconfig.org/overclock-your-radeon-gpu-with-amdgpu

    Python amdgpu-fan package also doesn't work for me.

    sudo fancontrol doesn't work as well:

    $ sudo fancontrol
    Loading configuration from /etc/fancontrol ...
    
    Common settings:
      INTERVAL=10
    
    Settings for hwmon1/pwm1:
      Depends on hwmon1/temp1_input
      Controls 
      MINTEMP=10
      MAXTEMP=60
      MINSTART=50
      MINSTOP=0
      MINPWM=0
      MAXPWM=255
      AVERAGE=1
    
    Enabling PWM on fans...
    Starting automatic fan control...
    /usr/sbin/fancontrol: line 649: echo: write error: Invalid argument
    Error writing PWM value to /sys/class/hwmon/hwmon1/pwm1
    Aborting, restoring fans...
    Verify fans have returned to full speed
    

    Daemon (service) also doesn't work:

    fancontrol[1877]:   MAXPWM=255
    fancontrol[1877]:   AVERAGE=1
    fancontrol[1877]: Enabling PWM on fans...
    fancontrol[1877]: Starting automatic fan control...
    fancontrol[1877]: /usr/sbin/fancontrol: line 649: echo: write error: Invalid argument
    fancontrol[1877]: Error writing PWM value to /sys/class/hwmon/hwmon1/pwm1
    fancontrol[1877]: Aborting, restoring fans...
    fancontrol[1877]: Verify fans have returned to full speed
    systemd[1]: fancontrol.service: Main process exited, code=exited, status=1/FAILURE
    systemd[1]: fancontrol.service: Failed with result 'exit-code'.
    

    To sum up: seems that I can't edit /sys/ amdgpu-related entries at all

    Part 2

    It seems that there has to be another way around, like some amdgpu config or something like that. Maybe override kernel-defined values during boot?

    In Windows, it's possible to tune fans directly from the AMD Radeon driver GUI app.

    I don't want fancy curves, I'm simply trying to force lock static RPM (full-on mode). I'm using amdgpu-pro drivers, Ubuntu 20.04. I'd like to avoid using scripts like fancontrol

    The question itself

    I wonder if that's possible just to set pwm1_enable to 1 and pwm1 to 255? Looks like the suggested method should be working, but Ubuntu 20.04 security limitations are more restrictive than other distros' ones.

    update This thing works! But only for 1-2 seconds, after that, fans go back to system-defined speed https://github.com/DominiLux/amdgpu-pro-fans/blob/master/amdgpu-pro-fans.sh

    update 2

    Disabling pwm works for about 1-2 seconds. echo 0 > /sys/class/hwmon/hwmon1/pwm1_enable

    But after that, some daemon reverts this value back to 2. How could I prevent it from changing by other users except me? E.g. prevent it from changing by the system?

  • Nik
    Nik almost 3 years
    Sounds like a good option, unfortunately, I don't have an Ubuntu system anymore to test it.
  • Nicolas Molano
    Nicolas Molano over 2 years
    where can I find info about pwm1_enable and pwm1 and the available values options and their meaning? For example my current values in the correspondingly files are 2 and 43. I would guess that 1 for pwm1_enable is set to manual and 200 pwm1 is the fan speed? how 200 maps to 80% fan speed?
  • user986730
    user986730 over 2 years
    @NicolasMolano apparently those sysfs files follow the "hwmon" kernel interface. The amdgpu driver documentation has some more information on it, but I still find all these references to be a bit lacking.