@zombig
Sr. System/Network Administrator

Как правильно организовать VGA-passthrought в qemu-kvm?

Пытаюсь настроить проброс видеокарты Radeon R7 240 в виртуальную машину (windows7).
При использовании ATI Open Source (radeon) столкнулся с проблемой, что pci-stub не блочит карту и при попытке сделать:

echo 0000:06:00.0 > /sys/bus/pci/devices/0000\:06\:00.0/driver/unbind


Система "подвисает": т.е. складывается впечатление, что полностью отваливаются обе карты, при этом dmes (kern.log) - чисты.

Если использовать fglx драйвера pci-stub нормально блочит устройство

dmesg | grep pci-stub
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-3.19.0-25-generic root=UUID=0e0cb9d5-fbcf-4a95-88cd-41219cd6c3e2 ro amd_iommu=on max_loop=64 iommu=pt iommu=1 amd_iommu=fullflush pci-stub.ids=1002:6613,1002:aab0 quiet splash modeset=1 vt.handoff=7
[    0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-3.19.0-25-generic root=UUID=0e0cb9d5-fbcf-4a95-88cd-41219cd6c3e2 ro amd_iommu=on max_loop=64 iommu=pt iommu=1 amd_iommu=fullflush pci-stub.ids=1002:6613,1002:aab0 quiet splash modeset=1 vt.handoff=7
[    3.761629] pci-stub: add 1002:6613 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    3.761645] pci-stub 0000:06:00.0: claimed by stub
[    3.761652] pci-stub: add 1002:AAB0 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    3.761663] pci-stub 0000:06:00.1: claimed by stub
[    4.902238] pci-stub 0000:06:00.0: enabling device (0000 -> 0003)


Однако, vfio не может сделать remapping для данной карты:

qemu-system-x86_64: -device vfio-pci,host=06:00.0: vfio: Error: Failed to setup INTx fd: Device or resource busy
qemu-system-x86_64: -device vfio-pci,host=06:00.0: Device initialization failed.
qemu-system-x86_64: -device vfio-pci,host=06:00.0: Device 'vfio-pci' could not be initialized

dmesg | tail | grep vfio
[  435.580406] vfio_ecap_init: 0000:06:00.0 hiding ecap 0x19@0x270
[  435.586186] genirq: Flags mismatch irq 45. 00000080 (vfio-intx(0000:06:00.0)) vs. 00000820 (fglrx[0]@PCI:6:0:0)


Подскажите что я делаю не так и куда копать? Можно как-то заставить pci-stub блочить карту? или руками сделать remap для карты?

Немного информации о системе:
lspci -nn | grep Radeon
01:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Juniper XT [Radeon HD 6770] [1002:68ba]
01:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Juniper HDMI Audio [Radeon HD 5700 Series] [1002:aa58]
06:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Oland PRO [Radeon R7 240] [1002:6613]
06:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Cape Verde/Pitcairn HDMI Audio [Radeon HD 7700/7800 Series] [1002:aab0]

dmesg | grep  IOMMU
[    1.246790] AMD-Vi: Found IOMMU at 0000:00:00.2 cap 0x40
[    4.547794] AMD IOMMUv2 driver by Joerg Roedel <joerg.roedel@amd.com>
[    4.547797] AMD IOMMUv2 functionality not available on this system
[    4.902081] <6>[fglrx] IOMMU is enabled, CrossFire are not supported on this platform
[    4.902082] <6>[fglrx] Disable IOMMU in BIOS options or kernel boot parameters to support CF

cat /etc/default/grub
GRUB_CMDLINE_LINUX="amd_iommu=on max_loop=64 iommu=pt iommu=1 amd_iommu=fullflush pci-stub.ids=1002:6613,1002:aab0"


P.S.: если прокидывать HD 6770 то все работает нормально (с модулем radeon, fglx не пробовал), но мне интересно прокинуть именно R7 240.
  • Вопрос задан
  • 4156 просмотров
Решения вопроса 1
@zombig Автор вопроса
Sr. System/Network Administrator
После обновления ядра до:
uname -r
4.1.0-040100rc2-generic


Моя ситуация не изменилась: drm все так же подгружал radeon, который инициализировал видео устройство и не давал pci-stub/vfio-pci подключить устройство.
Ручное отключение устройства:
echo $DEV > /sys/bus/pci/drivers/radeon/unbind
Приводило к "падению" системы (kernel BUG).

В попытке решить проблему я сделал следующее:
1. Прописал ID устройств для vfio-pci
cat /etc/modprobe.d/vfio-pci.conf 
options vfio-pci ids=1002:6613,1002:aab0

2. Добавил опции softdep и install для модулей drm и radeon
cat /etc/modprobe.d/radeon.conf 
softdep radeon pre: vfio vfio_pci
install radeon /sbin/modprobe vfio; /sbin/modprobe vfio_pci
cat /etc/modprobe.d/drm.conf 
softdep drm pre: vfio vfio_pci post: radeon
softdep drm_kms_helper pre: vfio vfio_pci post: radeon
install drm /sbin/modprobe vfio; /sbin/modprobe vfio_pci


Однако, и это не помогло. Мои скудные знания относительно процесса загрузки linux оказались бессильны, но могу предположить, что это связанно с тем, что drm/radeon грузятся на прямую ядром (не через modprobe), а по тому загружаются раньше, чем отрабатывают опции softdep и install.

Решение (костыль): ещё раз напомню, что у меня в наличии 2 карты - HD 6770 (Juniper) и R7 240 (Oland). Т.к. я не рассчитываю использовать R7 240 (Oland) в host-системе, то я принял решение "выпилить" её полностью. По этому, я удалил все firmware OLAND*.bin из /lib/firmware/radeon/.
rm -f /lib/firmware/radeon/OLAND*.bin
update-initramfs -u
init 6


При обновлении initramfs я получил кучу предупреждений, что прошивки под OLAND не найдено. После перезагрузки я увидел долгожданное:
06:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Oland PRO [Radeon R7 240] [1002:6613] (prog-if 00 [VGA controller])
	Subsystem: ASUSTeK Computer Inc. Device [1043:04c5]
	Flags: bus master, fast devsel, latency 0, IRQ 46
	Memory at b0000000 (64-bit, prefetchable) [size=256M]
	Memory at fe700000 (64-bit, non-prefetchable) [size=256K]
	I/O ports at c000 [size=256]
	Expansion ROM at fe740000 [disabled] [size=128K]
	Capabilities: <access denied>
	Kernel driver in use: vfio-pci

06:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Cape Verde/Pitcairn HDMI Audio [Radeon HD 7700/7800 Series] [1002:aab0]
	Subsystem: ASUSTeK Computer Inc. Device [1043:aab0]
	Flags: bus master, fast devsel, latency 0, IRQ 21
	Memory at fe760000 (64-bit, non-prefetchable) [size=16K]
	Capabilities: <access denied>
	Kernel driver in use: vfio-pci


Гостевая Windows 7 прогрузилась замечательно и проставила рейтинг графического адаптера 6.8 (для HD 6770 - 7.3)

Я понимаю, что это "костыль" и так делать наверное не стоит. Если у Вас есть более элегантное решение - пожалуйста сообщите мне.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@mirspo
1) Проприетарные драйвер нельзя использовать на хосте, только в гостевой.
2) В биосе карты не забываете указать какую видеокарту использовать первичной?
3) xorg.cfg удален?
4) Что значит "подвисает"?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы