Practical KVM/QEMU guide for Vega 6/8 with stable reset workflows.
This repository documents a practical approach to get Ryzen APU Vega iGPU passthrough running on KVM/QEMU.
Primary target / confirmed focus:
- ✅ Ryzen 4000G series (Renoir, iGPU 0x1636)
- ✅ Ryzen 5000G series (Cezanne, iGPU 0x1638)
It may also work for other APUs or even some discrete GPUs (dGPUs) — but no guarantees.
Your exact combo of hardware + BIOS + kernel + drivers decides everything.
- Enable SVM + IOMMU in BIOS (UEFI recommended)
- Install vendor-reset via DKMS and add your iGPU ID (
0x1636Renoir /0x1638Cezanne) insrc/device-db.h - (Debian 12/13 + kernel 6.12) if DKMS fails, patch
src/amd/amdgpu/atom.cinclude - Put VBIOS/ROM files into
/usr/share/vgabiosvbios_1636.datorvbios_1638.datATIAudioDevice_AA01.rom
- Add both PCI functions to your VM XML: iGPU and iGPU audio, and attach the ROM files (CRUCIAL! Without them you get Error 43)
- Use UEFI + Secure Boot (OVMF) and recommended Hyper-V/KVM feature flags
- Boot Windows → install AMD drivers
- Activate Windows Side reset (Also CRUCIAL! as without it the VM is not able to reset the GPU, seems like vendor-reset is not enough)
Full step-by-step guide is below.
Note: This was rock-solid for me on Debian 12 + kernel 6.12.12 On Debian 13 + newest kernel 6.12.57 or even 6.16 or 6.17 no chance
NEW FINDINGS: I had a working version before I upgraded to Debian 13 on 10. January 2026 Since then my VM crashed when I started a Game or even When I tried to login physically on the Monitor
- libvirt, qemu, ovmf downgrade: so far no change
- kernel downgrade to 6.12.12 also no change
- removed firmware-amd-graphics completely
- downgrade Windows Treiber to 25.8.1: This has fixed at least the login crash!!
Result: so far still crashes under Load...
SOLUTION NOW:
Problem of the crashes no matter what I tried was a fautly power supply.
So back to testing: Current Kernel 6.18 and 6.19 are using a new reset methode. But this seems to cause problems. Furthermore you cannot disable it and use vendor-reset instaed:
[ 490.129794] amd_iommu_report_page_fault: 115868 callbacks suppressed
[ 490.129798] vfio-pci 0000:06:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0002 address=0x3682ff000 flags=0x0000]
[ 490.129814] vfio-pci 0000:06:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0002 address=0x368300000 flags=0x0000]
[ 490.129826] vfio-pci 0000:06:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0002 address=0x368301000 flags=0x0000]
[ 490.129838] vfio-pci 0000:06:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0002 address=0x368302000 flags=0x0000]
[ 490.129849] vfio-pci 0000:06:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0002 address=0x368303000 flags=0x0000]
[ 490.129861] vfio-pci 0000:06:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0002 address=0x368304000 flags=0x0000]
[ 490.129872] vfio-pci 0000:06:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0002 address=0x368305000 flags=0x0000]
[ 490.129883] vfio-pci 0000:06:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0002 address=0x368306000 flags=0x0000]
[ 490.129895] vfio-pci 0000:06:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0002 address=0x368307000 flags=0x0000]
[ 490.129906] vfio-pci 0000:06:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0002 address=0x368302000 flags=0x0000]
So I am back to Kernel 6.12.73 + vendor-reset
seems like that line is pretty stable!
I did not find any complete working guide out there. So I built one.
Ryzen APU iGPU passthrough often fails with:
- black screen
- Error 43
- reset issues after VM shutdown
- “works once” behavior
This repo documents a setup that is meant to be repeatable, not luck.
vbios_1636.dat— Renoir Vega 6 (e.g. 4350G)vbios_1638.dat— Cezanne Vega 8 (e.g. 5700G)ATIAudioDevice_AA01.rom— HDMI/DP audio ROM (works for both)
IMPORTANT: You must include the audio device in passthrough — otherwise this commonly ends in Error 43.
manage-gpu.bat— enable/disable/reset GPU + AUDIO deviceswap-gpu.*— optional GPU ↔ VirtIO/VNC swap
install_vendor-reset_module.sh- contains the necessary commands to first remove the dkms vendor-reset module and then install it again
This repo is free and open and contains everything you need to build a working setup.
But let’s be honest: Ryzen APU iGPU passthrough can eat entire weekends.
If you’re reading this and thinking:
“Nice… but I don’t want to spend 6+ hours testing random changes until it finally works.”
Then you can hire me for a paid, done-with-you setup (remote / guided troubleshooting).
✅ black screen / no output
✅ Error 43 (and the usual audio-ROM trap)
✅ vendor-reset patch + DKMS build issues
✅ correct libvirt XML for GPU + HDMI/DP audio
✅ ROM/VBIOS handling (/usr/share/vgabios etc.)
✅ getting stable start/stop/reboot behavior
✅ making it repeatable (Windows Task Scheduler automation)
- This is paid support, not a free helpdesk
- We agree on scope + pricing upfront
- You keep full control of your system — I guide you, explain, and fix the chain with you
- VFIO/iGPU passthrough depends on the right combination of mainboard, gpu, kernel. So this is best-effort paid troubleshooting, not a “100% guaranteed fix”.
- If your hardware/software combo looks unrealistic, I’ll tell you early.
- APU model (e.g. 4350G / 5600G / 5700G)
- Host OS (Debian / Proxmox / Ubuntu)
- Kernel version (So far only 6.12 works with vendor-reset)
- Your symptom (Error 43 / black screen / only first boot works)
This repo documents a working approach to run an AMD Ryzen APU Vega iGPU as a passthrough GPU for a Windows VM (KVM/QEMU/libvirt).
- Ryzen 4000G series (Renoir, iGPU
0x1636) - Ryzen 5000G series (Cezanne, iGPU
0x1638)
Other APUs (and even some dGPUs) might work too, but results depend on your exact combo of hardware + BIOS + kernel + driver.
- vendor-reset currently only works until Kernel 6.12
- Add the iGPU to vendor-reset (
gnif/vendor-reset) by adding your device ID tosrc/device-db.hunderAMD_NAVI10, e.g.:
- Renoir:
{PCI_VENDOR_ID_ATI, 0x1636, op, DEVICE_INFO(AMD_NAVI10)}, \ - Cezanne:
{PCI_VENDOR_ID_ATI, 0x1638, op, DEVICE_INFO(AMD_NAVI10)}, \
- Use a Windows manage-gpu script + Task Scheduler to reset the GPU on startup and disable it on shutdown.
These steps are based on (and aligned with) the Proxmox forum discussion here:
git clone https://github.com/gnif/vendor-reset
cd vendor-resetlspci -nkkRenoir is typically 1636, Cezanne is typically 1638.
Edit: src/device-db.h
Find the AMD_NAVI10 block and add your entry (example includes Renoir):
#define _AMD_NAVI10(op) \
{PCI_VENDOR_ID_ATI, 0x1636, op, DEVICE_INFO(AMD_NAVI10)}, \
{PCI_VENDOR_ID_ATI, 0x7310, op, DEVICE_INFO(AMD_NAVI10)}, \
{PCI_VENDOR_ID_ATI, 0x7312, op, DEVICE_INFO(AMD_NAVI10)}, \For Cezanne add:
{PCI_VENDOR_ID_ATI, 0x1638, op, DEVICE_INFO(AMD_NAVI10)}, \easiest way:
- copy the install_vendor-reset_module.sh into the vendor-reset folder
- chmod +x install_vendor-reset_module.sh
- ./install_vendor-reset_module.sh
If DKMS fails on Debian 12 with kernel 6.12, I had to patch:
- Edit:
src/amd/amdgpu/atom.c - Change:
#include <asm/unaligned.h>to:
#include <linux/unaligned.h>Then run the instal-script again
./install_vendor-reset_module.sh
Note: the module name is vendor_reset (underscore, not dash).
Add it to /etc/modules:
vendor_reset
Reboot.
My mainboard had the GPU already in a separate IOMMU group.
If yours is not, you may need ACS override / IOMMU separation (google your exact platform + “ACS override”).
On my system no further GRUB options were necessary because my host is a headless Debian 12 server (OMV installed) and it seems to disable the iGPU automatically.
(Your setup may differ.)
You can extract these from:
- your GPU / system firmware
- or from a UEFI/BIOS update file
If you have the same CPUs as me (4350G or 5700G), you can use the files in this repo:
vbios_1636.dat— Vega 6 (4350G)vbios_1638.dat— Vega 8 (5700G)ATIAudioDevice_AA01.rom— HDMI audio device (works for both)
IMPORTANT: You must include the audio device otherwise passthrough often ends as Error 43.
I used:
- UBU tool: https://winraid.level1techs.com/t/tool-guide-news-uefi-bios-updater-ubu/3035 (UBU-1.80)
- Extract the archive, run
UBU.cmd, provide the UEFI update file when prompted.
Then convert as described here:
- https://github.com/isc30/ryzen-gpu-passthrough-proxmox?tab=readme-ov-file#configuring-the-gpu-in-the-windows-vm
- isc30/ryzen-gpu-passthrough-proxmox#18 (comment)
Add the VBIOS/ROM files to:
sudo mkdir -p /usr/share/vgabios
sudo cp vbios_1636.dat vbios_1638.dat ATIAudioDevice_AA01.rom /usr/share/vgabios/On Debian, this path was required for me (other locations did not work).
Edit your VM XML (virsh edit <vmname> or virt-manager → XML) and add BOTH devices.
Example (adjust bus/slot/function to your system):
<hostdev mode="subsystem" type="pci" managed="yes">
<source>
<address domain="0x0000" bus="0x06" slot="0x00" function="0x0"/>
</source>
<rom file="/usr/share/vgabios/vbios_1636.dat"/>
<address type="pci" domain="0x0000" bus="0x06" slot="0x00" function="0x0"/>
</hostdev>
<hostdev mode="subsystem" type="pci" managed="yes">
<driver name="vfio"/>
<source>
<address domain="0x0000" bus="0x06" slot="0x00" function="0x1"/>
</source>
<rom file="/usr/share/vgabios/ATIAudioDevice_AA01.rom"/>
<address type="pci" domain="0x0000" bus="0x09" slot="0x00" function="0x0"/>
</hostdev>UEFI is necessary. For Win11, virt-manager usually configures this automatically.
Example:
<os firmware='efi'>
<type arch='x86_64' machine='pc-q35-10.0'>hvm</type>
<firmware>
<feature enabled='yes' name='enrolled-keys'/>
<feature enabled='yes' name='secure-boot'/>
</firmware>
<loader readonly='yes' secure='yes' type='pflash' format='raw'>/usr/share/OVMF/OVMF_CODE_4M.ms.fd</loader>
<nvram template='/usr/share/OVMF/OVMF_VARS_4M.ms.fd' templateFormat='raw' format='raw'>/var/lib/libvirt/qemu/nvram/Win11_VARS.fd</nvram>
<bootmenu enable='no'/>
</os>I enabled a bunch of options. I’m not sure which ones are strictly necessary, but I did not want to keep testing once it worked:
<features>
<acpi/>
<apic/>
<hyperv mode='custom'>
<relaxed state='on'/>
<vapic state='on'/>
<spinlocks state='on' retries='8191'/>
<vpindex state='on'/>
<synic state='on'/>
<stimer state='on'/>
<reset state='on'/>
<vendor_id state='on' value='1756857dhai7'/>
<frequencies state='on'/>
<reenlightenment state='on'/>
<tlbflush state='on'/>
<ipi state='on'/>
</hyperv>
<kvm>
<hidden state='on'/>
</kvm>
<vmport state='off'/>
<smm state='on'/>
<ioapic driver='qemu'/>
</features>Boot the VM into Windows and install AMD drivers. For me the official AMD drivers worked (manual download). Automatic detection may work too.
This was required on my 5700G.
My 4350G worked without it.
I created manage-gpu.bat which can enable/disable/reset both the GPU and the AUDIO device in Device Manager.
In Windows Device Manager:
- open the GPU device → Details → Device instance path
- do the same for the AUDIO device
Example:
PCI\\VEN_1002&DEV_1638&SUBSYS_D0001458&REV_C8\\4&3B1E1872&0&000D
You can omit the tail after the second backslash:
- use:
PCI\\VEN_1002&DEV_1638&SUBSYS_D0001458&REV_C8Set these values asGPU_IDandAUDIO_IDin the script.
- Import
Archive/disable_gpu.xmlandArchive/reset_gpu.xmlin Task Scheduler - Save / enable the tasks
Ryzen APU, iGPU passthrough, Vega 6, Vega 8, Renoir, Cezanne, KVM, QEMU, libvirt, VFIO, vendor-reset, Error 43, Windows VM, VBIOS, ROM, OVMF, IOMMU, DKMS.
You successfully implemented a working APU iGPU passthrough setup — which many say is impossible.
A qemu hook with just:
/sys/bus/pci/devices/0000:06:00.0/remove 2>/dev/null
vendor_reset is doing more than that.