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.