After a day of hacking around with Chat GPT I've managed to get iGPU passthrough on Proxmox VE 9. Ive asked Chat GPT to write a summary of what we did to get this going. Hope this works for you.
Note massive credit goes to https://www.youtube.com/@Automation-Avenue
His video is at this link: https://www.youtube.com/watch?v=Pjjyuk4YU78&t=1241s
Also to the contributors at https://github.com/LongQT-sea/intel-igpu-passthru
Note for this exercise my Windows 11 install was VM100
HARDWARE
Model: Intel NUC 13 Pro
CPU: Intel Core i5-1340H (Raptor Lake-P, 13th Gen)
iGPU: Intel UHD Graphics (PCI ID 8086:a7a8)
No discrete GPU installed
Host OS: Proxmox VE 9
Guest: Windows 11 (VMID 100)
Goal: Use the NUC as a Proxmox host AND as a local Windows desktop via HDMI.
WHY THIS IS DIFFICULT
Modern Intel mobile iGPUs:
BIOS SETTINGS (NUC 13 PRO)
Enter BIOS (F2 at boot).
Advanced → Video:
Primary Display → HDMI1 (or the HDMI port you are using)
IGD Minimum Memory → 128MB
IGD Aperture Size → 128MB
Display Emulation → Persistent Display Emulation
Inconsistent Display Warning → Countdown
Also ensure:
Secure Boot → Enabled
UEFI Boot → Enabled
CSM → Disabled (if present)
Save and exit.
STEP 1 – ENABLE IOMMU
Open Proxmox shell.
Edit GRUB:
nano /etc/default/grub
Replace the line starting with GRUB_CMDLINE_LINUX_DEFAULT with:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb
ff video=vesafb
ff initcall_blacklist=sysfb_init"
Save and exit.
Run:
update-grub
Then reboot:
reboot
After reboot, verify:
cat /proc/cmdline
You must see intel_iommu=on and iommu=pt in the output.
STEP 2 – BIND THE IGPU TO VFIO
Confirm the GPU ID:
lspci -nn | grep VGA
For the NUC 13 Pro you should see 8086:a7a8.
Create the VFIO config:
nano /etc/modprobe.d/vfio.conf
Add:
options vfio-pci ids=8086:a7a8 disable_vga=1
Save and exit.
Update initramfs:
update-initramfs -u
Reboot:
reboot
Verify binding:
lspci -nnk -s 00:02.0
You must see:
Kernel driver in use: vfio-pci
If you do, VFIO binding is correct.
STEP 3 – DOWNLOAD AND INJECT INTEL GOP ROM
This is required for Alder Lake / Raptor Lake mobile.
Install git if needed:
apt update
apt install git -y
Download the ROM repository:
cd /usr/share/kvm
git clone https://github.com/LongQT-sea/intel-igpu-passthru.git
Copy the correct ROM for 12th/13th Gen H-series:
cp intel-igpu-passthru/roms/ADL-H_RPL-H_GOPv21_igd.rom igd.rom
Verify the ROM header:
hexdump -n 4 -C /usr/share/kvm/igd.rom
It must start with 55 aa.
STEP 4 – CREATE WINDOWS 11 VM (VM100)
Create VM normally in the GUI:
VM ID: 100
BIOS: OVMF
Add EFI disk
Install Windows completely
After installation, shut down VM100.
STEP 5 – APPLY FINAL WORKING CONFIGURATION
Stop the VM if running:
qm stop 100
Edit the VM config:
nano /etc/pve/qemu-server/100.conf
Remove any previous GPU or CPU passthrough entries.
Use this exact configuration:
bios: ovmf
machine: pc
vga: none
memory: 8192
hostpci0: 0000:00:02.0,legacy-igd=1,romfile=igd.rom
args: -cpu host,kvm=off,hv_vendor_id=GenuineIntel,hypervisor=off -set device.hostpci0.x-igd-opregion=on -set device.hostpci0.x-igd-lpc=on
Important notes:
STEP 6 – FULL POWER OFF (CRITICAL)
Do NOT just reboot.
Run:
shutdown -h now
Wait 20 seconds.
Power the NUC back on.
Start the VM:
qm start 100
EXPECTED RESULT
CODE 43 FIX (IMPORTANT)
If you get Code 43 after installing Intel drivers, the fix is:
In the args line, include:
kvm=off
hv_vendor_id=GenuineIntel
hypervisor=off
This hides the hypervisor CPUID bit. Modern Intel drivers check for virtualization and will throw Code 43 if detected.
After modifying args, always perform a full power off (shutdown -h now) before testing again.
WHY Q35 DOES NOT WORK HERE
Q35:
FINAL RESULT
This setup provides:
As a note here is my 100.conf file:
args: -cpu host,kvm=off,hv_vendor_id=GenuineIntel,hypervisor=off -set device.hostpci0>
bios: ovmf
boot: order=scsi0;ide2;net0
cores: 4
efidisk0: local-lvm:vm-100-disk-2,efitype=4m,ms-cert=2023w,pre-enrolled-keys=1,size=4M
hostpci0: 0000:00:02.0,legacy-igd=1,romfile=igd.rom
machine: pc
memory: 8192
name: Win11
net0: virtio=BC:24:11:5E:47:F8,bridge=vmbr0,firewall=1
numa: 0
ostype: win11
scsi0: local-lvm:vm-100-disk-0,iothread=1,size=132G
scsihw: virtio-scsi-single
usb0: host=6901:2701
vga: none
Hope this helps someone! Please note I am no expert I've just been hacking around.
Note massive credit goes to https://www.youtube.com/@Automation-Avenue
His video is at this link: https://www.youtube.com/watch?v=Pjjyuk4YU78&t=1241s
Also to the contributors at https://github.com/LongQT-sea/intel-igpu-passthru
Note for this exercise my Windows 11 install was VM100
HARDWARE
Model: Intel NUC 13 Pro
CPU: Intel Core i5-1340H (Raptor Lake-P, 13th Gen)
iGPU: Intel UHD Graphics (PCI ID 8086:a7a8)
No discrete GPU installed
Host OS: Proxmox VE 9
Guest: Windows 11 (VMID 100)
Goal: Use the NUC as a Proxmox host AND as a local Windows desktop via HDMI.
WHY THIS IS DIFFICULT
Modern Intel mobile iGPUs:
- Do not expose a standalone VGA ROM
- Require GOP firmware injection
- Require proper LPC routing
- Detect virtualization aggressively (Code 43)
- Fail under Q35 machine type
- Legacy IGD mode
- Injected GOP ROM
- i440fx (machine: pc)
- Hiding the hypervisor CPUID bit
BIOS SETTINGS (NUC 13 PRO)
Enter BIOS (F2 at boot).
Advanced → Video:
Primary Display → HDMI1 (or the HDMI port you are using)
IGD Minimum Memory → 128MB
IGD Aperture Size → 128MB
Display Emulation → Persistent Display Emulation
Inconsistent Display Warning → Countdown
Also ensure:
Secure Boot → Enabled
UEFI Boot → Enabled
CSM → Disabled (if present)
Save and exit.
STEP 1 – ENABLE IOMMU
Open Proxmox shell.
Edit GRUB:
nano /etc/default/grub
Replace the line starting with GRUB_CMDLINE_LINUX_DEFAULT with:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb
Save and exit.
Run:
update-grub
Then reboot:
reboot
After reboot, verify:
cat /proc/cmdline
You must see intel_iommu=on and iommu=pt in the output.
STEP 2 – BIND THE IGPU TO VFIO
Confirm the GPU ID:
lspci -nn | grep VGA
For the NUC 13 Pro you should see 8086:a7a8.
Create the VFIO config:
nano /etc/modprobe.d/vfio.conf
Add:
options vfio-pci ids=8086:a7a8 disable_vga=1
Save and exit.
Update initramfs:
update-initramfs -u
Reboot:
reboot
Verify binding:
lspci -nnk -s 00:02.0
You must see:
Kernel driver in use: vfio-pci
If you do, VFIO binding is correct.
STEP 3 – DOWNLOAD AND INJECT INTEL GOP ROM
This is required for Alder Lake / Raptor Lake mobile.
Install git if needed:
apt update
apt install git -y
Download the ROM repository:
cd /usr/share/kvm
git clone https://github.com/LongQT-sea/intel-igpu-passthru.git
Copy the correct ROM for 12th/13th Gen H-series:
cp intel-igpu-passthru/roms/ADL-H_RPL-H_GOPv21_igd.rom igd.rom
Verify the ROM header:
hexdump -n 4 -C /usr/share/kvm/igd.rom
It must start with 55 aa.
STEP 4 – CREATE WINDOWS 11 VM (VM100)
Create VM normally in the GUI:
VM ID: 100
BIOS: OVMF
Add EFI disk
Install Windows completely
After installation, shut down VM100.
STEP 5 – APPLY FINAL WORKING CONFIGURATION
Stop the VM if running:
qm stop 100
Edit the VM config:
nano /etc/pve/qemu-server/100.conf
Remove any previous GPU or CPU passthrough entries.
Use this exact configuration:
bios: ovmf
machine: pc
vga: none
memory: 8192
hostpci0: 0000:00:02.0,legacy-igd=1,romfile=igd.rom
args: -cpu host,kvm=off,hv_vendor_id=GenuineIntel,hypervisor=off -set device.hostpci0.x-igd-opregion=on -set device.hostpci0.x-igd-lpc=on
Important notes:
- Use machine: pc (i440fx)
- Do NOT use Q35
- Entire args line must be on ONE line
- Do NOT define CPU elsewhere in the file
- Do NOT use pcie=1
- Do NOT use x-vga=1
- Do NOT use rombar
STEP 6 – FULL POWER OFF (CRITICAL)
Do NOT just reboot.
Run:
shutdown -h now
Wait 20 seconds.
Power the NUC back on.
Start the VM:
qm start 100
EXPECTED RESULT
- HDMI disconnects from Proxmox console
- Monitor reconnects
- Windows boots normally
- Intel UHD loads official driver
- No Code 43
- No warning triangles
- Full hardware acceleration
CODE 43 FIX (IMPORTANT)
If you get Code 43 after installing Intel drivers, the fix is:
In the args line, include:
kvm=off
hv_vendor_id=GenuineIntel
hypervisor=off
This hides the hypervisor CPUID bit. Modern Intel drivers check for virtualization and will throw Code 43 if detected.
After modifying args, always perform a full power off (shutdown -h now) before testing again.
WHY Q35 DOES NOT WORK HERE
Q35:
- Designed primarily for discrete GPUs
- Does not correctly expose legacy IGD routing for mobile CPUs
- Breaks LPC routing required by modern Intel iGPU firmware
- Causes flickering or black screens
FINAL RESULT
This setup provides:
- Proxmox VE 9 host
- Intel NUC 13 Pro (i5-1340H)
- Single iGPU system
- Windows 11 VM100
- Direct HDMI output
- Official Intel drivers
- Stable operation
- No discrete GPU required
As a note here is my 100.conf file:
args: -cpu host,kvm=off,hv_vendor_id=GenuineIntel,hypervisor=off -set device.hostpci0>
bios: ovmf
boot: order=scsi0;ide2;net0
cores: 4
efidisk0: local-lvm:vm-100-disk-2,efitype=4m,ms-cert=2023w,pre-enrolled-keys=1,size=4M
hostpci0: 0000:00:02.0,legacy-igd=1,romfile=igd.rom
machine: pc
memory: 8192
name: Win11
net0: virtio=BC:24:11:5E:47:F8,bridge=vmbr0,firewall=1
numa: 0
ostype: win11
scsi0: local-lvm:vm-100-disk-0,iothread=1,size=132G
scsihw: virtio-scsi-single
usb0: host=6901:2701
vga: none
Hope this helps someone! Please note I am no expert I've just been hacking around.