Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

AMDGPU: поломки после обновления linux-firmware

Обновление linux-firmware-amdgpu изредка ломает картинку: появляются артефакты и полосы, композитор замирает на пару секунд при переключении окон, а картинка на HDMI уходит в 4:2:0 и теряет насыщенный цвет. При этом сам драйвер не менялся — поменялись только бинарные блобы. Ниже — как отличить поломку от новой прошивки от ядерной, как откатить пакет целиком, как вернуть один конкретный blob и что делать с 4:2:0 на HDMI.

Почему после обновления linux-firmware amdgpu начинает глючить?

Пакет linux-firmware-amdgpu раскладывает в /usr/lib/firmware/amdgpu/ несколько сотен файлов — отдельный набор блобов на каждое семейство GPU. Обновление подменяет их разом, причём не только для новых карт: имена вроде navi10_sdma.bin, sienna_cod.bin или nemo10_ipd относятся к чипам, которым уже несколько лет. Прошивка для Navi 10 и для Ryzen 8040 лежит рядом, а обновляется одним релизом.

Внутри есть три разных механизма, и ломается они по-разному:

  • PSP (secure processor) — загрузчик, который проверяет подпись блобов и разворачивает остальные микрокоды. Сбой тут даёт чёрный экран или полный отказ инициализации GPU.
  • DCN (display core) — код, который формирует сигнал для разъёма: режимы, тайминги, chroma, DSC. Сбой здесь выглядит как артефакты, «каша» в вертикальных полосах, фризы при смене окна и неправильный цвет на HDMI.
  • VCN (video core) — аппаратный декодер видео. Отказ здесь виден не в 3D, а в Firefox, mpv, OBS: зависание, зелёные блоки, срыв декодирования.

Что именно приезжает в пакете и как его разбирать по частям, я разбирал в заметке про что обновляется в linux-firmware. А если сомневаешься, тот ли драйвер вообще у тебя стоит, — короткая шпаргалка в статье про AMD APU, Radeon и amdgpu.

Ключевая мысль: ядро ты не обновлял, а железо не покупал. Изменился только пользовательский микрокод, поэтому откатывать проще пакет, а не ядро.

Как понять, что виновата прошивка, а не ядро?

Сначала зафиксируй версии — без них откатывать нечем:

pacman -Q linux-firmware linux-firmware-amdgpu
pacman -Qi linux-firmware-amdgpu | grep -E 'Version|Build Date|Install Date'

Дальше ядро и сообщения о загрузке блобов:

dmesg | grep -E 'amdgpu|firmware'
journalctl -k -b | grep -iE 'amdgpu|psp|vcn|dcn|firmware'
modinfo amdgpu | head -3

Смотри на несколько вещей. Ошибки GPU init failed, Failed to load firmware, PSP firmware version с нечитаемым значением или таймаут загрузки — прямое указание на прошивку. Записи ring timeout, GPU reset failed, Page fault при обычном счёте — уже про GPU или про тайминги. Отдельно полезно сравнить список файлов и их хеши до и после отката:

ls -l /usr/lib/firmware/amdgpu/ | head -20
md5sum /usr/lib/firmware/amdgpu/navi10_*.bin

Если артефакты идут только в играх, а в обычном рабочем столе чисто, проверь ещё стек Mesa — тогда откат firmware может и помочь, а может и нет. Там отдельный разбор: настройка amdgpu и Vulkan Mesa для игр. Третий признак, самый надёжный: если sudo pacman -U со старой версией пакета чинит картинку — вопрос закрыт, дальше только фиксация.

Как откатить linux-firmware на Arch?

Все версии лежат в кеше пакетов, отдельный архив качать не нужно:

ls -1 /var/cache/pacman/pkg/ | grep -E 'linux-firmware(-amdgpu)?-'

Находишь предыдущую сборку и ставишь её с перезаписью файлов. Флаг --overwrite '*' обязателен: установщик pacman иначе откажется затирать файлы более новой версии.

sudo pacman -U --overwrite '*' /var/cache/pacman/pkg/linux-firmware-amdgpu-20250xxxxxx-x-any.pkg.tar.zst

Для монолитного linux-firmware команда та же, только имя пакета другое. Если в кеше лежит только новая версия, откатываться нечем — вариант sudo pacman -Syu linux-firmware-amdgpu в [downgrade] из Arch Linux Archive, но проще сначала проверить, не в твоей ли это версии проблема.

Дальше главное — не дать пакету снова обновиться. Открой /etc/pacman.conf и в секции [options] добавь строку:

IgnorePkg = linux-firmware linux-firmware-amdgpu

Несколько пакетов перечисляются через пробел, а не через запятую. Проверить, что настройка в силе:

pacman -Q linux-firmware-amdgpu
sudo pacman -Syu

Второй вывод покажет предупреждение про игнорирование пакетов — это нормально. Побочный эффект: ядро и firmware теперь живут в разных поколениях, и именно это чаще всего ломает картинку. Проще держать связку «старое ядро + старый firmware», то есть откатывать их вместе. На время отката имеет смысл поставить linux-lts и загрузиться с него через пункт «Advanced options for Arch Linux» в меню загрузчика.

Как вернуть 4:4:4 на HDMI и нормальный цвет?

Цвет уезжает в 4:2:0, когда display core не может удержать полную chroma-развёртку и молча переходит на субсэмплинг. На HDMI 2.0 (18 Гбит/с) для 4K@60 хватает 4:4:4 в 8 и даже 10 бит — то есть переход на 4:2:0 там обычно не обязан, а означает сбой расчёта таймингов или неудачный выбор режима. Исключение — 4K@120, 5K и ультраширокие панели, где без DSC 4:4:4 физически не помещается.

Начни с проверки того, что реально согласовано:

xrandr --verbose | grep -iE 'connected|bpc|colspace|EDID'
kscreen-doctor -j 2>/dev/null | grep -iA2 colorspace

В KDE Plasma цветовое пространство подключения выбирается прямо в настройках дисплея: ставь YCbCr 4:4:4 либо RGB, а глубину цвета — 8 bpc вместо 10/12, и выключи Deep Color. Под Wayland композитор может вообще не отдавать xrandr, тогда смотри wlr-randr на Sway.

Если выбор в GUI не помогает, ограничь режим прямо в командной строке ядра, чтобы display core не пытался прыгнуть выше:

video=HDMI-A-1:1920x1080@60

На стороне телевизора или монитора тоже есть настройка: режим входа HDMI переключается между PC/RGB и TV/YCbCr, а в расширенных настройках — пункт вроде «HDMI Chroma» или «4:2:2 / 4:4:4». Если там стоит 4:2:2 или авто, цвет будет в мыле даже при честном 4:4:4 на стороне GPU.

Когда нужно понять, виноват ли DCN вообще, помогает диагностический параметр amdgpu.dcdebugmask=0x8 — он выключает DSC для 4K120 и в логах видно, уходит ли панель в субсэмплинг из-за сжатия.

Что делать, если amdgpu зависает или сыпет артефактами?

Фриз на пару секунд при сворачивании окон, срыв композитора, чёрный кадр — обычно лечится параметрами модуля. Их все перечисляет статья про параметры ядра и командную строку, а конкретные самые рабочие для amdgpu такие:

amdgpu.aspm=0
amdgpu.runpm=0
amdgpu.vcn=0
amdgpu.ppfeaturemask=0xffff

aspm=0 отключает энергосбережение PCIe — самый частый фикс мерцания и артефактов на старых платах с новой прошивкой. runpm=0 убирает управление питанием GPU во время простоя. vcn=0 выгружает аппаратный декодер: если фризует только видео в браузере, причина почти наверняка в обновлённом VCN. ppfeaturemask=0xffff выключает PowerPlay и снижает частоты — крайняя мера для проверки, стабильна ли карта вообще.

Параметр amdgpu.dc=0 отключает display core целиком. На старых Polaris он честно переключает карту на legacy-путь, на Navi 10/14 и новее legacy-режима нет, поэтому композитор остаётся без CRTC и падает. Держи его только как диагностический тест на пару минут, а не как постоянное решение.

Как откатить один конкретный blob прошивки?

Иногда виноват ровно один файл — например, sienna_cod.bin на карте Navi 10, а всё остальное работает. Тогда и пакет откатывать незачем. Распакуй старый пакет во временную папку и верни нужный файл на место:

mkdir -p /tmp/fw-old
bsdtar -xf /var/cache/pacman/pkg/linux-firmware-amdgpu-20250xxxxxx-x-any.pkg.tar.zst -C /tmp/fw-old
ls /tmp/fw-old/usr/lib/firmware/amdgpu/ | grep sienna
sudo cp /tmp/fw-old/usr/lib/firmware/amdgpu/sienna_cod.bin /usr/lib/firmware/amdgpu/sienna_cod.bin

amdgpu грузит микрокод через request_firmware прямо с диска, так что пересборка образа обычно не нужна. Но если в /etc/mkinitcpio.conf в HOOKS есть firmware, образ лучше пересобрать:

sudo mkinitcpio -P

Дальше перезагрузка. Загрузиться с включённой встроенной графикой можно, если она есть, — тогда драйвер перезапускается без потери картинки:

sudo modprobe -r amdgpu && sudo modprobe amdgpu

Частые вопросы

Поможет ли откат, если проблема появилась сразу после обновления ядра?

Скорее нет. Ядро и firmware независимы: если причина в новом amdgpu из linux, откат пакета ничего не даст, и наоборот. Проверь версию через modinfo amdgpu | head -1 и временно загрузи linux-lts — если проблема ушла, дело в ядре.

Можно ли просто оставить один blob старым, а пакет обновлять дальше?

Технически да, и это работает, пока в новом релизе старый файл не перезапишут. Но при следующем обновлении ты не заметишь, что blob сменился, если не снял хеш заранее: md5sum /usr/lib/firmware/amdgpu/*.bin > ~/fw-amdgpu.md5.

Безопасно ли держать firmware старым постоянно?

Для игр и видео — обычно да. Новые фичи и разгон иногда требуют свежих блобов, поэтому перед крупным экспериментом с версиями имеет смысл снять IgnorePkg и обновиться, а потом вернуться.

Как понять, какой файл отвечает за мой GPU?

Имя файла совпадает с моделью: navi10_* — RX 5600/5700, navi14_* — RX 5500/5600 XT, sienna_* — Navi 10, navi21_* — RDNA2, van_gfx — Cezanne/Vega, dimgrey_cavefish_* — RDNA3.

Полезные ресурсы

  • ArchWiki: AMDGPU — параметры модуля, разбор DCN, диагностика.
  • ArchWiki: Linux firmware — что лежит в пакетах и как с ними работать.

Заключение

Поломка после обновления linux-firmware почти всегда лечится возвратом версии пакета, а не ковырянием в драйвере. Откатываешь linux-firmware-amdgpu из кеша, добавляешь его в IgnorePkg и проверяешь картинку; если 4:2:0 остался, отдельно разбираешь режим HDMI, настройки панели и параметры DCN. Отдельный blob, около которого всё сломалось, возвращается одной командой cp — и переживать обновления становится заметно спокойнее.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max