A backup of my qemu files needed to passthrough my Quadro P2000 Mobile
Find a file
2026-09-14 00:25:53 +05:00
arch-gpu-passthrough.conf Add required files and a readme explaining their use 2026-09-14 00:25:53 +05:00
LICENSE Initial commit 2026-09-13 16:03:11 +00:00
p2000-vbios.rom Add required files and a readme explaining their use 2026-09-14 00:25:53 +05:00
readme.org Add required files and a readme explaining their use 2026-09-14 00:25:53 +05:00
ssdt_battery.dat Add required files and a readme explaining their use 2026-09-14 00:25:53 +05:00
ssdt_loading_rom.aml Add required files and a readme explaining their use 2026-09-14 00:25:53 +05:00
ssdt_loading_rom.asl Add required files and a readme explaining their use 2026-09-14 00:25:53 +05:00
win11-virsh.xml Add required files and a readme explaining their use 2026-09-14 00:25:53 +05:00

NVIDIA Quadro P2000 Mobile GPU Passthrough

Overview

Working PCI passthrough of an NVIDIA Quadro P2000 Mobile (GP107GLM) to a Windows 11 guest on Arch Linux. This was my second or third time trying gpu passthrough and the first time I succeded in doing so. There are still more optimization needed. The passthrough is successful but I am not sure if its working perfectly.

My Hardware

Component Value
Laptop HP ZBook 15 G5
CPU Intel i7-8850H (6c/12t)
GPU Quadro P2000 Mobile 10de:1cba
GPU audio 10de:0fb9
Subsystem HP 103c:842a
vBIOS 86.07.67.00.10 (1CBA-975-A1)

Host stack

  • Arch Linux, kernel with intel_iommu=on iommu=pt
  • QEMU 11.1.0, libvirt 12.6.0
  • vfio-pci bound to both 01:00.0 and 01:00.1

Files in this repo

File Purpose Source
arch-gpu-passthrough.conf systemd-boot entry with VFIO kernel cmdline
win11-virsh.xml Full libvirt domain XML
p2000-vbios.rom Dumped physical vBIOS Dumped using nouveau
ssdt_battery.dat Fake ACPI battery table (required for mobile driver) lion328 and Arch Wiki
ssdt_loading_rom.asl ACPI _ROM method source lion328
ssdt_loading_rom.aml Compiled ACPI table Compiled from .asl file using iasl -tc filename.asl

Why each workaround is needed

Fake battery (ssdt_battery.dat)

NVIDIA mobile drivers refuse to load on a platform that reports no battery. This is a blanket check, not a real power-management need.

Injected via -acpitable file=....

ACPI _ROM SSDT (ssdt_loading_rom)

For my graphic card, The NVIDIA mobile driver reads the vBIOS through the ACPI _ROM method, not the PCI ROM BAR. Without it, the driver throws Code 43 even when <rom bar="on" file="..."/> is present.

The SSDT must target the GPU's actual ACPI scope in the guest. On my machine that is:

\_SB.PCI0.S14.S00

Find yours via Windows Device Manager → GPU → Details → "BIOS device name". Targeting the wrong path might OVMF to hang at boot.

The vBIOS is delivered via an fw_cfg entry:

<sysinfo type="fwcfg">
  <entry name="opt/com.lion328/nvidia-rom"
         file="/path/to/p2000-vbios.rom"/>
</sysinfo>

Same-root-port aggregation

For my machine the GPU and its HDMI/DP audio function must appear as functions of the same virtual PCI device (same bus/slot, functions 0x0 and 0x1), not on separate root ports. NVIDIA's mobile driver treats split root ports as an authenticity failure.

Relevant XML:

<hostdev ...>           <!-- GPU -->
  <address type="pci" domain="0x0000"
           bus="0x05" slot="0x00" function="0x0"
           multifunction="on"/>
</hostdev>
<hostdev ...>           <!-- Audio -->
  <address type="pci" domain="0x0000"
           bus="0x05" slot="0x00" function="0x1"/>
</hostdev>

multifunction="on" goes on the <address> element of the first function only.

Subsystem ID override

QEMU does not forward the host subsystem ID by default. I needed to override it explicitly so the driver sees the HP IDs:

<qemu:override>
  <qemu:device alias="hostdev0">
    <qemu:frontend>
      <qemu:property name="x-pci-sub-vendor-id"
                     type="unsigned" value="4156"/>   <!-- 0x103c -->
      <qemu:property name="x-pci-sub-device-id"
                     type="unsigned" value="33834"/>  <!-- 0x842a -->
    </qemu:frontend>
  </qemu:device>
</qemu:override>

Patching the vBIOS

Some tutorials suggest patching the dumped vBIOS but I tried that and the patched vBIOS did not work. I also suspect that I did not use the correct tool. But unpatched vBIOS worked for me so I did not need a patched vBIOS. I dumped my vBIOS using nouveau as I could not do it with nvflash or nvidia-smi. I also could not find rom for my card on https://techpowerup.com either.

Known failure modes

  • Boot freeze after adding SSDT: ACPI scope path is wrong. Verify with Device Manager "BIOS device name".
  • Duplicate GPU entries in Device Manager: a previous VM run used a different guest PCI address. Remove with "Show hidden devices" and reboot.

License

See LICENSE.