updated to PVE 9.0 then GPU passthrough stopped working on Windows

Thank you.

I believe the following options are not available for q35

-set device.hostpci0.x-igd-lpc=on

https://github.com/qemu/qemu/blob/master/docs/igd-assign.txt

For #2, "x-igd-lpc=on" option copies the IDs of host LPC bridge and host bridge
to guest. Currently this is only supported on i440fx machines as there is
already an ICH9 LPC bridge present on q35 machines, overwriting its IDs may
lead to unexpected behavior.

I think the difference is only in the following settings, but I will try after reinstalling.

-set device.hostpci0.bus=pcie.0
 
Last edited:
I tried it but I didn't understand it, so I can't tell you what to do...

I only did the following, but I'm not sure if it's correct.
The contents that should be specified in the args listed are correct in my environment.
* I also included options that I thought were unnecessary,

Also, since it is a package distributed by an external party, it is up to you to decide whether to use it or not. I tested it in a testing environment.

If you don't know how to undo it, it's best not to use it.
Even if asked, I cannot answer, and even if someone tells me about the risks, I cannot do anything.

<https://github.com/lixiaoliu666/pve-anti-detection/releases>

wget ~/pve-qemu-kvm_10.0.2-4_amd64.deb
apt reinstall ./pve-qemu-kvm_10.0.2-4_amd64.deb
qm set <vmid> -args '-cpu host -set device.hostpci0.bus=pcie.0 set device.hostpci0.addr=0x02.0 -set device.hostpci0.x-igd-gms=0x2 -set device.hostpci0.x-igd-opregion=on -set device.hostpci0.x-igd-lpc=on'
reboot
qm set <vmid>
 
pve8 is only 2 years from release and there is one more year until eol.

pve9 has just been released and still has many glitches.

If you don't need to use pve9's features, it would be wise to keep it because pve8 has stability.

Just someone has to find the glitches in pve9...

I hope to get the functionality back that is in pve8, but it will probably rank lower than other critical issues
 
Last edited:
just check this solution with pve-anti-detection. Still getting error 43, but maybe I do something wrong.
 
@uzumo @dakralex

There is another post https://forum.proxmox.com/threads/igd-passtrhough-working-intel-uhd-770.172333/post-802844

which make use of custom rom, change machine type to i440fx and use as legacy driver. This makes error 43 gone from Windows 11 VM.

Just want to know if any clue from the team to fix this in Q35 machine or any progress on it? Do I need to file this bug to somewhere so I can get the progress for the fix?

Thanks

I didn't realize it was on the ROM side, so this was a good learning experience.

It works on Q35, but blocks appear on the screen, making it unusable.
Disabling and re-enabling the device in Windows will restore normal screen display.

I believe the fundamental issue lies with qemu10, so perhaps we should register it on Bugzilla.

However, I'm not good at either English or Linux, so I don't know if it would get across even if I submitted it, so I can't do it.

Code:
qm set 629 -args '-set device.hostpci0.bus=pcie.0 -set device.hostpci0.addr=0x02.0 -set device.hostpci0.x-igd-gms=0x0 -set device.hostpci0.x-igd-opregion=on'
qm set 629 -hostpci0 0000:00:02.0,romfile=12-n100-q10.rom

Code:
pnputil /disable-device /class Display /bus PCI /connected && pnputil /enable-device /class Display /bus PCI /connected

Error: Fixed the reversal of disable and enable.
 
Last edited:
I didn't realize it was on the ROM side, so this was a good learning experience.

It works on Q35, but blocks appear on the screen, making it unusable.
Disabling and re-enabling the device in Windows will restore normal screen display.

I believe the fundamental issue lies with qemu10, so perhaps we should register it on Bugzilla.

However, I'm not good at either English or Linux, so I don't know if it would get across even if I submitted it, so I can't do it.

Code:
qm set 629 -args '-set device.hostpci0.bus=pcie.0 -set device.hostpci0.addr=0x02.0 -set device.hostpci0.x-igd-gms=0x0 -set device.hostpci0.x-igd-opregion=on'
qm set 629 -hostpci0 0000:00:02.0,romfile=12-n100-q10.rom

Code:
pnputil /enable-device /class Display /bus PCI /connected && pnputil /disable-device /class Display /bus PCI /connected
THis one, you need to setup 0x2

Code:
-set device.hostpci0.x-igd-gms=0x0
 
  • Like
Reactions: uzumo
We modified the procedure based on the steps you created.
After making several adjustments to the virtual machine, the iGPU worked on the pc-q35 instead of the pc-i440fx. Thank you.

I removed “-set device.hostpci0.x-igd-lpc=on” because it prevented booting.

The issue of the screen filling with blocks was indeed resolved by disabling/enabling the device, so it's usable for now.

I think adding a startup option to disable/enable it would be a good idea.

* I don't fully understand the specification, but I changed device.hostpci0.x-igd-gms=0x0 to 0x2. (It worked with 0x0, but...)

Code:
sed -i '/GRUB_CMDLINE_LINUX_DEFAULT=/c GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on iommu=pt"' /etc/default/grub

mv 12-n100-q10.rom /usr/share/kvm/

cat << EOF > /etc/modules
vfio
vfio_iommu_type1
vfio_pci
EOF

qm set 629 -args '-set device.hostpci0.bus=pcie.0 -set device.hostpci0.addr=0x02.0 -set device.hostpci0.x-igd-gms=0x0 -set device.hostpci0.x-igd-opregion=on'
qm set 629 -hostpci0 0000:00:02.0,romfile=12-n100-q10.rom
qm set 629 -cpu host,hidden=1
qm set 629 -bios ovmf
qm set 629 -machine pc-q35-9.2+pve1
nano /var/lib/vz/snippets/intel_igpu_reset.sh

---
#!/bin/bash
phase="$2"
echo "Phase is $phase"
if [ "$phase" == "pre-start" ]; then
    # Unbind gpu from i915
    echo "0000:00:02.0" > /sys/bus/pci/drivers/i915/unbind 2>/dev/null
    sleep 5
elif [ "$phase" == "post-stop" ]; then
    # Unbind gpu from vfio-pci
    sleep 5
    echo "0000:00:02.0" > /sys/bus/pci/drivers/vfio-pci/unbind 2>/dev/null
    sleep 2
    # Bind i915
    echo "0000:00:02.0" > /sys/bus/pci/drivers/i915/bind 2>/dev/null
    sleep 2
fi
---

chmod +x /var/lib/vz/snippets/intel_igpu_reset.sh
qm set 629 -hookscript local:snippets/intel_igpu_reset.sh

update-initramfs -u -k all
proxmox-boot-tool refresh
update-grub
reboot

* This procedure does not require adding or editing configuration files under /etc/modprobe.d/.

To restore the display to normal, add the following to the Windows 11 startup script.

1. Press [Windows] + [R]
2. In the [Run] window, type "gpedit.msc" and click OK.
3. In the [Local Group Policy Editor] window, expand the following:
 [Computer Configration] - [Windows Setting] - [Script (Startup/Shutdown)]
4. Double-click [Startup], then click [Add].
5. In the [Add a Script] window, set the following in [Script Name], then click [OK].

Code:
pnputil /disable-device /class Display /bus PCI /connected && pnputil /enable-device /class Display /bus PCI /connected

Error: Fixed the reversal of disable and enable.
 
Last edited:
I encountered a Code 43 error with the graphics driver in my Windows 11 virtual machine when performing PCI passthrough of the integrated graphics (Intel UHD Graphics, PCI ID `0000:00:02.0`) on a Proxmox VE host equipped with an Intel Alder Lake-N N100 CPU.

How to Check Error Logs and Identify the Root Cause:

By running the `dmesg` command on the Proxmox VE host's command line, I discovered the root cause of the Code 43 error: an invalid VBIOS ROM signature.

Here are the relevant `dmesg` log snippets:

Code:
root@node-home ~
➤ dmesg | grep -i vfio
[    4.075646] VFIO - User Level meta-driver version: 0.3
[    4.088924] vfio-pci 0000:00:02.0: vgaarb: deactivate vga console
[    4.088930] vfio-pci 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem
[    4.089153] vfio_pci: add [8086:46d1[ffffffff:ffffffff]] class 0x000000/00000000
[  120.442320] vfio-pci 0000:00:02.0: resetting
[  120.546424] vfio-pci 0000:00:02.0: reset done
[  122.333493] vfio-pci 0000:00:02.0: resetting
[  122.434371] vfio-pci 0000:00:02.0: reset done
[  122.448472] vfio-pci 0000:00:02.0: resetting
[  122.554368] vfio-pci 0000:00:02.0: reset done
[  123.660367] vfio-pci 0000:00:02.0: Invalid PCI ROM header signature: expecting 0xaa55, got 0xcffa

root@node-home ~
➤ dmesg | grep -i iommu
[    0.210129] DMAR-IR: IOAPIC id 2 under DRHD base  0xfed91000 IOMMU 1
[    0.455482] pci 0000:00:02.0: DMAR: Skip IOMMU disabling for graphics
[    0.509108] iommu: Default domain type: Translated
[    0.509108] iommu: DMA domain TLB invalidation policy: lazy mode
[    0.565099] pci 0000:00:02.0: Adding to iommu group 0
# ... (Other IOMMU Groups) ...

The error message `Invalid PCI ROM header signature: expecting 0xaa55, got 0xcffa` clearly indicates that the graphics card's VBIOS ROM signature is not compliant, preventing QEMU from loading it correctly.

Solution: Provide a Compatible VBIOS ROM File and Configure the VM Correctly

The key to resolving Code 43 is to replace the problematic onboard VBIOS by providing the virtual machine with a verified, compatible VBIOS ROM file and configuring it correctly.

1. Obtain the VBIOS ROM File:
I used a custom ROM file for Intel Alder Lake-N, named `12-n100-q10.rom`. You can download it from the following link:
`https://github.com/lixiaoliu666/intel6-14rom/releases/download/v2.0-20250622-100999/12-n100-q10.rom`

2. Place the ROM File:
Upload the downloaded `12-n100-q10.rom` file to the **`/usr/share/kvm/`** directory on your Proxmox VE host.

3. Virtual Machine Configuration (`103`):
Below is my successful virtual machine configuration (`/etc/pve/qemu-server/103.conf`) that resolved the Code 43 issue. Please adjust it according to your VM ID and PCI device ID. The critical parts are the `romfile` parameter in `hostpci0`, as well as the `args` and `cpu: host,hidden=1` parameters:

Code:
    agent: 1
    args: -set device.hostpci0.bus=pcie.0 -set device.hostpci0.addr=0x02.0 -set device.hostpci0.x-igd-gms=0x2 -set device.hostpci0.x-igd-opregion=on
    balloon: 4096
    bios: ovmf
    boot: order=scsi0;ide2;ide0;net0
    cores: 3
    cpu: host,hidden=1
    efidisk0: local-lvm:vm-YOUR_VM_ID-disk-0,efitype=4m,pre-enrolled-keys=1,size=4M
    hostpci0: 0000:00:02.0,romfile=12-n100-q10.rom,pcie=1,x-vga=1
    ide0: local:iso/virtio-win-0.1.285.iso,media=cdrom,size=771138K
    ide2: local:iso/win11-iot-GENERIC_WINDOWS_IMAGE.iso,media=cdrom,size=7146500K
    machine: pc-q35-10.0+pve1
    memory: 8192
    meta: creation-qemu=10.0.2,ctime=GENERIC_TIMESTAMP
    name: win11-iot
    net0: virtio=XX:XX:XX:XX:XX:XX,bridge=vmbr0,firewall=1
    numa: 0
    ostype: win11
    scsi0: local-lvm:vm-YOUR_VM_ID-disk-1,discard=on,iothread=1,size=150G,ssd=1
    scsihw: virtio-scsi-single
    smbios1: uuid=GENERIC_UUID
    sockets: 1
    tpmstate0: local-lvm:vm-YOUR_VM_ID-disk-2,size=4M,version=v2.0
    vga: none
    vmgenid: GENERIC_VM_GEN_ID

With the above configuration, the virtual machine now boots normally, the Intel UHD Graphics card in Windows 11 loads and functions correctly, and the Code 43 error is completely resolved
 
Last edited:
  • Like
Reactions: neiion
I have this same issue with a UHD 630 igpu. I also saw the same issue as @bitfennec
Code:
dmesg | grep -i vfio
[ 3.910765] VFIO - User Level meta-driver version: 0.3
[ 29.570181] vfio-pci 0000:00:02.0: vgaarb: deactivate vga console
[ 29.570188] vfio-pci 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem
[ 29.618018] vfio-pci 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem
[ 29.618402] vfio-pci 0000:00:02.0: vgaarb: deactivate vga console
[ 29.618407] vfio-pci 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem
[ 29.641887] vfio-pci 0000:00:02.0: resetting
[ 29.742890] vfio-pci 0000:00:02.0: reset done
[ 31.823036] vfio-pci 0000:00:02.0: resetting
[ 31.927826] vfio-pci 0000:00:02.0: reset done
[ 31.983298] vfio-pci 0000:00:02.0: resetting
[ 32.086817] vfio-pci 0000:00:02.0: reset done
[ 34.791402] vfio-pci 0000:00:02.0: Invalid PCI ROM header signature: expecting 0xaa55, got 0xf23c


Then I re-enabled i915 and with debugfs tried to create the ROM file
Code:
cat /sys/kernel/debug/dri/0000:00:02.0/i915_vbt> /tmp/igpu_vbt.dump
[FONT=Calibri]# Create a 512-byte header with 0xAA55 signature
printf '\x55\xAA' | dd of=romheader.bin bs=1 count=2
dd if=/dev/zero bs=1 count=510 >> romheader.bin
# Combine header + VBT
cat romheader.bin igpu_vbt.dump > igpu_vbt.rom

cp igpu_vbt.rom /usr/share/kvm/igpu_vbt.rom

Used this rom with `romfile=/usr/share/kvm/igpu_vbt.rom`. No more Invalid PCI ROM header errors in dmesg, but windows still has error 43.[/FONT]
 
I have this same issue with a UHD 630 igpu. I also saw the same issue as @bitfennec
Code:
dmesg | grep -i vfio
[ 3.910765] VFIO - User Level meta-driver version: 0.3
[ 29.570181] vfio-pci 0000:00:02.0: vgaarb: deactivate vga console
[ 29.570188] vfio-pci 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem
[ 29.618018] vfio-pci 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem
[ 29.618402] vfio-pci 0000:00:02.0: vgaarb: deactivate vga console
[ 29.618407] vfio-pci 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem
[ 29.641887] vfio-pci 0000:00:02.0: resetting
[ 29.742890] vfio-pci 0000:00:02.0: reset done
[ 31.823036] vfio-pci 0000:00:02.0: resetting
[ 31.927826] vfio-pci 0000:00:02.0: reset done
[ 31.983298] vfio-pci 0000:00:02.0: resetting
[ 32.086817] vfio-pci 0000:00:02.0: reset done
[ 34.791402] vfio-pci 0000:00:02.0: Invalid PCI ROM header signature: expecting 0xaa55, got 0xf23c


Then I re-enabled i915 and with debugfs tried to create the ROM file
Code:
cat /sys/kernel/debug/dri/0000:00:02.0/i915_vbt> /tmp/igpu_vbt.dump
[FONT=Calibri]# Create a 512-byte header with 0xAA55 signature
printf '\x55\xAA' | dd of=romheader.bin bs=1 count=2
dd if=/dev/zero bs=1 count=510 >> romheader.bin
# Combine header + VBT
cat romheader.bin igpu_vbt.dump > igpu_vbt.rom

cp igpu_vbt.rom /usr/share/kvm/igpu_vbt.rom

Used this rom with `romfile=/usr/share/kvm/igpu_vbt.rom`. No more Invalid PCI ROM header errors in dmesg, but windows still has error 43.[/FONT]
if you can export ROM file, meaning you are able yo turn ON CSM and legacy mode from your host BIOS?

According to https://github.com/lixiaoliu666/intel6-14rom

You don't even need to embed ROM and should be able to use directly

For 6th-10th Gen Intel CPUs: If your machine supports enabling CSM in BIOS and setting the integrated graphics (iGPU) to Legacy mode, you can directly use the SeaBIOS + i440fx/Q35 configuration in a virtual machine. No additional ROM files are required (e.g., 6-14-qemu10.rom mentioned in some guides). Even if a ROM is needed, it should be extracted from your own hardware (refer to widely available online success cases).