Skip to content
View in the app

A better way to browse. Learn more.

Unraid

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Guide - Intel Alderlake (Gen 12) iGPU passthrough to Windows 10 VM

Featured Replies

  • Author

Updated instructions for OVMF and Q35

There has been some recent development on the QEMU side for IGD passthrough.

  1. Updated official instructions with much clearer explanations: https://github.com/qemu/qemu/blob/master/docs/igd-assign.txt

  2. Updated code released in QEMU v10.0.2 for better handling of legacy mode for newer Intel generations: https://gitlab.com/qemu-project/qemu/-/issues/2586
    Note 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:

  1. Set the IGD as the primary adapter in the host bios and boot Unraid in EFI mode
    To 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.

  2. 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>

Screenshot 2025-08-03 at 1.48.49 pm.png

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.0

emu-system-x86_64: vfio: Cannot reset device 0000:00:1f.3, no available reset mechanism.

Edited by Jorgen

  • 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#devices

To 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.0

Which 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 by Jorgen

  • 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.

  • 10 months later...

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.

  • 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-passthru
It'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.

Guest
Reply to this topic...

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.