[SOLVED] Issues with Intel ARC A770M GPU Passthrough on NUC12SNKi72 (vfio-pci not ready after FLR or bus reset)

I did dump my own vbios and try that. I will try again on another VM build.

It does work fine on Bazzite without issue, so definitely a weird Windows driver/firmware problem.
 
Have an update for you. Decided to use the firmware tool and go back to the last WHQL on the previous SOC firmware version (DG02_1.3257. Current version is DG02_1.3266 and has been since October 2024.) When windows detected the GPU and installed the built-in driver, I had a Code 43. I installed 101.6078 WHQL driver and it complained that it was older than what was installed, but it worked!

This is on a fresh, unmodified Windows 11 25H2. I did modify the Windows Update policy to disable driver updates. I have not dumped the vBIOS or done any custom cli commands, but am running the hookscript on the vm config. Just added the GPU as PCIe devices and it is working. Rebooting and everything without issue.

Obviously newer drivers have worked, so I think I am going to keep updating to see which version breaks everything. I went back to September 2025 WHQL and had issues, but that was before I rolled firmware back to September 2024.

Screenshot 2026-02-05 102723.pngScreenshot 2026-02-05 102911.png
 
Last edited:
  • Like
Reactions: UmbraAtrox
Thanks for the update ❤️. I'm still on fresh Vm with one driver back, still crashing in random intervals. Gotta try going back further. Quick Q: did you downgrade flash the card in a vm with passthough or baremetal? (Guess it shouldn't make a difference when vbios dumped the same checksum, but curious.) And, do you use a dummy plug? If yes hdmi or dp?
 
Last edited:
I downgraded on baremetal and am currently using an HDMI dummy plug. I know the HDMI interface on Arc is odd and emulated or something, so I do want to try getting a native DP dummy plug.

I have tried updating to newer drivers, but would keep getting a code 43, but a simple rollback would fix it. I have had no crashing issues to speak of. I am doing this on a Dell T7920 workstation with dual CPUs and no REBAR support unfortunately.
 
So turns out "stuck in D3" was my PSU kicking the bucket. Haven't dared to update windows drivers past 32.0.101.8331 or upgrade card firmware, guess that's how it's going to be for a while.

Dunno if it helps someone: i've changed my hookscript to enable AI stuff in lxc and keep on demand passthrough. Ditched the whole blacklisting (blacklist.conf & vfio.conf) and using xe driver on host (experimental on Alchemist?) (grub cmdline "xe.force_probe=56a1 i915.force_probe=!56a1").
Lxc <-> VM back and forth seems to work pretty flawless now with passed vbios to VM. Giving the card back to xe driver rather than leaving it floating in an unreset state after VM shutdown also seems to do something because it gets rid of occasional artifacing on subsequent VM starts.

(Haven't figured yet how to reattach to running lxc when VM releases the gpu without restarting lxc. Have to shutdown container before shutting down VM else host creates new /dev/dri nodes, but that's a quest for another day/thread i guess)

Current hooksript:
(maybe wait until someone who actually knows what they're doing confirms it's fine before using. Works for me though)
Code:
#!/bin/bash

# Arguments from Proxmox: $1 = VMID, $2 = phase (pre-start, post-start, pre-stop, post-stop)
VMID=$1
PHASE=$2

# PCI addresses from lspci
GPU="0000:03:00.0"  # VGA PCI address
AUDIO="0000:04:00.0"  # Audio PCI address
GPU_ID="8086 56a1"  # Vendor:Device for GPU
AUDIO_ID="8086 4f90"  # For audio
HOST_VGA_DRIVER="xe"
HOST_AUDIO_DRIVER="snd_hda_intel"

if [ "$PHASE" = "pre-start" ]; then
    # Before VM start: Detach from host drivers, bind to VFIO
    echo "Detaching GPU $GPU and audio $AUDIO from host drivers..."

    # Unbind GPU and audio if bound
    echo "$GPU" > /sys/bus/pci/devices/"$GPU"/driver/unbind 2>/dev/null
    echo "$AUDIO" > /sys/bus/pci/devices/"$AUDIO"/driver/unbind 2>/dev/null

    # Bind to VFIO
    echo "$GPU_ID" > /sys/bus/pci/drivers/vfio-pci/new_id 2>/dev/null
    echo "$AUDIO_ID" > /sys/bus/pci/drivers/vfio-pci/new_id 2>/dev/null

    echo "GPU bound to VFIO for VM $VMID."
    echo "Arc hook: Disabling reset methods for $GPU and $AUDIO"
    echo > /sys/bus/pci/devices/$GPU/reset_method
    echo > /sys/bus/pci/devices/$AUDIO/reset_method
fi

if [ "$PHASE" = "post-stop" ]; then
    # After VM shutdown: Unbind from VFIO, rebind to host
    echo "Rebinding GPU $GPU and audio $AUDIO to host drivers..."

    # Unbind from VFIO
    echo "$GPU" > /sys/bus/pci/drivers/vfio-pci/unbind 2>/dev/null
    echo "$AUDIO" > /sys/bus/pci/drivers/vfio-pci/unbind 2>/dev/null

    # Remove IDs from VFIO (optional?)
    echo "$GPU_ID" > /sys/bus/pci/drivers/vfio-pci/remove_id 2>/dev/null
    echo "$AUDIO_ID" > /sys/bus/pci/drivers/vfio-pci/remove_id 2>/dev/null

    # Remove devices and rescan PCI bus (Turns out it didn't need those)
    #echo 1 > /sys/bus/pci/devices/"$GPU"/remove 2>/dev/null
    #echo 1 > /sys/bus/pci/devices/"$AUDIO"/remove 2>/dev/null
    #echo 1 > /sys/bus/pci/rescan

    # Rebind to host drivers
    echo "$GPU" > /sys/bus/pci/drivers/"$HOST_VGA_DRIVER"/bind 2>/dev/null
    echo "$AUDIO" > /sys/bus/pci/drivers/"$HOST_AUDIO_DRIVER"/bind 2>/dev/null

    echo "GPU rebound to host for VM $VMID."
fi
 
I
Success!! TLDR: add a hook script to clear the reset_methods at VM pre-start

catting the reset_methods gave flr bus, the 2 methods not working above. However clearing it completely allowed the VM to boot and see the attached dGPU and its Audio controller:

Code:
echo > /sys/bus/pci/devices/0000:03:00.0/reset_method
echo > /sys/bus/pci/devices/0000:04:00.0/reset_method

The commands above would only work for the 1st attempt after boot (as suggested above). Subsequent VM starts would lock up due to vfio bus resets (but not FLR??), even though the reset_method still appeared to be cleared in sysfs.

Subsequent VM starts appear to be successful if clearing reset_methods as per above is run prior to each VM restart. Hence the hook script listed below.

Observed the following working:
  • Installed latest WHQL ARC drivers
    • GPU-Z detects resizable bar enabled for the ARC, but Intel driver detects resizable bar not enabled in the VM BIOS (which I think is something still to be developed in QEMU).
  • HDMI output via the Intel dGPU
  • dGPU Audio device detected (but haven't tested)
  • For fun,
    • Passthrough of WIFI (PCI: 0000:00:14.3) and BlueTooth (USB: 8087:0033).
    • Youtube/Edge video decode via dGPU
    • Blender running and using dGPU
    • Hot-plugged wireless USB mouse/keyboard.
    • Ran another Win11 VM using a SR-IOV iGPU VF at the same time.
Note: Due to above success, I didn't end applying the softdeps.

hookscript (based on template from https://gist.github.com/kiler129/215e2c8de853209ca429ad5ed40ce128):
Code:
#!/bin/bash
set -e -o errexit -o pipefail -o nounset

# located in /var/lib/vz/snippets/intel-dGPU-hookscript.sh or your 'snippets' location.
# Add to VM via: qm set VMID --hookscript local:snippets/intel-dGPU-hookscript.sh

# Do not modify these variables (set by Proxmox when calling the script)
vmId="$1"
runPhase="$2"
echo "Running $runPhase on VM=$vmId"

case "$runPhase" in
    pre-start)
        # Clear the reset methods before each start of the VM, to prevent the PVE host locking up
        # flr and bus methods dont work and re-appear after reboots.
        # bus method may still be attempted in subseqent VM starts, even if reset_method already cleared.
        echo "VM=$vmId - $runPhase : Clearing Intel dGPU and audio device reset_methods."
        echo > /sys/bus/pci/devices/0000:03:00.0/reset_method
        echo > /sys/bus/pci/devices/0000:04:00.0/reset_method

        # will appear as the following in journalctl:
        #  kernel: vfio-pci 0000:03:00.0: All device reset methods disabled by user
        #  kernel: vfio-pci 0000:04:00.0: All device reset methods disabled by user
    ;;

    post-start)
        # placeholder .
        echo "VM=$vmId - $runPhase : No Action."
      ;;

    pre-stop)
        # placeholder .
        echo "VM=$vmId - $runPhase : No Action."
      ;;
    post-stop)
        # placeholder .
        echo "VM=$vmId - $runPhase : No Action."
      ;;
    *)
      echo "Unknown run phase \"$runPhase\"!"
      ;;
esac
echo "Finished $runPhase on VM=$vmId"


Working VM config:
Code:
root@nuc12:~# cat /etc/pve/qemu-server/103.conf
affinity: 0-11
agent: 1
balloon: 8192
bios: ovmf
boot: order=virtio0;net0
cores: 6
cpu: host
efidisk0: local-zfs:vm-103-disk-0,efitype=4m,pre-enrolled-keys=1,size=1M
hookscript: local:snippets/intel-dGPU-hookscript.sh
hostpci0: 0000:03:00,pcie=1,x-vga=1
hostpci1: 0000:04:00,pcie=1
hostpci2: 0000:00:14.3,pcie=1
machine: pc-q35-8.0
memory: 16384
meta: creation-qemu=8.0.2,ctime=1688796354
name: win11vfio
net0: virtio=4A:3D:7D:C5:35:B8,bridge=vmbr0,firewall=1
numa: 0
ostype: win11
scsihw: virtio-scsi-single
smbios1: uuid=d421488c-841e-43fa-90d9-33fe4349eb61
sockets: 1
tpmstate0: local-zfs:vm-103-disk-1,size=4M,version=v2.0
usb0: host=1997:2433,usb3=1
usb1: host=8087:0033,usb3=1
virtio0: local-zfs:vm-103-disk-2,iothread=1,size=256G
vmgenid: 1873c979-4993-4627-aa05-20bb0ac28468
I can't get the VM to start with the hookscript enabled. I modified everything to match my PCIe addresses (67:00.0 for the GPU and 68:00.0 for the audio). I'm using an ARC A310 and these commands work fine when I put them in manually
Code:
echo > /sys/bus/pci/devices/0000:67:00.0/reset_method
echo > /sys/bus/pci/devices/0000:68:00.0/reset_method
But when I add the hookscript to the VM config I get this error in Proxmox when I try to start the VM:
Code:
TASK ERROR: hookscript error for 203 on pre-start: command '/var/lib/vz/snippets/intel-dGPU-hookscript.sh 203 pre-start' failed: open3: exec of /var/lib/vz/snippets/intel-dGPU-hookscript.sh 203 pre-start failed: No such file or directory at /usr/share/perl5/PVE/Cmd.pm line 174.

Is there something missing from my server that I need in order to be able to get the VM to start? It's a pain to have to enter those commands every time I need to shutdown/reboot the VM