Anyone using Proxmox VE?

Hey people,

I just got Proxmox iGPU passthrough on my framework desktop board working after the BIOS upgrade. Not quite sure if the VBIOS changed and that was the key (but I am attaching checksum information on the used ROMS in any case).

Had LLMs help me summarize the complete state of my system and how I got there:
I am absolutely sure that not everything is needed to be set like this for it to work. But sometimes it is nice to have a really detailed description of a working system.

(If this is considered too much spam/AI Slop I will be happy to shorten/redact)

Update: There is more to it :
(Excuse the multiple edits, this was quite a journey. I briefly thought I was going insane. After playing around some more and rebooting, without changing anything, the driver stopped loaded correctly on the guest. So I kept retracing what I did before I got it into the working state.)
It turns out that it only works if you do a warm-up binding procedure on the host, where you first unbind from vfio and then rebind to amdgpu. Note that the kernel must not be blacklisted for that.

echo 0000:c8:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind
echo 0000:c8:00.0 > /sys/bus/pci/drivers/amdgpu/bind
qm start <VM_Number>

It then even works again after rebooting/shutting down the guest virtual machine gracefully.
Hard stopping with qm stop <VM_Number> brings the system into an unstable state.
Trying to unbind/rebind in this unstable state leads to a crash of the host…

I will keep on reporting, for now I think I will just have a script automatically do the warmup on host boot and pray that the guest does not crash ungracefully while I am playing with it…

So here we go:

Overview

Complete setup for passing through AMD Strix Halo integrated GPU (Radeon 8050S/8060S Graphics) to a Proxmox VM with UEFI support.

Tested on:

  • Proxmox VE 9.0.11

  • Kernel: Linux version 6.14.11-4-pve (build@proxmox) (gcc (Debian 14.2.0-19) 14.2.0, GNU ld (GNU Binutils for Debian) 2.44) #1 SMP PREEMPT_DYNAMIC PMX 6.14.11-4 (2025-10-10T08:04Z)

Prerequisites

1. Update Framework Desktop BIOS

Using the newest Framework Desktop BIOS 3.03:


# Update BIOS using fwupdmgr

fwupdmgr refresh --force

fwupdmgr get-updates

fwupdmgr update

Note: Ensure charger is attached during BIOS update and do not interrupt power during the process.

2. Configure BIOS/Firmware Settings

Access BIOS setup (F2 during boot) and configure:

Administer Secure Boot:

  • Secure Boot: Disabled

Setup Utility/Advanced/:

  • iGPU Memory Configuration: Custom

  • iGPU Memory Size: 96GB

Setup Utility/Security/:

  • TPM Availability: Hidden

Host Configuration

3. Enable IOMMU


# Edit /etc/kernel/cmdline

root=ZFS=rpool/ROOT/pve-1 boot=zfs quiet amd_iommu=on iommu=pt video=efifb:off

4. Configure VFIO Modules


# Create /etc/modules-load.d/vfio.conf

vfio

vfio_iommu_type1

vfio_pci

vfio_virqfd

5. VBIOS Extraction

Important: VBIOS extraction requires the amdgpu driver to be loaded. Do this before creating the blacklist:

  1. Create VBIOS extraction tool (vbios.c):
  1. Extract VBIOS (while amdgpu driver is available):

gcc vbios.c -o vbios

./vbios

# This creates vbios_1002_1586.bin

  1. Place VBIOS file:

mv vbios_1002_1586.bin /usr/share/kvm/

6. Blacklist Host GPU Drivers

( do not blacklist amdgpu, because we need it for the warmup procedure)


# Create /etc/modprobe.d/blacklist-gpu.conf 

blacklist radeon

blacklist snd_hda_intel

7. Bind GPU to VFIO


# Create /etc/modprobe.d/vfio.conf

options vfio-pci ids=1002:1586,1002:1640

softdep amdgpu pre: vfio-pci

softdep snd_hda_intel pre: vfio-pci

VM Configuration

8. Guest OS Setup

Install required packages in the guest:


# For Arch Linux (example)

sudo pacman -Syu --noconfirm linux-firmware mesa vulkan-radeon xf86-video-amdgpu

# For Ubuntu/Debian

sudo apt update && sudo apt install -y linux-firmware mesa-vulkan-drivers xserver-xorg-video-amdgpu

Force GPU driver detection in guest:


# Add to guest kernel command line (e.g., /boot/loader/entries/*.conf for systemd-boot)

options root=ZFS=rpool/ROOT/pve-1 boot=zfs quiet amdgpu.force_probe=1002:1586

9. VM Settings

Verify GPU PCI addresses:


# Find GPU devices - should show c8:00.0 (display) and c8:00.1 (audio)

lspci -nnk | grep -iE "vga|display|audio" -A3

# Look for devices with IDs 1002:1586 (display) and 1002:1640 (audio)

# Note: Ignore any "pcilib: Error reading /sys/bus/pci/devices/.../label: Operation not permitted" warnings - they are harmless


# /etc/pve/qemu-server/100.conf

agent: 1

bios: ovmf

boot: order=scsi0;ide2;net0

cores: 16

cpu: host

efidisk0: local-zfs:vm-100-disk-3,efitype=4m,pre-enrolled-keys=0,size=1M

hostpci0: 0000:c8:00.0,pcie=1,x-vga=1,romfile=vbios_1002_1586.bin

hostpci1: 0000:c8:00.1,pcie=1,romfile=AMDGopDriver.rom

machine: q35,viommu=virtio

memory: 16384

vga: none

ROM Files

10. Required ROM Files

  • VBIOS: vbios_1002_1586.bin (17,408 bytes)

  • MD5: 8f2d1e6c0a333d39117849bbfccbb1d7

  • SHA256: 35ea302fd1cf5e1f7fbbc34c37e43cccc6e5ffab8fa1f335f4d10ad1d577627d

  • UEFI ROM: AMDGopDriver.rom (92,672 bytes)

  • MD5: 4c0fee922ddf6afbe4ff6d50c9af211b

  • SHA256: 1c2b9dc8bd931b98e0a0097b3169bff8e00636eb6c144a86be9873ebfd6e3331

11. UEFI ROM Setup


# Download AMDGopDriver.rom

wget https://github.com/isc30/ryzen-gpu-passthrough-proxmox/raw/main/AMDGopDriver.rom -O /usr/share/kvm/AMDGopDriver.rom

12. Reboot the host and apply warmup procedure

echo 0000:c8:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind
echo 0000:c8:00.0 > /sys/bus/pci/drivers/amdgpu/bind
qm start <VM_ID>

After starting the VM, proxmox binds vfio again and the driver is loaded correctly in the guest. It keeps working correctly, as long as the host is shutdown gracefully reboot or shutdown.

Warning: A cold “stop” of the VM in proxmox qm stop <VM_id> (or via GUI) leaves the system in an unstable state. After a non-graceful stop, restarting the VM leads to driver errors.
Trying to unbind and rebind the pci address completely crashed the kernel.
Also, after the first restart I did not get HDMI output, but I do not care, since I am running this machine headless for my use case.

Verification

The setup is successful when guest dmesg (on the guest) shows:

  • Fetched VBIOS from VFCT
  • [drm] Loading DMUB firmware via PSP: version=0x09002E00
  • Initialized amdgpu 3.64.0 for 0000:01:00.0 on minor 0
  • No PSP firmware loading errors

References

2 Likes