After upgrading to Ubuntu 20.04 LTS from Ubuntu 18.04 LTS, I was no longer able to tweak my clock and voltage settings for my Sapphire Radeon RX 580 Pulse or for my Sapphire Radeon RX 580 Nitro+ SE. The changing the fan and power limit presents no problem. I'm using amdgpu driver 20.30-1109583. I tried using amdgpu driver 20.20 but encountered the same problems.

I tried doing it manually, with a Bash script, with Wattman_GTK, with amdgpu-clocks, and attempted to use CoreCtrl (which crashes).

I had changed /etc/default/grub to include:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amdgpu.ppfeaturemask=0xffffffff" 

and also tried

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash radeon.si_support=0 amdgpu.si_support=1 amdgpu.dpm=1 amdgpu.ppfeaturemask=0xffffffff" 

Here is my Bash script:

#!/bin/bash # Get path for card 1 card_path=`readlink -f /sys/class/drm/card1/device` echo "Path for card: $card_path" echo "Initial values for card:" echo "Power limit: $(cat $card_path/hwmon/hwmon2/power1_cap)" echo "Fan settings: $(cat $card_path/hwmon/hwmon2/pwm1)" pwm1_max=`cat $card_path/hwmon/hwmon2/pwm1_max` echo "pwm1_max: $pwm1_max" echo "GPU and memory clocks and voltages" echo "$(cat $card_path/power_dpm_force_performance_level)" echo "$(cat $card_path/pp_od_clk_voltage)" echo " " # Set power limit echo "Setting card power limit:" echo 101000000 > $card_path/hwmon/hwmon2/power1_cap echo " " # Set GPU and mem clocks and voltages echo "Setting GPU and Mem clocks and voltages:" echo manual > $card_path/power_dpm_force_performance_level echo 's 0 300 750' > $card_path/pp_od_clk_voltage echo 's 1 751 793' > $card_path/pp_od_clk_voltage echo 's 2 848 806' > $card_path/pp_od_clk_voltage echo 's 3 858 812' > $card_path/pp_od_clk_voltage echo 's 4 900 820' > $card_path/pp_od_clk_voltage echo 's 5 1059 840' > $card_path/pp_od_clk_voltage echo 's 6 1194 880' > $card_path/pp_od_clk_voltage echo 's 7 1280 890' > $card_path/pp_od_clk_voltage echo 'm 0 300 750' > $card_path/pp_od_clk_voltage echo 'm 1 1000 800' > $card_path/pp_od_clk_voltage echo 'm 2 2215 895' > $card_path/pp_od_clk_voltage echo c > $card_path/pp_od_clk_voltage # Set Fan echo " " echo "Setting Fan:" echo 1 > $card_path/hwmon/hwmon2/pwm1_enable pwr_prc=$((pwm1_max * 7/10)) echo "$pwr_prc" echo $pwr_prc > $card_path/hwmon/hwmon2/pwm1 # Check values echo " " echo "Check settings" echo "Power limit: $(cat $card_path/hwmon/hwmon2/power1_cap)" echo " " echo "Fan settings: $(cat $card_path/hwmon/hwmon2/pwm1)" echo " " echo "Clocks and voltages: " echo "$(cat $card_path/power_dpm_force_performance_level)" echo "$(cat $card_path/pp_od_clk_voltage)" 

Running the script using

sudo sh -c ./card1.sh 

yields:

Initial values for card: Power limit: 101000000 Fan settings: 173 pwm1_max: 255 GPU and memory clocks and voltages manual OD_SCLK: 0: 300MHz 750mV 1: 751MHz 793mV 2: 1048MHz 1006mV 3: 1158MHz 1112mV 4: 1240MHz 1150mV 5: 1309MHz 1150mV 6: 1364MHz 1150mV 7: 1430MHz 1150mV OD_MCLK: 0: 300MHz 750mV 1: 1000MHz 800mV 2: 2100MHz 950mV OD_RANGE: SCLK: 300MHz 2000MHz MCLK: 300MHz 2250MHz VDDC: 750mV 1200mV Setting card power limit: Setting GPU and Mem clocks and voltages: ./card1.sh: line 28: echo: write error: Invalid argument ./card1.sh: line 29: echo: write error: Invalid argument ./card1.sh: line 30: echo: write error: Invalid argument ./card1.sh: line 31: echo: write error: Invalid argument ./card1.sh: line 32: echo: write error: Invalid argument ./card1.sh: line 33: echo: write error: Invalid argument ./card1.sh: line 34: echo: write error: Invalid argument ./card1.sh: line 35: echo: write error: Invalid argument ./card1.sh: line 37: echo: write error: Invalid argument ./card1.sh: line 38: echo: write error: Invalid argument ./card1.sh: line 39: echo: write error: Invalid argument ./card1.sh: line 41: echo: write error: Invalid argument Setting Fan: 178 Check settings Power limit: 101000000 Fan settings: 173 Clocks and voltages: manual OD_SCLK: 0: 300MHz 750mV 1: 751MHz 793mV 2: 1048MHz 1006mV 3: 1158MHz 1112mV 4: 1240MHz 1150mV 5: 1309MHz 1150mV 6: 1364MHz 1150mV 7: 1430MHz 1150mV OD_MCLK: 0: 300MHz 750mV 1: 1000MHz 800mV 2: 2100MHz 950mV OD_RANGE: SCLK: 300MHz 2000MHz MCLK: 300MHz 2250MHz VDDC: 750mV 1200mV 

Wattman_GTK and amdgpu-clocks also yielded the error:

write error: Invalid argument 

Running the script using

$sudo sh card1.sh 

gives, instead of "echo: write error: Invalid argument",

echo: echo: I/O error 

This also happens when I attempt to change clocks and voltages from command line:

$sudo echo 's 7 1280 895' > /sys/devices/pci0000:00/0000:00:1c.7/0000:0d:00.0/pp_od_clk_voltage 

which yields:

-bash: /sys/devices/pci0000:00/0000:00:1c.7/0000:0d:00.0/pp_od_clk_voltage: Permission denied 

3 Answers

I had same problem with the default kernel (5.4). After updating the kernel to the edge one (linux-generic-hwe-20.04-edge), the problem went away.

This works for me on Radeon VII with 20.04 and driver 20.45

For all core clock levels change:

echo 's 0 300 750' > $card_path/pp_od_clk_voltage 

to:

echo 'vc 0 300 750' > $card_path/pp_od_clk_voltage 

and memory levels only get one setting for max frequency so delete:

echo 'm 0 300 750' > $card_path/pp_od_clk_voltage echo 'm 1 1000 800' > $card_path/pp_od_clk_voltage 

and change:

echo 'm 2 2215 895' > $card_path/pp_od_clk_voltage 

to:

echo 'm 1 2215' > $card_path/pp_od_clk_voltage 

I had the same problem just changed double quotes (") to simple quotes (') and it worked fine

IE change:

echo "s 0 300 750" > /sys/class/drm/card0/device/pp_od_clk_voltage 

to:

echo 's 0 300 750' > /sys/class/drm/card0/device/pp_od_clk_voltage 

Hope this helps.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy