March 23Mar 23 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 restartsProblem SummaryAfter setting up AMD GPU passthrough for macOS Ventura on Unraid/KVM, three distinct problems prevented the GPU from working:GPU not recognized by macOS (IOPCISlotDevicePresent = No)Kernel panic AMD9500Controller::detectPowerDown(): GPU is not found. NO MM PCI access!!!Network (ethernet) not visible in macOS (en0 absent)Root Causes and FixesProblem 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 1Do not use <rom bar='off'/> — native VBIOS is requiredWhy 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 accessPanic message: AMD9500Controller::detectPowerDown(): GPU is not found. NO MM PCI access!!! at ATIController.cpp:3170Cause: 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_efiRequired boot-args:keepsyms=1 -v debug=0x100 serial=3 agdpmod=pikera radpg=15agdpmod=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 ModulesInstall 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 0xffffffffResultsSystem 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: YesAMD kexts loaded: AMDSupport, AMD9500Controller, AMDRadeonX4000, AMDRadeonX4000HWLibs, AMDFramebuffer — all active, AMDFramebufferVIB registered (not just AtiFbStub).Why These Fixes Are Non-ObviousIssueCommon AssumptionRealityGPU not enumeratedhotplug='off' fixes ACPI hot-plugQEMU still generates ACPI methods regardless — only bus 0 avoids themNO MM PCI access panicMSE bit not restored after UEFI handoffPower gating race condition — GPU enters low-power state during initNIC invisiblevmxnet3 is not supportedvmxnet3 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.