Skip to content
View in the app

A better way to browse. Learn more.

Unraid

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

macOS Ventura KVM — AMD Radeon Pro WX 7100 GPU Passthrough: Complete Fix Guide

Featured Replies

Platform**: Unraid 6.12.54 / QEMU pc-q35-9.2 / macOS Ventura 13.x
GPU: AMD Radeon Pro WX 7100 (Polaris 10, PCI 1002:67C4)
Result: Full Metal 2 acceleration, physical DisplayPort output, stable across VM restarts


Problem Summary

After setting up AMD GPU passthrough for macOS Ventura on Unraid/KVM, three distinct problems prevented the GPU from working:

  1. GPU not recognized by macOS (IOPCISlotDevicePresent = No)

  2. Kernel panic AMD9500Controller::detectPowerDown(): GPU is not found. NO MM PCI access!!!

  3. Network (ethernet) not visible in macOS (en0 absent)


Root Causes and Fixes

Problem 1 — GPU Not Recognized (ACPI Hot-Plug Issue)

Cause: macOS Ventura uses ACPI-based PCIe enumeration (IOPCIHPType = 0x21). QEMU generates ACPI hot-plug methods for all PCIe root ports, even with hotplug='off'. When macOS sees ACPI hot-plug methods on a root port, it defers device enumeration to runtime (no boot-time probe), resulting in IOPCISlotDevicePresent = No.

Fix: Place the GPU directly on the PCIe root complex (bus 0), bypassing all root ports.

<hostdev mode='subsystem' type='pci' managed='yes'>
  <driver name='vfio'/>
  <source>
    <address domain='0x0000' bus='0x0b' slot='0x00' function='0x0'/>
  </source>
  <!-- No rom bar='off' — use native ROM -->
  <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
</hostdev>
<hostdev mode='subsystem' type='pci' managed='yes'>
  <driver name='vfio'/>
  <source>
    <address domain='0x0000' bus='0x0b' slot='0x00' function='0x1'/>
  </source>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
</hostdev>

Key points:

  • bus='0x00' = root complex (not behind a root port)

  • multifunction='on' on function 0 (GPU) so macOS sees the audio function 1

  • Do not use <rom bar='off'/> — native VBIOS is required

Why bus 0 works: macOS always enumerates devices on bus 0 (root complex) at boot without ACPI involvement. Devices behind root ports are subject to ACPI hot-plug logic and may not be enumerated at boot.


Problem 2 — Kernel Panic: NO MM PCI access

Panic message: AMD9500Controller::detectPowerDown(): GPU is not found. NO MM PCI access!!! at ATIController.cpp:3170

Cause: AMD9500Controller::detectPowerDown() reads a GPU MMIO register early in driver initialization. On Polaris10/Ellesmere GPUs, if power gating is active at that moment, the register returns 0xFFFFFFFF (GPU appears powered down), triggering the panic.

This is not a memory space enable (MSE) issue — it's a power gating race condition during the UEFI→OS transition.

Fix: Add radpg=15 to OpenCore boot-args.

radpg = Radeon Power Gating. Value 15 (0b1111) disables 4 power gating features, keeping the GPU in the active state during initialization so the MMIO register check returns a valid value.

How to set it (via Unraid SSH, with OpenCore EFI mounted):

# Mount OpenCore image (adjust partition offset as needed)
mkdir -p /mnt/opencore_efi
mount -o loop,offset=$((40*512)) /mnt/cache_nvme_1to/domains/Ventura/OpenCore-feb21-visual.img /mnt/opencore_efi

python3 -c "
import plistlib
path = '/mnt/opencore_efi/EFI/OC/config.plist'
with open(path, 'rb') as f:
    c = plistlib.load(f)
nvram = c['NVRAM']['Add']['7C436110-AB2A-4BBB-A880-FE41995C9F82']
# Add radpg=15 to boot-args
current = nvram.get('boot-args', '')
if 'radpg' not in current:
    nvram['boot-args'] = current + ' radpg=15'
with open(path, 'wb') as f:
    plistlib.dump(c, f)
print('Done:', nvram['boot-args'])
"

umount /mnt/opencore_efi

Required boot-args:

keepsyms=1 -v debug=0x100 serial=3 agdpmod=pikera radpg=15
  • agdpmod=pikera — bypasses Apple GPU Device Policy (required for non-Apple GPUs as primary display)

  • radpg=15 — disables Polaris power gating during init (fixes the panic)


Problem 3 — Network Not Visible (vmxnet3 on Wrong Bus)

Cause: Same ACPI hot-plug issue as above. Unraid VM Manager places the NIC on bus 0x01 (behind a root port) by default → macOS ignores it.

Fix: Place the NIC on bus 0x00 (root complex), slot 0x03.

<interface type='bridge'>
  <mac address='00:16:cb:43:ca:ed'/>
  <source bridge='br0'/>
  <model type='vmxnet3'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

Warning: Unraid VM Manager resets the NIC to bus 0x01 every time you edit the VM through the UI. Always use virsh edit Ventura to modify the XML directly.

vmxnet3 is natively supported by macOS (no extra kext needed) and is the correct model for KVM/QEMU macOS VMs.


Complete Working VM XML (relevant sections)

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  <name>Ventura</name>
  <memory unit='KiB'>16777216</memory>
  <vcpu placement='static'>8</vcpu>
  <os>
    <type arch='x86_64' machine='pc-q35-9.2'>hvm</type>
    <loader readonly='yes' type='pflash' format='raw'>/usr/share/qemu/ovmf-x64/OVMF_CODE-pure-efi.fd</loader>
    <nvram format='raw'>/etc/libvirt/qemu/nvram/YOUR-UUID_VARS-pure-efi.fd</nvram>
  </os>
  <cpu mode='host-passthrough' check='none' migratable='on'>
    <topology sockets='1' dies='1' clusters='1' cores='4' threads='2'/>
    <cache mode='passthrough'/>
    <feature policy='require' name='topoext'/>
  </cpu>
  <devices>
    <!-- GPU: function 0 (video) — directly on bus 0 (root complex) -->
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x0b' slot='0x00' function='0x0'/>
      </source>
      <!-- No rom bar='off' — native VBIOS required for UEFI GOP + macOS init -->
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
    </hostdev>
    <!-- GPU: function 1 (HDMI audio) -->
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x0b' slot='0x00' function='0x1'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
    </hostdev>
    <!-- NIC: vmxnet3 on bus 0 (root complex) — mandatory for macOS to see it -->
    <interface type='bridge'>
      <mac address='00:16:cb:43:ca:ed'/>
      <source bridge='br0'/>
      <model type='vmxnet3'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <!-- No VNC/QXL video device — GPU provides the display directly -->
    <memballoon model='none'/>
  </devices>
  <qemu:commandline>
    <qemu:arg value='-device'/>
    <qemu:arg value='************************'/>
    <qemu:arg value='-smbios'/>
    <qemu:arg value='type=2'/>
    <qemu:arg value='-cpu'/>
    <qemu:arg value='Skylake-Server,vendor=GenuineIntel,+hypervisor,+invtsc,kvm=on,+fma,+avx,+avx2,+aes,+ssse3,+sse4_2,+popcnt,+sse4a,+bmi1,+bmi2'/>
  </qemu:commandline>
</domain>

Required Unraid Modules

Install vendor-reset (available in Community Apps):

vendor-reset performs an AMD-specific BACO (Bus/Adapter CleAn Operation) reset when the VM stops, preventing the AMD Reset Bug from corrupting the GPU state for subsequent VM starts.

Verify it's working:

dmesg | grep AMD_POLARIS
# Should show: performing reset, reset result = 0
# After VM shutdown, PC should show a valid value (e.g. 0x294c), NOT 0xffffffff

Results

System Information Report — macOS Ventura

Graphics/Displays:
    AMD Radeon Pro WX 7100:
      Chipset Model: AMD Radeon Pro WX 7100
      VRAM (Total): 8 GB
      Vendor: AMD (0x1002)
      Device ID: 0x67c4
      Metal Support: Metal 2
      Displays:
        [Physical Monitor]:
          Resolution: 1680 x 1050 @ 60.00Hz
          Main Display: Yes
          Online: Yes

AMD kexts loaded: AMDSupport, AMD9500Controller, AMDRadeonX4000, AMDRadeonX4000HWLibs, AMDFramebuffer — all active, AMDFramebufferVIB registered (not just AtiFbStub).


Why These Fixes Are Non-Obvious

Issue

Common Assumption

Reality

GPU not enumerated

hotplug='off' fixes ACPI hot-plug

QEMU still generates ACPI methods regardless — only bus 0 avoids them

NO MM PCI access panic

MSE bit not restored after UEFI handoff

Power gating race condition — GPU enters low-power state during init

NIC invisible

vmxnet3 is not supported

vmxnet3 is fully supported, but must be on bus 0


_Tested on Unraid 6.12.54, QEMU 9.2, macOS Ventura 13.7, OpenCore 1.x with WhateverGreen + Lilu kexts.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.