повторите работы команды, когда вручную выполняется, но не при вставке как сценарий удара

Я использую 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.
0
задан 5 May 2019 в 00:19

1 ответ

Ну, я нашел проблему, это не имело никакого отношения к скрипту 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
0
ответ дан 5 May 2019 в 00:19

Другие вопросы по тегам:

Похожие вопросы: