Управление вентилятором Radeon RX-6xx0

Материал из ALT Linux Wiki

Вдохновлённый решением одного немца amdgpu-fancontrol, сваял собственный сильно упрощённый вариант.

Понадобится создать два файла.

  1. Собственно скрипт запуска /usr/local/sbin/amdgpufan:
    #!/bin/bash
    # Check root privileges first.
    [ $UID -eq 0 ] || {
        echo "Writing to /sys requires root privileges."
        exit 1
    }
        
    ## User variables #############################################
    card=0
    rate=5
    min_tmp=40
    gap_tmp=$[min_tmp/2]
    ## System variables ###########################################
    sys_dir=`ls -d /sys/class/drm/card$card/device/hwmon/*`
    ## temp# - 1:edge, 2:junction, 3:memory
    sys_tmp=${sys_dir}/temp2_input
    sys_pwm=${sys_dir}/pwm1
    sys_fan=${sys_pwm}_enable
    
    min_pwm=`cat ${sys_pwm}_min`
    max_pwm=`cat ${sys_pwm}_max`
    max_tmp=$[`cat ${sys_dir}/temp*_crit | sort -V | head -1`/1000]
    ###############################################################
    
    reset(){
        printf "Exiting and setting fan mode"
        fanmode auto
        exit 0
    }
    
    fanmode(){
        case $1 in
            manual) mode=1;;
            auto)   mode=2;;
            *)      mode=0 # max
        esac
        echo " to '$1'."
        echo $mode >$sys_fan
    }
    
    main(){
        cur_pwm=`cat $sys_pwm`
        cur_tmp=$[`cat $sys_tmp`/1000]
        [[ `cat $sys_fan` -eq 1 ]] || {
            printf "Wrong fan mode, setting"
            fanmode manual
        }
        if  [[ $cur_tmp -gt $max_tmp ]]; then
            echo "$cur_tmp°C above critical, setting PWM to $max_pwm for max speed."
            new_pwm=$max_pwm
        else
            [[ $cur_tmp -le $min_tmp ]] && new_pwm=$min_pwm || {
                for n in `seq 0 4`; do
                    case $n in
                        0) add=70;;
                        1) add=90;;
                        2) add=140;;
                        3) add=210;;
                    esac
                    [[ $cur_tmp -gt $[min_tmp+gap_tmp*n - 1] ]] &&
                    [[ $cur_tmp -le $[min_tmp+gap_tmp*(n+1)] ]] && {
                        new_pwm=$[min_pwm+add]
                        break
                    }
                done
            }
        fi
        printf "%3d°C @%3d PWM" $cur_tmp $cur_pwm
        [[ $cur_pwm -ge $[new_pwm-2] ]] &&
        [[ $cur_pwm -le  $new_pwm    ]] &&
        echo "." || { # Change PWM if differ.
            printf ", changing to %3d.\n" $new_pwm
            echo $new_pwm >$sys_pwm
        }
    }
        
    trap "reset" SIGINT SIGTERM # Handle signals.
        
    while :; do # run daemon
        main
        sleep ${rate}s
    done
    
  2. Запускающий его юнит /lib/systemd/system/amdgpufan.service:
    [Unit]
    Description = AMD GPU fan control
    
    [Service]
    ExecStart = /usr/local/sbin/amdgpufan
    Restart = on-failure
    RestartSec = 5
    
    [Install]
    WantedBy = default.target
    

Пример его работы:

Вечер: веб-сёрфинг, редактирование и пр. Колебания Т°C при PWM 69
 54°C @ 69 PWM.
...Запуск игры.
 60°C @ 69 PWM, changing to  90.
 59°C @ 89 PWM, changing to  70.
 60°C @ 69 PWM, changing to  90.
 57°C @ 89 PWM, changing to  70.
 54°C @ 69 PWM.
 59°C @ 69 PWM.
 62°C @ 69 PWM, changing to  90.
 77°C @ 89 PWM.
...Активная фаза игры.
 82°C @ 89 PWM, changing to 140.
 62°C @138 PWM, changing to  90.
 59°C @ 89 PWM, changing to  70.
 62°C @ 69 PWM, changing to  90.
 60°C @ 89 PWM.
...
 61°C @ 89 PWM.
 62°C @ 89 PWM.
 58°C @ 89 PWM, changing to  70.
 60°C @ 69 PWM, changing to  90.
 75°C @ 89 PWM.
...Игра завершена, плавное падение температуры.
 53°C @ 89 PWM, changing to  70.
 52°C @ 69 PWM.
 40°C @ 69 PWM.
 39°C @ 69 PWM, changing to   0.
 40°C @  0 PWM, changing to  70.
 39°C @ 69 PWM, changing to   0.
 39°C @  0 PWM.
...Ночь: колебания 35-38°C с отключёнными вентиляторами видюхи.
...Утро: вход в систему, веб-сёрфинг, редактирование и пр.
 40°C @  0 PWM, changing to  70.
 41°C @ 69 PWM.
...Колебания 42-55°C