Background
thank you to our subscribers! for making this project possible.
Kernel 6.17 is going to be needed (or backported DKMS modules) for B50/B60 SR-IOV. In addition you need specific firmware.
If you’ve been following my other content i.e. Flex 170 then you know a bit about DKMS and the out-of-tree i915 driver. Thankfully you do not need to go this route with the B50/B60.
Setting up Proxmox
It is necessary to download the Proxmox patches to the kernel and make adjustments, including to apparmor, for the newer kernel. As of 2025-10-05 Proxmox 9.x is on Kernel 6.14.8-8-2-PVE and so it isn’t a huge leap.
We also need ZFS patches, remember, for the proxmox kernel and there can be some serious side-effects of jumping the gun on PVE versions of the kernel. As such don’t use this in production until we get a fully-vetted Proxmox 9 official supported kernel.
Update: This guy beat me to it!
this is the general build guide to build your own kernel. There are .debs provided there in release, but this isn’t too hard to build your own kernel and look over the patches there for any changes. It’s a reasonable starting point.
TODO Notes
I have some notes; should submit a Pull Request and/or clone that repo. High-fives jaminmc , nice work.
Ah, he ran into the same app armor issues:
*Ok, I have worked on this for over a week. I kept having Apparmor issues, as the newer kernels changed it, and my podman container was causing it to crash, and made my system unstable. Then today I had the bright idea to just patch it back to the 6.14 apparmor. Well, that didn’t compile, but with the help of Cursor. I was able to make a 2nd patch that fixed the older apparmor to work with 6.17.
GitHub - jaminmc/pve-kernel: Read-Only source code mirror, Proxmox uses mailing list workflow for development. is the git of all the changes I made to make it work. along with GitHub - jaminmc/pve-firmware for the firmware. So you can compile it yourself, if you don’t trust me. (I wouldn’t trust any random person building the kernel)
But if you are willing to risk it, I have my compiled debs here: Release Test Kernel 6.17 · jaminmc/pve-kernel · GitHub*
Neat!
Post-Kernel Install
uname -a
Linux b50test 6.17.0-5.5-pve #1 SMP PREEMPT_DYNAMIC PMX 6.17.0-5.5 (2025-09-25T10:04Z) x86_64 GNU/Linux
That’s looking as it should.
lspci -vvv for the XE device:
03:00.0 VGA compatible controller: Intel Corporation Battlemage G21 [Intel Graphics] (prog-if 00 [VGA controller])
Subsystem: Intel Corporation Device 1114
Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0, Cache Line Size: 64 bytes
Interrupt: pin ? routed to IRQ 128
IOMMU group: 14
Region 0: Memory at 1a00000000 (64-bit, prefetchable) [size=16M]
Region 2: Memory at 1c00000000 (64-bit, prefetchable) [size=16G]
Expansion ROM at fb800000 [disabled] [size=2M]
Capabilities: [40] Vendor Specific Information: Len=0c <?>
Capabilities: [70] Express (v2) Endpoint, IntMsgNum 0
DevCap: MaxPayload 256 bytes, PhantFunc 0, Latency L0s unlimited, L1 unlimited
ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset+ SlotPowerLimit 0W TEE-IO-
DevCtl: CorrErr- NonFatalErr- FatalErr- UnsupReq-
RlxdOrd+ ExtTag+ PhantFunc- AuxPwr- NoSnoop+ FLReset-
MaxPayload 256 bytes, MaxReadReq 512 bytes
DevSta: CorrErr- NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend-
LnkCap: Port #0, Speed 2.5GT/s, Width x1, ASPM L0s L1, Exit Latency L0s <64ns, L1 <1us
ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp+
LnkCtl: ASPM L1 Enabled; RCB 64 bytes, LnkDisable- CommClk-
ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
LnkSta: Speed 2.5GT/s, Width x1
TrErr- Train- SlotClk- DLActive- BWMgmt- ABWMgmt-
DevCap2: Completion Timeout: Range B, TimeoutDis+ NROPrPrP- LTR+
10BitTagComp+ 10BitTagReq+ OBFF Not Supported, ExtFmt+ EETLPPrefix-
EmergencyPowerReduction Not Supported, EmergencyPowerReductionInit-
FRS- TPHComp- ExtTPHComp-
AtomicOpsCap: 32bit- 64bit- 128bitCAS-
DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-
AtomicOpsCtl: ReqEn-
IDOReq- IDOCompl- LTR+ EmergencyPowerReductionReq-
10BitTagReq- OBFF Disabled, EETLPPrefixBlk-
LnkCap2: Supported Link Speeds: 2.5GT/s, Crosslink- Retimer- 2Retimers- DRS-
LnkCtl2: Target Link Speed: 2.5GT/s, EnterCompliance- SpeedDis-
Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS-
Compliance Preset/De-emphasis: -6dB de-emphasis, 0dB preshoot
LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete- EqualizationPhase1-
EqualizationPhase2- EqualizationPhase3- LinkEqualizationRequest-
Retimer- 2Retimers- CrosslinkRes: unsupported
Capabilities: [ac] MSI: Enable+ Count=1/1 Maskable+ 64bit+
Address: 00000000fee00000 Data: 0000
Masking: 00000000 Pending: 00000000
Capabilities: [d0] Power Management version 3
Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold-)
Status: D3 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
Capabilities: [100 v1] Alternative Routing-ID Interpretation (ARI)
ARICap: MFVC- ACS-, Next Function: 0
ARICtl: MFVC- ACS-, Function Group: 0
Capabilities: [110 v1] Null
Capabilities: [200 v1] Address Translation Service (ATS)
ATSCap: Invalidate Queue Depth: 00
ATSCtl: Enable+, Smallest Translation Unit: 00
Capabilities: [420 v1] Physical Resizable BAR
BAR 2: current size: 16GB, supported: 256MB 512MB 1GB 2GB 4GB 8GB 16GB
Capabilities: [220 v1] Virtual Resizable BAR
BAR 2: current size: 2GB, supported: 256MB 512MB 1GB 2GB 4GB 8GB 16GB
Capabilities: [320 v1] Single Root I/O Virtualization (SR-IOV)
IOVCap: Migration- 10BitTagReq+ IntMsgNum 0
IOVCtl: Enable- Migration- Interrupt- MSE- ARIHierarchy+ 10BitTagReq-
IOVSta: Migration-
Initial VFs: 12, Total VFs: 12, Number of VFs: 0, Function Dependency Link: 00
VF offset: 1, stride: 1, Device ID: e212
Supported Page Size: 00000553, System Page Size: 00000001
Region 0: Memory at 0000001a01000000 (64-bit, prefetchable)
Region 2: Memory at 0000002000000000 (64-bit, prefetchable)
VF Migration: offset: 00000000, BIR: 0
Capabilities: [400 v1] Latency Tolerance Reporting
Max snoop latency: 1048576ns
Max no snoop latency: 1048576ns
Kernel driver in use: xe
Kernel modules: xe
Ohhh home drool emojii
Capabilities: [320 v1] Single Root I/O Virtualization (SR-IOV)
IOVCap: Migration- 10BitTagReq+ IntMsgNum 0
IOVCtl: Enable- Migration- Interrupt- MSE- ARIHierarchy+ 10BitTagReq-
IOVSta: Migration-
Initial VFs: 12, Total VFs: 12, Number of VFs: 0, Function Dependency
Now, we need to enable SR-IOV functions, which involves finding the device under /sys/devices
in my case lspci shows 03:00.0 which was at:
root@b50test:/sys/devices/pci0000:00/0000:00:01.1/0000:01:00.0/0000:02:01.0/0000:03:00.0
In this folder is sriov_numvfs so we just echo 4 > sriov_numvfs
running that doesn’t return an error, however the kernel debug log output looks very promising:
[ 542.166252] xe 0000:03:00.0: [drm] GT0: PF: VF1..VF4 provisioned with 1045172224 (997 MiB) GGTT
[ 542.167608] xe 0000:03:00.0: [drm] GT0: PF: VF1..VF4 provisioned with 4234149888 (3.94 GiB) LMEM
[ 542.167842] xe 0000:03:00.0: [drm] GT0: PF: VF1..VF4 provisioned with 16319 GuC context IDs
[ 542.168063] xe 0000:03:00.0: [drm] GT0: PF: VF1..VF4 provisioned with 64 GuC doorbell IDs
[ 542.168376] xe 0000:03:00.0: [drm] GT1: PF: VF1..VF4 provisioned with 16319 GuC context IDs
[ 542.168591] xe 0000:03:00.0: [drm] GT1: PF: VF1..VF4 provisioned with 64 GuC doorbell IDs
[ 542.276147] pci 0000:03:00.1: [8086:e212] type 00 class 0x030000 PCIe Endpoint
[ 542.276331] pci 0000:03:00.1: Adding to iommu group 33
[ 542.276701] pci 0000:03:00.1: vgaarb: no bridge control possible
[ 542.276703] pci 0000:03:00.1: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none
[ 542.276705] xe 0000:03:00.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=none:owns=io
[ 542.276707] amdgpu 0000:10:00.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=none:owns=none
[ 542.276785] xe 0000:03:00.1: enabling device (0000 -> 0002)
[ 542.277423] xe 0000:03:00.1: [drm] Running in SR-IOV VF mode
[ 542.279645] xe 0000:03:00.1: [drm] VF: migration not supported by this module version
[ 542.285772] xe 0000:03:00.1: [drm] VISIBLE VRAM: 0x0000002000000000, 0x0000000100000000
[ 542.285774] xe 0000:03:00.1: [drm] VRAM[0, 0]: Actual physical size 0x00000000fc600000, usable size exclude stolen 0x00000000fc600000, CPU accessible size 0x00000000fc600000
[ 542.285776] xe 0000:03:00.1: [drm] VRAM[0, 0]: DPA range: [0x0000000000000000-fc600000], io range: [0x0000002000000000-20fc600000]
[ 542.285778] xe 0000:03:00.1: [drm] Total VRAM: 0x0000002000000000, 0x00000000fc600000
[ 542.285780] xe 0000:03:00.1: [drm] Available VRAM: 0x0000002000000000, 0x00000000fc600000
[ 542.344635] xe 0000:03:00.1: [drm] GT0: ccs1 fused off
[ 542.344641] xe 0000:03:00.1: [drm] GT0: ccs2 fused off
[ 542.344642] xe 0000:03:00.1: [drm] GT0: ccs3 fused off
[ 542.353810] xe 0000:03:00.1: [drm] GT1: vcs1 fused off
[ 542.353812] xe 0000:03:00.1: [drm] GT1: vcs3 fused off
[ 542.353813] xe 0000:03:00.1: [drm] GT1: vcs4 fused off
[ 542.353814] xe 0000:03:00.1: [drm] GT1: vcs5 fused off
[ 542.353815] xe 0000:03:00.1: [drm] GT1: vcs6 fused off
[ 542.353816] xe 0000:03:00.1: [drm] GT1: vcs7 fused off
[ 542.353817] xe 0000:03:00.1: [drm] GT1: vecs2 fused off
[ 542.353818] xe 0000:03:00.1: [drm] GT1: vecs3 fused off
[ 542.358961] [drm] Initialized xe 1.1.0 for 0000:03:00.1 on minor 3
[ 542.359151] pci 0000:03:00.2: [8086:e212] type 00 class 0x030000 PCIe Endpoint
[ 542.359310] pci 0000:03:00.2: Adding to iommu group 34
[ 542.359422] pci 0000:03:00.2: vgaarb: no bridge control possible
[ 542.359424] pci 0000:03:00.2: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none
[ 542.359426] xe 0000:03:00.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=none:owns=io
[ 542.359428] amdgpu 0000:10:00.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=none:owns=none
[ 542.359490] xe 0000:03:00.2: enabling device (0000 -> 0002)
[ 542.359780] xe 0000:03:00.2: [drm] Running in SR-IOV VF mode
[ 542.360041] xe 0000:03:00.2: [drm] VF: migration not supported by this module version
[ 542.360631] xe 0000:03:00.2: [drm] VISIBLE VRAM: 0x0000002100000000, 0x0000000100000000
[ 542.360633] xe 0000:03:00.2: [drm] VRAM[0, 0]: Actual physical size 0x00000000fc600000, usable size exclude stolen 0x00000000fc600000, CPU accessible size 0x00000000fc600000
[ 542.360635] xe 0000:03:00.2: [drm] VRAM[0, 0]: DPA range: [0x0000000000000000-fc600000], io range: [0x0000002100000000-21fc600000]
[ 542.360637] xe 0000:03:00.2: [drm] Total VRAM: 0x0000002100000000, 0x00000000fc600000
[ 542.360638] xe 0000:03:00.2: [drm] Available VRAM: 0x0000002100000000, 0x00000000fc600000
[ 542.431217] xe 0000:03:00.2: [drm] GT0: ccs1 fused off
[ 542.431221] xe 0000:03:00.2: [drm] GT0: ccs2 fused off
[ 542.431222] xe 0000:03:00.2: [drm] GT0: ccs3 fused off
[ 542.435802] xe 0000:03:00.2: [drm] GT1: vcs1 fused off
[ 542.435805] xe 0000:03:00.2: [drm] GT1: vcs3 fused off
[ 542.435806] xe 0000:03:00.2: [drm] GT1: vcs4 fused off
[ 542.435807] xe 0000:03:00.2: [drm] GT1: vcs5 fused off
[ 542.435808] xe 0000:03:00.2: [drm] GT1: vcs6 fused off
[ 542.435809] xe 0000:03:00.2: [drm] GT1: vcs7 fused off
[ 542.435810] xe 0000:03:00.2: [drm] GT1: vecs2 fused off
[ 542.435811] xe 0000:03:00.2: [drm] GT1: vecs3 fused off
[ 542.440128] [drm] Initialized xe 1.1.0 for 0000:03:00.2 on minor 4
[ 542.440296] pci 0000:03:00.3: [8086:e212] type 00 class 0x030000 PCIe Endpoint
[ 542.440481] pci 0000:03:00.3: Adding to iommu group 35
[ 542.440836] pci 0000:03:00.3: vgaarb: no bridge control possible
[ 542.440838] pci 0000:03:00.3: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none
[ 542.440840] xe 0000:03:00.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=none:owns=io
[ 542.440842] amdgpu 0000:10:00.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=none:owns=none
[ 542.440907] xe 0000:03:00.3: enabling device (0000 -> 0002)
[ 542.441025] xe 0000:03:00.3: [drm] Running in SR-IOV VF mode
[ 542.442089] xe 0000:03:00.3: [drm] VF: migration not supported by this module version
[ 542.443881] xe 0000:03:00.3: [drm] VISIBLE VRAM: 0x0000002200000000, 0x0000000100000000
[ 542.443883] xe 0000:03:00.3: [drm] VRAM[0, 0]: Actual physical size 0x00000000fc600000, usable size exclude stolen 0x00000000fc600000, CPU accessible size 0x00000000fc600000
[ 542.443885] xe 0000:03:00.3: [drm] VRAM[0, 0]: DPA range: [0x0000000000000000-fc600000], io range: [0x0000002200000000-22fc600000]
[ 542.443887] xe 0000:03:00.3: [drm] Total VRAM: 0x0000002200000000, 0x00000000fc600000
[ 542.443889] xe 0000:03:00.3: [drm] Available VRAM: 0x0000002200000000, 0x00000000fc600000
[ 542.514306] xe 0000:03:00.3: [drm] GT0: ccs1 fused off
[ 542.514308] xe 0000:03:00.3: [drm] GT0: ccs2 fused off
[ 542.514309] xe 0000:03:00.3: [drm] GT0: ccs3 fused off
[ 542.520234] xe 0000:03:00.3: [drm] GT1: vcs1 fused off
[ 542.520236] xe 0000:03:00.3: [drm] GT1: vcs3 fused off
[ 542.520237] xe 0000:03:00.3: [drm] GT1: vcs4 fused off
[ 542.520238] xe 0000:03:00.3: [drm] GT1: vcs5 fused off
[ 542.520239] xe 0000:03:00.3: [drm] GT1: vcs6 fused off
[ 542.520240] xe 0000:03:00.3: [drm] GT1: vcs7 fused off
[ 542.520241] xe 0000:03:00.3: [drm] GT1: vecs2 fused off
[ 542.520242] xe 0000:03:00.3: [drm] GT1: vecs3 fused off
[ 542.524715] [drm] Initialized xe 1.1.0 for 0000:03:00.3 on minor 5
[ 542.524886] pci 0000:03:00.4: [8086:e212] type 00 class 0x030000 PCIe Endpoint
[ 542.525096] pci 0000:03:00.4: Adding to iommu group 36
[ 542.525212] pci 0000:03:00.4: vgaarb: no bridge control possible
[ 542.525214] pci 0000:03:00.4: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none
[ 542.525215] xe 0000:03:00.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=none:owns=io
[ 542.525217] amdgpu 0000:10:00.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=none:owns=none
[ 542.525265] xe 0000:03:00.4: enabling device (0000 -> 0002)
[ 542.525488] xe 0000:03:00.4: [drm] Running in SR-IOV VF mode
[ 542.525769] xe 0000:03:00.4: [drm] VF: migration not supported by this module version
[ 542.526381] xe 0000:03:00.4: [drm] VISIBLE VRAM: 0x0000002300000000, 0x0000000100000000
[ 542.526384] xe 0000:03:00.4: [drm] VRAM[0, 0]: Actual physical size 0x00000000fc600000, usable size exclude stolen 0x00000000fc600000, CPU accessible size 0x00000000fc600000
[ 542.526387] xe 0000:03:00.4: [drm] VRAM[0, 0]: DPA range: [0x0000000000000000-fc600000], io range: [0x0000002300000000-23fc600000]
[ 542.526389] xe 0000:03:00.4: [drm] Total VRAM: 0x0000002300000000, 0x00000000fc600000
[ 542.526391] xe 0000:03:00.4: [drm] Available VRAM: 0x0000002300000000, 0x00000000fc600000
[ 542.592657] xe 0000:03:00.4: [drm] GT0: ccs1 fused off
[ 542.592661] xe 0000:03:00.4: [drm] GT0: ccs2 fused off
[ 542.592662] xe 0000:03:00.4: [drm] GT0: ccs3 fused off
[ 542.597185] xe 0000:03:00.4: [drm] GT1: vcs1 fused off
[ 542.597187] xe 0000:03:00.4: [drm] GT1: vcs3 fused off
[ 542.597188] xe 0000:03:00.4: [drm] GT1: vcs4 fused off
[ 542.597189] xe 0000:03:00.4: [drm] GT1: vcs5 fused off
[ 542.597190] xe 0000:03:00.4: [drm] GT1: vcs6 fused off
[ 542.597191] xe 0000:03:00.4: [drm] GT1: vcs7 fused off
[ 542.597193] xe 0000:03:00.4: [drm] GT1: vecs2 fused off
[ 542.597194] xe 0000:03:00.4: [drm] GT1: vecs3 fused off
[ 542.600567] [drm] Initialized xe 1.1.0 for 0000:03:00.4 on minor 6
[ 542.600894] xe 0000:03:00.0: [drm] PF: Enabled 4 of 12 VFs
and the output of lspci has changed:
03:00.0 VGA compatible controller: Intel Corporation Battlemage G21 [Intel Graphics]
03:00.1 VGA compatible controller: Intel Corporation Battlemage G21 [Intel Graphics]
03:00.2 VGA compatible controller: Intel Corporation Battlemage G21 [Intel Graphics]
03:00.3 VGA compatible controller: Intel Corporation Battlemage G21 [Intel Graphics]
03:00.4 VGA compatible controller: Intel Corporation Battlemage G21 [Intel Graphics]
From here we simply pass through a virtual function to a VM and install the XE drivers (which are kinda beta atm!)
It is worth checking also that lspci shows the Xe graphics device bound to vfio-pci instead of xe:
Kernel driver in use: vfio-pci
Kernel modules: xe
… you can resort to manual blacklisting but so far modern Proxmox is pretty good about Doing The Right Thing without resorting to blacklisting.
Set up the VM
Do the normal windows install, with something like these settings. We do not map the GPU yet!
Note I recommend mapping TWO isos to the vm, one that is your windows install ISO and one that contains the VirtIO drivers:
https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers
(download from proxmox or IBM)
Disk setup (oh no, there is no disk!)
just hit browse, and go to vioscsi

and install those drivers. then the disk will show up:

… this driver has much less overhead and performs well vs alternatives.
From there, that will get you to a “normal” windows desktop. It is now that I would suggest enabling remote desktop and making sure you can RDP into this VM from another machine.
To attach the SR-IOV virtual funciton, that is done in the datacenter area of proxmox:
Datacenter > resource mappings > add the .1 .2 .3 .4 (etc) virtual functions that showed up in lspci earlier.
then, in the VM you created, it is possible to add a pcie device:
Note: Be sure to select advanced and then pcie=1
It is possible to add it as the primary gpu device but generally I don’t do that until 1) it is on the network and RDP is working and 2) the drivers are installed. So it can be a bit of a two step process here.
It can also solve some weird bugs in this beta state to remove the spice/vnc display adapter once you have this one working. Hence why it is a good idea to setup RDP ahead of time.
The 2025-10-1 drivers seem to have some bug that causes windows 11 to crash before login and RDP not to work (immediate log out/explorer crashes).
… so you need to start with this older driver and see how it goes.
https://www.intel.com/content/www/us/en/download/741626/intel-arc-pro-graphics-windows.html
These drivers are confirmed working (albeit … somewhat beta). Note I recommend you setup your B50 in a stand-alone windows machine and install this driver. It has a firmware update bundled in the driver. Firmware can’t update on vfio stubs:

… and then finally check out that sweet tasty gpu accelerated RDP session:
all gpu utilization, no cpu utilization dragging around the virtual earth thingie.
heaven: at ~~150+ fps
the performance can be very inconsistent running heaven, for example. from 20 to 150fps, especially when running lots of copies of heaven at once.
but this is quite promising.
Note: Still Writing this up this very minute…









