Я использую Ubuntu 19.04, и у меня есть звук, потрескивающий по HDMI с помощью AMD RX460, подключенного к моему ТВ LG LED.
Это, вероятно, имеет некоторое отношение к AMD драйвер GPU, потому что у меня есть та же самая проблема в про Windows 10. На окнах я использовал Адреналин AMD GUI для решения проблемы, не позволяя GPU войти в p-состояние 0 (214 МГц, 0.8v). Там я установил p-состояние 1 как минимальное состояние и изменил частоту и напряжение для соответствия p-состоянию 0. Вероятно, p-состояние 0 применяет некоторую другую установку экономии электроэнергии, которая является, почему установка той же частоты и напряжения для p-состояния 1 действительно производит тот же треск в звуке.
Теперь я пытаюсь сделать то же самое на Ubuntu 19.04, но с amdgpu драйвером. Я создал в файлы hdmi-audio-crack-fix и hdmi-audio-crack-fix.service следующим образом:
1-Помещенных hdmi-audio-crack-fix внутри/usr/bin с верными полномочиями.
#!/bin/bash
# This simple script disables pstate 0 for amdgpu to fix audio crackling over hdmi.
# Then pstate 1 is modified to match pstate 0 voltage and frequency.
# Also a little bit of undervolting is introduced.
# Copy to /usr/bin/ and then copy .service file to /etc/systemd/system/
# Using Ubuntu echo located inside /bin instead of bash built-in echo
amdgpu_echo="/bin/echo"
# Change amdgpu dpm performance level to manual
$amdgpu_echo "manual" > /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/power_dpm_force_performance_level
# Disable pstate 0 as this is causing the crackling over hdmi
$amdgpu_echo "1 2 3 4 5 6 7" > /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/pp_dpm_sclk
$amdgpu_echo "1 2 3 4 5 6 7" > /sys/class/drm/card0/device/pp_dpm_sclk
# Now reduce pstate 1 clock to reduce temperature on idle
$amdgpu_echo "s 1 220 800" > /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/pp_od_clk_voltage
# Undervolting gpu for highest pstates
$amdgpu_echo "s 5 1138 992" > /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/pp_od_clk_voltage
$amdgpu_echo "s 6 1172 1005" > /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/pp_od_clk_voltage
$amdgpu_echo "s 7 1212 1050" > /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/pp_od_clk_voltage
# Now sync new core/voltage table with GPU
$amdgpu_echo 'c' > /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/pp_od_clk_voltage
2-Помещенных hdmi-audio-crack-fix.service внутри/etc/systemd/system/и выполняемый sudo systemctl enable hdmi-audio-crack-fix.service
.
[Unit]
Description=Temporary fix for amdgpu HDMI audio crackling
[Service]
Type=oneshot
ExecStart=/usr/bin/hdmi-audio-crack-fix
[Install]
WantedBy=multi-user.target
Все работает как ожидалось, но следующая строка, кажется, не имеет эффектов, и GPU все еще переходит к p-состоянию 0:
$amdgpu_echo "1 2 3 4 5 6 7" > /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/pp_dpm_sclk
или
$amdgpu_echo "1 2 3 4 5 6 7" > /sys/class/drm/card0/device/pp_dpm_sclk
Проблема состоит в том, когда я выполняю эту команду вручную через терминал с помощью следующей команды, это работает правильно:
sudo su -
echo "1 2 3 4 5 6 7" > /sys/class/drm/card0/device/pp_dpm_sclk
Обновление:
Это - Вывод сервисного состояния:
● hdmi-audio-crack-fix.service - Temporarly fix for amdgpu HDMI audio crackling
Loaded: loaded (/etc/systemd/system/hdmi-audio-crack-fix.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Sat 2019-05-04 21:24:25 +0430; 4h 14min ago
Main PID: 1004 (code=exited, status=0/SUCCESS)
May 04 21:24:24 Rivendell systemd[1]: Starting Temporarly fix for amdgpu HDMI audio crackling...
May 04 21:24:25 Rivendell systemd[1]: hdmi-audio-crack-fix.service: Succeeded.
May 04 21:24:25 Rivendell systemd[1]: Started Temporarly fix for amdgpu HDMI audio crackling.
Ну, я нашел проблему, это не имело никакого отношения к скрипту bash. Команда, которую я сказал, не смогла произвести желаемое поведение графического процессора, на самом деле работала.
Чего я не знал, так это того, что всякий раз, когда pp_od_clk_voltage изменяется, pp_dpm_sclk сбрасывается в значение по умолчанию. Таким образом, любые изменения до изменения pp_od_clk_voltage бесполезны.
Мне просто нужно было выполнить команды, связанные с pp_dpm_sclk, после команд, связанных с pp_od_clk_voltage. Окончательный рабочий скрипт выглядит следующим образом, если кому-то интересно (AMD RX460):
#!/bin/bash
# **************************************Info************************************* #
# #
# This simple script disables p-State 0 for amdgpu: fix audio-crackling over hdmi.#
# Then p-State 1 is modified to match p-State 0 voltage and frequency. #
# Also a little bit of undervolting is also introduced to keep gpu happy. #
# #
# *************************************README************************************ #
# #
# Inside the directory containing hdmi-audio-crack-fix and .service files, run: #
# #
# sudo cp hdmi-audio-crack-fix /usr/bin/ #
# sudo chmod 755 /usr/bin/hdmi-audio-crack-fix #
# sudo cp hdmi-audio-crack-fix.service /etc/systemd/system/ #
# sudo systemctl enable hdmi-audio-crack-fix.service #
# #
# Check if everything is working as intended: #
# cat /sys/class/drm/card0/device/pp_od_clk_voltage #
# cat /sys/class/drm/card0/device/pp_dpm_sclk #
# #
# **************************************END************************************** #
# Change amdgpu dpm performance level to manual
echo "manual" > /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/power_dpm_force_performance_level
# Reduceing p-State 1 and 2 clock to reduce temperature on idle
echo "s 1 220 800" > /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/pp_od_clk_voltage
echo "s 2 620 810" > /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/pp_od_clk_voltage
# Undervolting gpu for the highest p-States: 5, 6, 7
echo "s 5 1138 992" > /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/pp_od_clk_voltage
echo "s 6 1172 1005" > /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/pp_od_clk_voltage
echo "s 7 1212 1050" > /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/pp_od_clk_voltage
# Now sync new core/voltage table with GPU
echo "c" > /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/pp_od_clk_voltage
# Finally, Disable pstate 0 as this is causing the crackling over hdmi
# This step should run after any modification to pp_od_clk_voltage, otherwise it gets reset.
echo "1 2 3 4 5 6 7" > /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/pp_dpm_sclk