Если ты открыл эту статью, то наверняка видел в системе сразу два модуля ядра — radeon и amdgpu — и не понимаешь, какой из них сейчас рулит твоей видеокартой. На APU с Ryzen это почти всегда amdgpu, но на старых Radeon 7000-8000 и R7/R9 2xx-3xx всё ещё встречается radeon, и переключение между ними возможно прямо в конфигах, без пересборки ядра.
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 с 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 не умеет в принципе: полноценный Vulkan через RADV, нормальный OpenGL 4.6+, актуальные версии Mesa из коробки, отсутствие мёртвого кода, который годами чинить некому. Про настройку Vulkan и игр через RADV я писал отдельно — настройка amdgpu и Vulkan на Mesa для игр. Плюс amdgpu — единственный драйвер, который будет получать поддержку новых карт, так что переезжать на него стоит всем, у кого есть выбор.
Оставить radeon разумно в трёх случаях: очень старый GCN1 без нормальной прошивки, где amdgpu может зависнуть на инициализации; APU, который amdgpu ещё не поддерживает; и конфигурации, где radeon уже годами работает стабильно, а переключение тебе ничего не даёт. Про грабли с прошивками amdgpu и «молчаливых» поломках я писал в статье про amdgpu и поломки после прошивки Linux — почитай её перед тем, как лезть в чужие подписи BIOS.
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 они не появятся.
radeon.si_support=1, и amdgpu.si_support=1?Побеждает тот, кто реально загрузился: blacklist в modprobe.d убирает конкурента, а параметры лишь подсказывают, какие чипы готов обслуживать активный модуль. Ошибки в комбинации обычно приводят к падению в TTY без картинки.
Для 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-окружения занимает минуту, картинка в консоли при этом остаётся рабочей.
На APU с Ryzen вопрос обычно закрывается сам собой: ядро выбирает amdgpu, и лезть в конфиги не нужно. Переключение вручную имеет смысл только на старых Radeon 7000-8000 и R7/R9 2xx-3xx, где ты сознательно меняешь ветку драйвера ради фич или ради стабильности. Сначала проверь, что реально загрузилось, через lspci -k и dri/0/name, а потом уже правь modprobe.d и параметры ядра.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии