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

Материал из ALT Linux Wiki
Версия от 04:15, 25 мая 2022; Дым (обсуждение | вклад) (Новая страница: «Вдохновлённый решением одного [https://github.com/WieWaldi/amdgpu-fancontrol немца], сваял собственный сильно упрощённый вариант. Понадобится создать два файла. #Собственно скрипт запуска <code>/usr/local/sbin/amdgpufan</code>: #:<source lang="bash"> #!/bin/bash # amdgpufan [ $UID -eq 0 ] || { # Check root privileges. echo "Writing to...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

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

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

  1. Собственно скрипт запуска /usr/local/sbin/amdgpufan:
    #!/bin/bash
    # amdgpufan
    
    [ $UID -eq 0 ] || { # Check root privileges.
        echo "Writing to /sys requires root privileges."
        exit 1
    }
    
    ###########################
    ## Maintained variables: ##
    card=0
    rate=5
    min_tmp=40
    
    ###########################
    ## Calculated 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
    
    cur_tmp=$[`cat $sys_tmp`/1000]
    max_tmp=$[`cat ${sys_dir}/temp*_crit | sort -V | head -1`/1000]
    gap_tmp=$[min_tmp/2]
    
    cur_pwm=`cat ${sys_pwm}`
    min_pwm=`cat ${sys_pwm}_min`
    max_pwm=`cat ${sys_pwm}_max`
    ###########################
    
    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