August 3, 2025Aug 3 Author Updated instructions for OVMF and Q35There has been some recent development on the QEMU side for IGD passthrough.Updated official instructions with much clearer explanations: https://github.com/qemu/qemu/blob/master/docs/igd-assign.txtUpdated code released in QEMU v10.0.2 for better handling of legacy mode for newer Intel generations: https://gitlab.com/qemu-project/qemu/-/issues/2586Note that Unraid 7.1.4 is on QEMU v 9..x.x so we might have to wait a bit...After looking into this, there are improvements to be made to the IGD passthrough with screen output.We need to ensure QEMU is not using "legacy mode" for the IGD device, and instead, we want to use UPT mode (universal passthrough).UPT means much less reliance on the vbios rom file. Instead the guest VM is reading more of the required info from the host.The drawback is that displaying the boot screen in OVMF is not supported. We only get screen output once the guest VM has booted and loaded the display driver.For this to work, the host must expose the opregion data to the guest.And to do that, we need to:Set the IGD as the primary adapter in the host bios and boot Unraid in EFI modeTo check if both of these requirements are satisfied, go to Tools/System Devices and hover over the IGD.There must be an "Expansion ROM" entry, or UPT mode will not work. See screenshot below for an example.Remap the IGD address on the guest side so that it is NOT the default 00.02.0 (as that will trigger the legacy mode)This has to be done in the VM XML editor. The UI form view will change it back to the default when saving.Simply pick a free bus number for the device in the XML, in the example below I'm using bus 5: domain='0x0000' bus='0x05' slot='0x00' function='0x0' <hostdev mode='subsystem' type='pci' managed='yes'><driver name='vfio'/><source><address domain='0x0000' bus='0x00' slot='0x02' function='0x0'/></source><alias name='hostdev0'/><rom file='/mnt/cache/domains/iGPU_ROM_files/igd_rpls.rom'/><address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/></hostdev>That's it. All the other steps are still required, and we still need to use the rom file and add the qemu:overrides.This should be a better config for using Q35 and we get rid of these lines in the VM log, which has to be a good thing:IGD device 0000:00:02.0 cannot support legacy mode due to existing devices at address 1f.0emu-system-x86_64: vfio: Cannot reset device 0000:00:1f.3, no available reset mechanism. Edited August 8, 2025Aug 8 by Jorgen
August 6, 2025Aug 6 Author After some hardware changes, the default 'hostdev0' alias name we use in the qemu:override section got claimed by another hostdev device. And the VM failed to start.Looking into the use of alias names in libvirt, we really should be setting a manual alias for the igd device and use that in the qemu:override section.There are some rules to follow, though. From https://libvirt.org/formatdomain.html#devicesTo help users identifying devices they care about, every device can have direct child alias element which then has name attribute where users can store identifier for the device. The identifier has to have "ua-" prefix and must be unique within the domain. Additionally, the identifier must consist only of the following characters: [a-zA-Z0-9_-]. Since 3.9.0Which means we should change the igd hostdev block to:<hostdev mode='subsystem' type='pci' managed='yes'><driver name='vfio'/><source><address domain='0x0000' bus='0x00' slot='0x02' function='0x0'/></source><alias name='ua-igd'/><rom file='/mnt/cache/domains/iGPU_ROM_files/igd_rpls.rom'/><address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/></hostdev>and the qemu:override to:<qemu:override><qemu:device alias='ua-igd'><qemu:frontend><qemu:property name='x-igd-opregion' type='bool' value='true'/><qemu:property name='x-igd-gms' type='unsigned' value='2'/></qemu:frontend></qemu:device></qemu:override> Edited August 6, 2025Aug 6 by Jorgen
August 8, 2025Aug 8 Author After running the UPT/Q35 setup for a while as a daily driver now, I and seeing some issues.The occasional screen flickering is back, mainly in apps that use the camera, like Teams and Google Meet. But also VS Code and Postman seem to be affected.This flickering only appears after half a day of uptime and gets progressively worse after that.When the flickering starts happening, sometimes the network also starts to become unreliable, dropping in and out.So maybe this is not ready for prime time yet, but I'll keep using it and troubleshoot the issues as they come up.
June 28Jun 28 I cannot for the life on me get sound over HDMI on 11th gen HD750. I tried windows and linux, i440fx and q35 as well as seabios. It makes no difference no matter the permutation of with or w/o sound card, combined bios, different igpu bios. In linux sound card shows up, uses correct snd_hda_intel drivers but aplay -l shows it is only detecting analog audio and does not have any knowledge of HDMI.I am out of idea of what else I could try.
June 29Jun 29 Author 18 hours ago, Ver7o said:I cannot for the life on me get sound over HDMI on 11th gen HD750. I tried windows and linux, i440fx and q35 as well as seabios.It makes no difference no matter the permutation of with or w/o sound card, combined bios, different igpu bios.In linux sound card shows up, uses correct snd_hda_intel drivers but aplay -l shows it is only detecting analog audio and does not have any knowledge of HDMI.I am out of idea of what else I could try.Yes, this seems to be impossible with igpu pass through. I've seen many issues raised around this, but no solutions.I've been meaning to update these guides to point at a much better source of rom files (actively maintained), you might have some luck rasising an issue in there:https://github.com/LongQT-sea/intel-igpu-passthruIt's all proxmox based though, so unraid xml templates and config quirks will be confusing for them.
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.