- ASL 100%
| arch-gpu-passthrough.conf | ||
| LICENSE | ||
| p2000-vbios.rom | ||
| readme.org | ||
| ssdt_battery.dat | ||
| ssdt_loading_rom.aml | ||
| ssdt_loading_rom.asl | ||
| win11-virsh.xml | ||
NVIDIA Quadro P2000 Mobile GPU Passthrough
- Overview
- My Hardware
- Host stack
- Files in this repo
- Why each workaround is needed
- Known failure modes
- License
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.0and01: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.