Intel igpu passthru
Intel GVT-d – iGPU passthrough done right (Proxmox / QEMU / KVM)
- OpROM/VBIOS for use with GVT-d iGPU passthrough on Proxmox/QEMU/KVM. - Support direct UEFI display output over HDMI, eDP, DVI, and DisplayPort. - Provides perfect display without screen distortion. - Supports Windows, Linux, and even **macOS** guests. - Fixes Code 43 errors in Windows guests with iGPU passthrough. - Also compatible with SR-IOV virtual functions to fix Code 43 errors.[^1] The project is written primarily in Shell, distributed under the BSD 2-Clause "Simplified" License license, first published in 2025. Key topics include: gvt-d, gvt-g, i915-sriov, igd, igpu-passthrough.
Overview
- OpROM/VBIOS for use with GVT-d iGPU passthrough on Proxmox/QEMU/KVM.
- Support direct UEFI display output over HDMI, eDP, DVI, and DisplayPort.
- Provides perfect display without screen distortion.
- Supports Windows, Linux, and even macOS guests.
- Fixes Code 43 errors in Windows guests with iGPU passthrough.
- Also compatible with SR-IOV virtual functions to fix Code 43 errors.1
Table of Contents
- Requirements
- Setup Instructions
- Additional Resources & Documentation
- Credits & Acknowledgments
- Contributing
- Attribution & License
- Disclaimer
Requirements
-
Intel CPU with integrated graphics (2nd generation or newer)
-
BIOS/UEFI settings:
- UEFI-only boot mode (Disable Legacy/CSM in BIOS/UEFI settings)2
- VGA OpROM set to UEFI (usually disabling Legacy/CSM is enough)
- Enable Intel VT-d (Intel Virtualization for Directed I/O)
- Initial/Primary graphics adapter set to IGD / iGPU / Integrated
-
Host OS:
- Proxmox VE 9.1 or newer
- Modern Linux distributions (kernel 6.8 or newer)
- IOMMU enabled (enabled by default in Proxmox VE 8.2 and newer)
- Optional:
blacklist i915may be required to enable maximum supported resolution and refresh rate
-
Guest OS:
- Use OVMF firmware.
- For a headless setup, ensure the guest OS is already installed and has remote access configured (RDP or VNC).
[!IMPORTANT]
Make suredisable_vga=1is not set anywhere in/etc/modprobe.d/vfio.confor in your kernel parameters (/etc/default/grub). If it is, remove it, then runupdate-grub,update-initramfs -uand reboot.
[!IMPORTANT]
Meteor Lake, Arrow Lake, Lunar Lake and future Intel iGPU require QEMU 10.1+ (kvm --version)3.
[!TIP]
With Proxmox VE 8.2 and newer, this works without following PCI passthrough guides such as Proxmox PCI Passthrough.
[!NOTE]
macOS requires additional configuration: macOS_README.md
Setup Instructions
1. ROM File Selection
Choose the appropriate ROM file for your Intel CPU and download/copy it to /usr/share/kvm/
- For example, if you have an i7-8700K (Coffee Lake CPU), right-click
CFL_CML_GOPv9.1_igd.romand select “Copy link address” - Then, open the Proxmox VE shell and run the following command to save it as
igd.romin/usr/share/kvm/:
Replace <ROM_URL> with the link you just copied
bashcurl -L <ROM_URL> -o /usr/share/kvm/igd.rom
| Intel Generation | ROM File | GOP Version | Supported CPUs |
|---|---|---|---|
| Sandy Bridge (2nd gen) | SNB_GOPv2_igd.rom | v2 | Core i3/i5/i7 2xxx |
| Ivy Bridge (3rd gen) | IVB_GOPv3_igd.rom | v3 | Core i3/i5/i7 3xxx |
| Haswell/Broadwell (4th/5th gen) | HSW_BDW_GOPv5_igd.rom | v5 | Core i3/i5/i7 4xxx-5xxx |
| Skylake to Comet Lake (6/7/8/9/10th gen) | SKL_CML_GOPv9_igd.rom | v9 | Core i3/i5/i7/i9 6xxx-10xxx |
| Coffee/Comet Lake (8/9/10th gen) | CFL_CML_GOPv9.1_igd.rom | v9.1 | Core i3/i5/i7/i9 8xxx-10xxx |
| Gemini Lake (Low-end Pentium/Celeron) | GLK_GOPv13_igd.rom | v13 | Pentium/Celeron J/N 4xxx/5xxx |
| Ice Lake (10th gen mobile) | ICL_GOPv14_igd.rom | v14 | Core i3/i5/i7 10xxG1/G4/G7 |
| Rocket/Tiger/Alder/Raptor Lake (11/12/13/14th gen) | RKL_TGL_ADL_RPL_GOPv17_igd.rom | v17 | Core i3/i5/i7/i9 11xxx-14xxx |
| Rocket/Tiger/Alder/Raptor Lake (11/12/13/14th gen) | RKL_TGL_ADL_RPL_GOPv17.1_igd.rom | v17.1 | Core i3/i5/i7/i9 11xxx-14xxx |
| Jasper Lake (Low-end Pentium/Celeron) | JSL_GOPv18_igd.rom | v18 | Pentium/Celeron N 4xxx/5xxx/6xxx |
| Alder Lake-H/P/U / Raptor Lake-H/P/U (12/13/14th gen mobile) | ADL-H_RPL-H_GOPv21_igd.rom | v21 | Core i3/i5/i7/i9 12xxx-14xxx H/P/U |
| Alder Lake-N / Twin Lake (N-series) | ADL-N_TWL_GOPv21_igd.rom | v21 | N95/N97/N1xx/N2xx/N3xx |
| Arrow Lake / Meteor Lake | ARL_MTL_GOPv22_igd.rom | v22 | Core Ultra series |
| Lunar Lake | LNL_GOPv2X_igd.rom | (unknown) | Core Ultra series |
| Panther Lake-H | PTL-H_igd.rom | (unknown) | Core Ultra series |
| All Gens - No UEFI GOP | Universal_noGOP_igd.rom | (none) | All Intel CPUs with iGPU4 |
[!Note]
UseUniversal_noGOP_igd.romas a last resort if other ROMs cause issues. ThisUniversalROM does not include the Intel GOP driver (UEFI Graphics Output Protocol), display output will only work after the guest VM drivers are fully loaded.
sha256sum: Release page
2. VM Configuration
Proxmox VE
Choose a mode: This determines how display outputs (HDMI, eDP, DVI, DisplayPort) behave.
- Legacy Mode (Recommended): Display output becomes active as soon as the VM starts.
- UPT Mode (Experimental): Display output becomes active only after the guest OS drivers have loaded.
Legacy Mode
- Open Proxmox VE Shell and run:
Replace
[VMID]with your real VM ID.
bashqm set [VMID] --machine pc \ --vga none \ --bios ovmf \ --hostpci0 0000:00:02.0,legacy-igd=1,romfile=igd.rom
[!IMPORTANT]
Ice Lake, Rocket Lake, Tiger Lake, Alder Lake, and newer CPUs require additional QEMU argument5:qm set [VMID] --args "-set device.hostpci0.x-igd-lpc=on"
[!TIP]
In legacy mode passthrough, these custom args are not needed:
-set device.hostpci0.bus=pci.0 -set device.hostpci0.addr=2.0 -set device.hostpci0.x-igd-opregion=on -set device.hostpci0.x-igd-gms=0x2 -set device.hostpci0.x-vga=on
UPT Mode
[!WARNING]
UPT Mode is not officially supported by this project.The configuration below is provided as a convenience for advanced users and testers.
Bug reports related exclusively to UPT mode may be closed without investigation.
- Open Proxmox VE Shell and run:
Replace
[VMID]with your real VM ID.
bashqm set [VMID] --bios ovmf \ --hostpci0 0000:00:02.0,romfile=igd.rom \ --args "-set device.hostpci0.bus=pci.0 -set device.hostpci0.addr=2.0 -set device.hostpci0.x-igd-opregion=on"
[!TIP]
You should useUniversal_noGOP_igd.romin UPT mode.
Other Linux Distributions (QEMU/KVM)
QEMU Command Line args:
- Machine Type: i440fx (
-machine pc) - Display: None (
-vga none) - Firmware: OVMF/UEFI (
-bios /path/to/ovmfor-pflash /path/to/ovmf) - iGPU PCI device:
-device vfio-pci,host=0000:00:02.0,id=hostpci0,bus=pci.0,addr=2.0,x-igd-lpc=on,romfile=/usr/share/kvm/igd.rom
Additional Resource and Documentation
- QEMU IGD assignment documentation
- Intel EDK2 GVT-d patchset (from eci.intel.com)
- Intel GVT-d Documentation
Credits & Acknowledgments
Source Code Authors
Based on EDK2 patches authored by:
- Colin Xu (colin.xu@intel.com) & Laszlo Ersek (lersek@redhat.com) — IgdAssignmentDxe implementation
- Colin Xu (colin.xu@intel.com) — Platform GOP Policy, OpRegion 2.1 support
- Xiong Zhang (xiong.y.zhang@intel.com) — VBT data handling
Special Thanks
- Tomita Moeko for DXE drivers supporting VFIO IGD passthrough
- Alex Williamson for IGD assignment support in QEMU
- The QEMU/KVM Community for IGD assignment documentation
- All community members who tested and provided feedback
Contributing
Contributions are welcome! Please:
- Test configurations thoroughly
- Report issues with detailed system information
Attribution & License
This project is licensed under the BSD 2-Clause License (see LICENSE file).
If you create content using this project (videos, blog posts, tutorials, articles):
- Please link back to this repository:
https://github.com/LongQT-sea/intel-igpu-passthru - Mention that detailed requirements and instructions are in this GitHub repo.
Thank you for respecting the work that went into this project!
Disclaimer
This project is provided “as‑is”, without any warranty, for educational and research purposes. In no event shall the authors or contributors be liable for any direct, indirect, incidental, special, or consequential damages arising from use of the project, even if advised of the possibility of such damages.
All product names, trademarks, and registered trademarks are property of their respective owners. All company, product, and service names used in this repository are for identification purposes only.
Footnotes
-
When using Intel iGPU SR-IOV virtual functions, some driver versions may cause a Code 43 error on Windows guests. To ensure compatibility across all driver versions, an OpROM is required. ↩
-
Some motherboards may require setting the OS Type to Windows in order to disable Legacy/CSM. ↩
-
You will get this error message on Meteor Lake and newer:
IGD device 0000:00:02.0 is unsupported in legacy mode, try SandyBridge or newer. This is fixed in QEMU 10.1.x (7969cf4639). ↩ -
Sandy Bridge and newer. Use
Universal_noGOP_igd.romas a last resort if other ROMs cause issues. ThisUniversalROM does not include the Intel GOP driver (UEFI Graphics Output Protocol), so display output will only work after the guest VM drivers are loaded. ↩ -
QEMU 10.1+ includes this commit dd69d84604, which restricts legacy mode to iGPU from Sandy Bridge to Comet Lake. ↩
Contributors
Showing top 2 contributors by commit count.
