@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.
  • Вопрос задан
  • 4166 просмотров
Решения вопроса 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) Что значит "подвисает"?
Ответ написан
Ваш ответ на вопрос

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

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