AMD Ryzen и проблемы с пробросом видеокарты в QEMU KVM

Моему компьютер шел 9 год(AMD FX6350 16GB RAM) и я принял решение, что пора обновляться, так как я являюсь поклонником AMD на протяжение ~18 лет и результаты тестов процессоров Ryzen показывали хорошие результаты, выбор был очевиден. Подловил кучу скидок на комплектующие и процессор(но тут я наверное все таки налажал, скорей всего когда в продаже появится третье поколение Ryzen'ов, то цены возможно еще больше упадут). В общем в сумме апгрейд у меня вышел ~23к, что не так уж и много.
Ryzen 5 2600 box version (ничего и никуда я гнать не собираюсь, поэтому боксовый кулер меня устраивает.) — 10 023 ₽
Kingston DDR4 16Gb (2x8Gb) 3200 MHz — 6 263 ₽
ASROCK B450 Steel Legend — 6900 ₽

Все было куплено и в выходные настал час ИКС, я приступил к сборке, распотрошил старый системник и начал сборку компьютера в новом корпусе который мне случайно достался, до этого у меня все было в серверном не очень практичном, здоровенном корпусе года этак 2001.

Блин что то все не по теме пишу, но вы должны прочуствовать мою боль. Собирал все очень долго и мутарно часа 4: куда то не дотягивались провода, у меня 5 жестких дисков может причина в этом, видеокарта из 2 слота не выдавала сигнал на мониторе, изображение шло только с видеокарты из первого слота, даже пришлось поменять вентилятор в блоке питания, этот гад нарушал бесшумность нового компьютера.

Но в итоге я все собрал, все запустил, даже загрузил свой Arch Linux, скорость отклика компьютера стала нереально быстрой, конечно 6 ядер и 12 потоков, но радость моя была недолгой. Сначала меня поглотили проблемы со звуком, раньше я использовал ALSA и PULSEAUDIO по отдельности, они друг другу не мешали и в принципе оно нормально работало на старой материнке, а сейчас воспроизведение звука было нормальное, а вот запись с микрофона была отвратительной, был ужасный треск и шумы, в общем пришлось полностью отказаться от ALSA и оставить только pulseaudio, хер с ним пусть жрет процессор, но лишь бы не было этого долбанного треска.
Выкладываю кстати конфиг для pulse
в default.pa почти ничего не менял, просто закоментил пару строк, не столь важно, а вот в daemon.conf внес значительные изменения
~/.config/pulse/daemon.conf:
flat-volumes = no
avoid-resampling = yes
default-sample-format = s24le
default-sample-rate = 44100
После пару дней мучений звук стал вменяемый и микрофон писал почти без шумов, но настало время запуска моей виртуальной машины для игр QEMU KVM c пробросом второй видеокарты NVIDIA 1050 GTX 2GB, тут то меня и ждал самый большой облом!

Виртуальная машина не хотела запускаться ни в какую, я перелопатил весь BIOS, IOMMU был включен и прочие настройки виртуализации, лезли одни и те же ошибки:
vfio_bar_restore: 0000:0a:00.1 reset recovery - restoring bars
vfio-pci 0000:0a:00.0: enabling device (0000 -> 0003)
qemu-system-x86_64: vfio: Unable to power on device, stuck in D3
В общем когда начал гуглить, сама ситуация повергла меня в шок, проблема довольно распространненая и старая, вылезает там где BIOS с AGESA 0.0.7.2, но я то прошил уже до более новой версии и там видимо никаких фиксов не было и не предвиделось, вот ссылка на reddit. Я пытался откатить BIOS на 1 версию где нет еще AGESA 0.0.7.2, но материнская плата противилась :-( Вот здесь я натолкнулся на патч ядра, который исправляет данную проблему https://clbin.com/VCiYJ
выложу код здесь на всякий случай:
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 766f5779db92..dc19079dad1b 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -52,6 +52,9 @@ unsigned int pci_pm_d3_delay;
 
 static void pci_pme_list_scan(struct work_struct *work);
 
+static void pci_dev_save_and_disable(struct pci_dev *dev);
+static void pci_dev_restore(struct pci_dev *dev);
+
 static LIST_HEAD(pci_pme_list);
 static DEFINE_MUTEX(pci_pme_list_mutex);
 static DECLARE_DELAYED_WORK(pci_pme_work, pci_pme_list_scan);
@@ -1379,15 +1382,7 @@ static void pci_restore_config_space(struct pci_dev *pdev)
 		pci_restore_config_space_range(pdev, 4, 9, 10, false);
 		pci_restore_config_space_range(pdev, 0, 3, 0, false);
 	} else if (pdev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
-		pci_restore_config_space_range(pdev, 12, 15, 0, false);
-
-		/*
-		 * Force rewriting of prefetch registers to avoid S3 resume
-		 * issues on Intel PCI bridges that occur when these
-		 * registers are not explicitly written.
-		 */
-		pci_restore_config_space_range(pdev, 9, 11, 0, true);
-		pci_restore_config_space_range(pdev, 0, 8, 0, false);
+		pci_restore_config_space_range(pdev, 0, 15, 0, true);
 	} else {
 		pci_restore_config_space_range(pdev, 0, 15, 0, false);
 	}
@@ -4636,6 +4631,8 @@ void pci_reset_secondary_bus(struct pci_dev *dev)
 {
 	u16 ctrl;
 
+	pci_dev_save_and_disable(dev);
+
 	pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &ctrl);
 	ctrl |= PCI_BRIDGE_CTL_BUS_RESET;
 	pci_write_config_word(dev, PCI_BRIDGE_CONTROL, ctrl);
@@ -4649,6 +4646,8 @@ void pci_reset_secondary_bus(struct pci_dev *dev)
 	ctrl &= ~PCI_BRIDGE_CTL_BUS_RESET;
 	pci_write_config_word(dev, PCI_BRIDGE_CONTROL, ctrl);
 
+	pci_dev_restore(dev);
+
 	/*
 	 * Trhfa for conventional PCI is 2^25 clock cycles.
 	 * Assuming a minimum 33MHz clock this results in a 1s
А теперь небольшая инструкция как собрать ядро для Arch Linux'a с этим патчем.
Я собирал версию ядра 5.1.5-arch1-2-ARCH, и теперь заблокирую обновления пакета linux 5.1.5.arch1-2 что бы не просрать все полимеры буду следить за обновлениями в ветке, что бы все начало работать без патчей.

Для начала нам нужны файлы для сборки, взять их можно здесь https://git.archlinux.org/svntogit/packages.git/commit/trunk?h=packages/linux
Скачиваем файл packages/linux.tar.gz


Распаковываем и переходим в каталог со скриптами и скачиваем патч
tar xf packages_linux.tar.gz packages/linux/repos/core-x86_64/
cd packages/linux/repos/core-x86_64/
wget https://clbin.com/VCiYJ -O vfio.patch
Нужно добавить данный патч в скрипт сборки, открываем PKGBUILD, находим source и добавляем строчку с именем файла патча
source=(
  "$_srcname::git+https://git.archlinux.org/linux.git?signed#tag=v$_srcver"
  config         # the main kernel config file
  60-linux.hook  # pacman hook for depmod
  90-linux.hook  # pacman hook for initramfs regeneration
  linux.preset   # standard config files for mkinitcpio ramdisk
  vfio.patch
)
В sha256sums добавляем в конце SKIP — что бы не проверял контрольную сумму файла патча.
sha256sums=('SKIP'
            '02390efe7637927502bc834daf3f413ea5e2cb084bca125372e70dc9438e824c'
            'ae2e95db94ef7176207c690224169594d49445e04249d2499e9d2fbc117a0b21'
            'c043f3033bb781e2688794a59f6d1f7ed49ef9b13eb77ff9a425df33a244a636'
            'ad6344badc91ad0630caacde83f7f9b97276f80d26a20619a87952be65492c65'
	    'SKIP')
Если хотите что бы пакет собрался побыстрей найдите строчку make bzImage modules в build() и добавьте -j12 что бы стало вот так:
make -j12 bzImage modules цифра 12 обозночает количество потоков, так ядро должно собраться в разы быстрее, ну и нагрузка на пк будет значительней.

После проделанных манипуляций сохраняем файл PKGBUILD, и запускаем сборку командой makepkg -sЕсли у вас нет утилиты makepkg значит у вас не стоят инструменты для сборки, установить можно командой pacman -S --needed base-devel и после этого вновь попробовать.
Если все сделали правильно должна начаться сборка пакета, он выкачает из репозитория порядка 2gb данных и будет компилировать и компилировать, при успешной сборке в каталоге с PKGBUILD появятся 3 пакета установить их можно будет командой sudo pacman -U linux-5.1.5.arch1-2-x86_64.pkg.tar.xz linux-headers-5.1.5.arch1-2-x86_64.pkg.tar.xz

На этом все, перезагружаемся и снова пробрасываем видеокарту как ни в чем не бывало, и ждем патчей в основной ветке ядра, если что-то не получилось всегда можете мне написать в телеграм помогу чем смогу.

Комментарии ()

    Есть вопрос или предложение пиши в Telegram @cloudsv

    MTProto прokси для Telegram

    Прямой эфир

    cloudsv 31 июля 2019, 00:34
    О жизни 33 year old 0
    cloudsv 25 июня 2019, 21:29
    Telegram Полезные боты в Telegram 0
    cloudsv 24 октября 2018, 00:27
    О жизни Обновление Scala Rider G4 11
    cloudsv 21 октября 2018, 23:16
    Arch Linux Памятка по основным утилитам Linux 0