Все об Arch Linux

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

AMD APU: что за "radeon" и когда "amdgpu"

Если ты открыл эту статью, то наверняка видел в системе сразу два модуля ядра — radeon и amdgpu — и не понимаешь, какой из них сейчас рулит твоей видеокартой. На APU с Ryzen это почти всегда amdgpu, но на старых Radeon 7000-8000 и R7/R9 2xx-3xx всё ещё встречается radeon, и переключение между ними возможно прямо в конфигах, без пересборки ядра.

Чем radeon отличается от amdgpu?

radeon — старый драйвер, он появился в ядре вместе с открытым стеком DRI и десятилетиями доделывал поддержку карт: R600, R700, HD 7000-8000 (это поколение Southern Islands), R7/R9 200-300 с GCN внутри (CIK). Его собственные модули ядра — si_support для Southern Islands и cik_support для GCN первого-третьего поколения.

amdgpu — новая, полностью переписанная ветка, которая стартовала в Linux 4.2 с поддержкой только Volcanic Islands, а потом вытеснила radeon везде, где был GCN: с Linux 4.9-4.10 GCN1-карты по умолчанию ездят на amdgpu. Обе ветки живут в ядре параллельно и делят архитектуру, но код у них разный, поэтому поведение, скорость и список фич различаются.

Обе ветки лежат рядом в дереве модулей, и это удобно для эксперимента: переключение не требует ни пересборки ядра, ни установки сторонних патчей.

ls /usr/lib/modules/$(uname -r)/kernel/drivers/gpu/drm/ | grep -E '^(radeon|amdgpu)'

Обрати внимание и на пользовательское ядро: за radeon стоит стек radeonsi, а за amdgpu — тот же radeonsi плюс отдельный RADV для Vulkan. Поэтому «поменять драйвер» на уровне пакетов Mesa нельзя, только на уровне модуля ядра.

Как узнать, какой драйвер загружен прямо сейчас?

Самый быстрый способ — lspci -k: он показывает строку Kernel driver in use.

lspci -k | grep -A 3 -iE 'vga|3d|display'

В выводе ищи либо Kernel driver in use: amdgpu, либо Kernel driver in use: radeon. Дублирующая проверка через модули и debugfs:

lsmod | grep -E '^(radeon|amdgpu)'
sudo cat /sys/kernel/debug/dri/0/name

Имя в dri/0/name — самый честный ответ: там будет либо amdgpu, либо radeon. Если каталога нет, значит DRM-модуль вообще не загрузился. Подробности загрузки и firmware смотри в dmesg:

dmesg | grep -iE 'amdgpu|radeon' | head -30

Что с APU: Carrizo, Stoney и Ryzen?

На APU с Ryzen, где встроенное ядро — Vega или новее (GN, RDNA, RDNA2), amdgpu выбирается ядром автоматически: там только один разумный вариант, и лезть в modprobe.d не нужно. А вот GCN-APU вроде Carrizo (FX-8800P) и Stoney (A10-7870K) долгое время работали исключительно под radeon, потому что у amdgpu не было для них полноценной поддержки вывода картинки. Поддержку для части таких чипов в ядро добавили заметно позже, поэтому на дистрибутивах с не очень свежим ядром radeon для них остаётся рабочим и предсказуемым выбором.

Свойство чипа подскажет сам список устройств — он же помогает проверить, что ты вообще имеешь в виду нужную модель:

lspci -nn | grep -iE 'amd|ati'

Дальше смотри PCI ID в базе ArchWiki или в pci.ids из пакета pciutils, и сравни поколение: GCN первого-третьего — это ещё зона, где обе ветки конкурируют, Vega и новее — только amdgpu.

Отдельная головная боль — ноутбук с гибридом, где встроенное ядро AMD соседствует с дискретной картой. Тогда в системе живут оба модуля, но это две разные карты, и параметры командной строки действуют на модуль целиком, а не на конкретный PCI-идентификатор.

Как принудительно переключить драйвер?

Механизм двухуровневый: модули фильтруются в /etc/modprobe.d, а режим SI/CIK задаётся параметрами командной строки ядра.

Сначала запрети radeon — это делается двумя строками, install ... /bin/false не даёт загрузить модуль вообще:

sudo tee /etc/modprobe.d/blacklist-radeon.conf >/dev/null <<'EOF'
blacklist radeon
install radeon /bin/false
EOF

Затем пропиши в параметры ядра (GRUB_CMDLINE_LINUX_DEFAULT в /etc/default/grub или kernel cmdline в /etc/mkinitcpio.conf для настройки initramfs):

radeon.si_support=0 radeon.cik_support=0 amdgpu.si_support=1 amdgpu.cik_support=1

Для Arch на ядрах linux и linux-lts initramfs пересобирается так:

sudo mkinitcpio -P
sudo grub-mkconfig -o /boot/grub/grub.cfg

Возврат к radeon делается зеркально: blacklist amdgpu плюс install amdgpu /bin/false в отдельном файле и radeon.si_support=1 radeon.cik_support=1 в cmdline. Если используешь нестандартный список HOOKS в /etc/mkinitcpio.conf, проверь, что там есть modules — иначе модуль не попадёт в initramfs и ранний KMS не включится.

Почему amdgpu лучше radeon?

Причин несколько, и они не косметические. amdgpu умеет то, что radeon не умеет в принципе: полноценный Vulkan через RADV, нормальный OpenGL 4.6+, актуальные версии Mesa из коробки, отсутствие мёртвого кода, который годами чинить некому. Про настройку Vulkan и игр через RADV я писал отдельно — настройка amdgpu и Vulkan на Mesa для игр. Плюс amdgpu — единственный драйвер, который будет получать поддержку новых карт, так что переезжать на него стоит всем, у кого есть выбор.

Когда лучше оставить radeon?

Оставить radeon разумно в трёх случаях: очень старый GCN1 без нормальной прошивки, где amdgpu может зависнуть на инициализации; APU, который amdgpu ещё не поддерживает; и конфигурации, где radeon уже годами работает стабильно, а переключение тебе ничего не даёт. Про грабли с прошивками amdgpu и «молчаливых» поломках я писал в статье про amdgpu и поломки после прошивки Linux — почитай её перед тем, как лезть в чужие подписи BIOS.

Что делать, если amdgpu не идеален?

amdgpu.dc=0 отключает Display Core (DCN) и возвращает старую логику вывода картинки, amdgpu.dc=1 включает новую обратно. Помогает при артефактах, полосах, проблемах с TearFree и Wayland на старых картах. amdgpu.ppfeaturemask управляет битовой маской power play: значение подбирают под конкретный ASIC (на GCN1 это 0xffff, на Vega и новее обычно 0xfff), и без чёткого понимания, что ты ломаешь, его лучше не трогать. Полный разбор таких ключей — в статье параметры ядра из командной строки.

Как проверить, что переключение сработало?

После перезагрузки смотри три точки — модуль, OpenGL-рендерер и Vulkan:

lspci -k | grep -i 'kernel driver in use'
glxinfo -B | grep -E 'OpenGL vendor|OpenGL renderer|OpenGL version'
vulkaninfo --summary 2>/dev/null | head -25

В glxinfo ожидай строку вида AMD Radeon Graphics (radeonsi, ...) — это уже Mesa поверх amdgpu. vulkaninfo --summary (пакет vulkan-tools) не должен ругаться на отсутствие устройства, а простой тест-кубик запускается командой vkcube. Сам glxinfo ставится из пакета mesa-utils.

Не забудь проверить состояние после suspend/resume: драйверы AMD иногда ломаются именно на пробуждении, и это хорошо видно в dmesg.

journalctl -b -k | grep -iE 'amdgpu|radeon' | tail -20

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

Можно ли держать оба модуля в системе?

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

Что будет, если вписать в cmdline и radeon.si_support=1, и amdgpu.si_support=1?

Побеждает тот, кто реально загрузился: blacklist в modprobe.d убирает конкурента, а параметры лишь подсказывают, какие чипы готов обслуживать активный модуль. Ошибки в комбинации обычно приводят к падению в TTY без картинки.

Нужно ли пересобирать initramfs после правки modprobe.d?

Для linux-lts и любых ядер с early KMS — да, обязательно: sudo mkinitcpio -P. Без этого изменения из /etc/modprobe.d не попадут в раннюю загрузку.

Как вернуть всё обратно за секунду?

Удали свой файл из /etc/modprobe.d, верни прежние значения в cmdline, выполни sudo mkinitcpio -P и sudo grub-mkconfig -o /boot/grub/grub.cfg. Заодно проверь, что в lspci -k снова появился Kernel driver in use: radeon.

А если после переключения чёрный экран?

Не паникуй: это самый частый исход неудачного переключения. Загрузись с параметром nomodeset или из меню GRUB добавь в cmdline radeon.modeset=0, а затем откати конфиги по схеме из предыдущего ответа. Ручная правка /etc/modprobe.d из rescue-окружения занимает минуту, картинка в консоли при этом остаётся рабочей.

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

  • AMDGPU — ArchWiki: список поддерживаемых поколений, параметры модуля, настройка Vulkan и power play.
  • Radeon — ArchWiki: всё про старую ветку драйвера и её совместимость.

Заключение

На APU с Ryzen вопрос обычно закрывается сам собой: ядро выбирает amdgpu, и лезть в конфиги не нужно. Переключение вручную имеет смысл только на старых Radeon 7000-8000 и R7/R9 2xx-3xx, где ты сознательно меняешь ветку драйвера ради фич или ради стабильности. Сначала проверь, что реально загрузилось, через lspci -k и dri/0/name, а потом уже правь modprobe.d и параметры ядра.



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

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

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

Комментарии

Загрузка…

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

Telegram Max