AMD Radeon RX6950XT spoofing for macOS VM

george

Member
Jan 11, 2021
16
3
8
Motherboard: Asus Rampage V Extreme (X99), 4101 BIOS
GPU: AMD Radeon RX 6950 XT (Reference)
Proxmox: 7.4-3, 6.2.9-1 kernel

I am able to passthrough and spoof the GPU on a Windows 10 VM and a Linux Mint 21.1 VM and get signal from the card's displayport but I have not been able to do it on a macOS 13 Ventura VM. The GPU needs to be spoofed to an RX 6900 XT (from 0x73A5 to 0x73BF) which is natively supported by Monterey/Ventura but no matter what I have tried with BIOS, OpenCore (quirks, SSDTs, etc), Proxmox (grub options, module blacklisting, kernel firmwares, qemu options, romfiles, etc), with or without a monitor connected, it has failed. At best, I have managed to make it post like 6900XT (0x73BF) in Ventura by means of changing the Device ID in Proxmox VM settings (hostpci0: 0000:03:00,device-id=0x73BF) but on the guest the card still acts like software rendering and the UI is snail-slow.

My rather bloated grub cmdline is currently:

Code:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt irqpoll intremap=no_x2apic_optout pcie_aspm=off pcie_acs_override=downstream,multifunction pci=nobar,noats"

I am NOT blacklisting amdgpu in /etc/modprobe.d/blacklist.conf , since the new AMD 6000 series are supposed to behave well and bind/unbind to/from vfio on demand with the new Proxmox kernel. No vendor-reset needed either. I have tried with options vfio_iommu_type1 allow_unsafe_interrupts=1 and without.

If I rely on Proxmox's PCI Device settings for the VM and change the Device ID, I can only boot the macOS Ventura VM when ROM-Bar is enabled, otherwise it gets stuck. But even when successfully booting with this way, the video output from the GPU's displayport is stuck with the Apple logo and if I connect remotely (e.g. with Apple Remote Desktop or NoMachine) I get a non-accelerated GPU there, even though macOS's System Information DOES recognise it as a GPU display with 1002:73bf Vendor/Device ID (but little less info, no total VRAM, etc). GLView reports "Apple Software Renderer".

IOReg Name is:
Code:
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SF0@1E/IOPP/pci-bridge@1/IOPP/GFX0@10

Device path is:
Code:
PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x10,0x0)

I i do not change the Device ID in Proxmox, then I do get displayport video output, non-accelerated 800x600 resolution, and 1002:73a5 GPU with 1MB VRAM with same ACPI paths. I have still not managed to compile a SSDT that works.
 
Last edited:
OK, maybe I have found it. The culprit is that, per instructions, I had the following in the args of the VM conf file:

-global 'ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off'

If I turn it to on or if I just remove it then my custom OpenCore SSDT for GPU spoofing works and I have accelerated graphics and supported Metal. The card is recognised now as:

rx1.png

rx2.png

rx3.png

In summary:
1) I tried to trim the kernel options in Proxmox's Grub command line:
Code:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt irqpoll intremap=no_x2apic_optout pcie_aspm=off"
2) I disabled all ASPM support in Asus BIOS at <Advanced>/<Platform Misc Configuration> (not sure if it matters)
3) I disabled CSM (Compatibility Support Module) in BIOS at <Boot>.
4) I upgraded to latest Proxmox 7.4 and opted in for the 6.2 kernel.
5) I did NOT blacklist amdgpu at /etc/modprobe.d/blacklist.conf
6) I did NOT add any AMD GPUs PCI ids in options vfio-pci ids=... at /etc/modprobe.d/vfio.conf, NOR did I early bind amdgpu there with softdep.
7) I did NOT use /etc/modprobe.d/iommu_unsafe_interrupts.conf , i.e. I commented the line:
Code:
#options vfio_iommu_type1 allow_unsafe_interrupts=1
8) I did NOT use options kvm-intel nested=1
9) For my VM conf file important options were (mind the on for ICH9-LPC.acpi-pci-hotplug-with-bridge-support):
Code:
args: -device isa-applesmc,osk="......" -smbios type=2 -device usb-kbd,bus=ehci.0,port=2 -global nec-usb-xhci.msi=off -global 'ICH9-LPC.acpi-pci-hotplug-with-bridge-support=on' -cpu host,kvm=on,vendor=GenuineIntel,+kvm_pv_unhalt,+kvm_pv_eoi,+hypervisor,+invtsc,,+pcid,+ssse3,+sse4.2,+popcnt,+avx,+avx2,+aes,+fma,+bmi1,+bmi2,+xsave,+xsaveopt,check
bios: ovmf
cpu: host
hostpci0: 0000:03:00
machine: q35
vga: none
If ROM-Bar is unselected then VM booting hangs before an IP is assigned (I haven't checked yet with logs, I had read somewhere that verbose booting "-v" in OpenCore might result in a black screen with AMD GPU passthrough/spoofing).
If a romfile is provided the whole Proxmox host/server crashes.
I did NOT select "Primary GPU", "PCI-Express" or any Vendor/Device ID setting in Proxmox.
rx5.png


10) On the macOS 13.3.1 Ventura VM (vga: vmware and Apple Remote Desktop are your friends), I got the ACPI path from gfxutil:
Code:
06:10.0 1002:73a5 /PCI0@0/SF0@1E/pci-bridge@1/GFX0@10 = PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x10,0x0)
11) Accordingly, I created a custom SSDT (now that I look at it it might be wrong) for OpenCore in order to rename the unknown "pci-bridge@1" bridge, rename "SF0" to "SF0_" as ACPI requires (???) that device names are 4 characters, and insert the addresses (tricky !!!):
Code:
DefinitionBlock ("", "SSDT", 2, "hack", "spoof1", 0x00000000)
{
    External (_SB_.PCI0.SF0_, DeviceObj)

    Device (_SB.PCI0.SF0.PBR0)
    {
        Name (_ADR, 0x1E)  // _ADR: Address
        Device (GFX0)
        {
            Name (_ADR, 0x10)  // _ADR: Address
        }
    }

    Method (_SB.PCI0.SF0.PBR0.GFX0._DSM, 4, NotSerialized)  // _DSM: Device-Specific Method
    {
        If ((!Arg2 || !_OSI ("Darwin")))
        {
            Return (Buffer (One)
            {
                 0x03
            })
        }

        Return (Package (0x02)
        {
            "device-id",
            Buffer (0x04)
            {
                 0xBF, 0x73, 0x00, 0x00
            }
        })
    }
}
11b) Even better/simpler, do it on OpenCore config.plist at <DeviceProperties>:
Code:
<key>DeviceProperties</key>
<dict>
    <key>Add</key>
    <dict>
        <key>PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x10,0x0)</key>
        <dict>
            <key>device-id</key>
            <data>v3MAAA==</data>
            <key>device_type</key>
            <string>VGA compatible controller</string>
            <key>model</key>
            <string>Radeon RX 6950 XT</string>
        </dict>
    </dict>
    <key>Delete</key>
    <dict/>
</dict>

rx4.png
12) In OpenCore I used iMacPro1,1 smbios. For Kernel kexts I just updated the existing ones (Lilu, WhateverGreen, AppleALC) that Nicholas Sherlock has in his tutorial to the latest versions. I changed a couple of OpenCore options and quirks here and there (including "Cpuid1Data", "ProcessorType", added "agdpmod=pikera -radcodec" in "boot-args"), adapting for my hardware and after reading the OpenCore Install Guide at dortania
 
Last edited:
  • Like
Reactions: T.Herrmann
Dear George, this is an important issue also for me.

I'm working for a long time to get a S7150 (Tonga XT GL Device ID 0x6929) Card working in MacOS inside Server System with Proxmox as Hypervisor. Until now without success. I was where confused that the spoofing just by Proxmox was working fine in Windows and Linux VM's but not in MacOS VM. If I used native supported AMD RX460 oder RX560 It worked flawless. I read at some source the SSDT way doesn't work well with Hypervisors like Proxmox only with bare metal Hackintosh. Best Tim
 
Hi Tim, sorry, I am not familiar with the Tonga XT GL, I suppose you are trying to pass it as an AMD FirePro W7100 (0x692B) ? Did you try first with OpenCore or Clover first in bare metal ? Did you consider flashing the GPU with a W7100 ROM ?
 
Hi Tim, sorry, I am not familiar with the Tonga XT GL, I suppose you are trying to pass it as an AMD FirePro W7100 (0x692B) ? Did you try first with OpenCore or Clover first in bare metal ? Did you consider flashing the GPU with a W7100 ROM ?
Hi George, bare metal is no option because it is a rack server system as hypervisor. We need for more than one MacOS Instance. It tried to pass it as (0x6939) Tonga PRO [Radeon R9 285/380]. I used several methods Proxmox ID Spoof, SSDT, OpenCore config.plist at <DeviceProperties>. The Device ID is changing but no Kexts will be used. Bios Flashing could be an option. Has you some Idea or do you see a wrong workflow here? Thank you. Best Tim

.Mac_1.pngMac_2.pngMac_5.pngMac_4.pngMac_3.pngMac_4.png
 

Attachments

  • Bildschirmfoto 2023-05-04 um 18.25.38.png
    Bildschirmfoto 2023-05-04 um 18.25.38.png
    31.1 KB · Views: 17
  • Mac_6.png
    Mac_6.png
    118.5 KB · Views: 20
I take out "agdpmod=pikera" from the boot arguments. No effect. The kexts will be loaded but something is missing.
 

Attachments

  • Bildschirmfoto 2023-05-05 um 16.47.22.png
    Bildschirmfoto 2023-05-05 um 16.47.22.png
    622.3 KB · Views: 17
  • Bildschirmfoto 2023-05-05 um 16.48.23.png
    Bildschirmfoto 2023-05-05 um 16.48.23.png
    530.6 KB · Views: 12
  • Bildschirmfoto 2023-05-05 um 16.48.32.png
    Bildschirmfoto 2023-05-05 um 16.48.32.png
    461.9 KB · Views: 13
  • Bildschirmfoto 2023-05-05 um 16.48.40.png
    Bildschirmfoto 2023-05-05 um 16.48.40.png
    556.9 KB · Views: 13
  • Bildschirmfoto 2023-05-05 um 16.48.50.png
    Bildschirmfoto 2023-05-05 um 16.48.50.png
    561 KB · Views: 18
  • Bildschirmfoto 2023-05-05 um 16.48.59.png
    Bildschirmfoto 2023-05-05 um 16.48.59.png
    508.1 KB · Views: 18
Hi Tim, sorry but I do not have my initial setup anymore due to an unrelated hardware problem. In any case, many of the things I wrote might only work for that hardware combination. E.g. I had to remove the option "ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off" from my VM conf (or turn the option to on) in order to make the 6950 XT work but this did not apply for earlier/natively-supported GPUs I tried (RX580 and Vega64, which also required vendor-reset but no spoofing was needed) - if I did, these would only work in unaccelerated mode. Also, keep in mind that I had the latest 6.x PVE kernel on Proxmox.
 
Last edited:
Dear George, yes I try it also on the newest Kernel and QEMU Version. There is on interesting thing by the ACPI PCI path between Windows an Other OS Config.

If change the OSTyp.

VM OSType Other:
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SE0@1C/IOPP/GFX0@0
PciRoot(0x1)/Pci(0x1C,0x0)/Pci(0x0,0x0)

VM OSType: Win10:
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SE0@1C/IOPP/GFX0@0
PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)

Mentioned here also: https://forum.proxmox.com/threads/h...breaks-monitor-connection.121309/#post-560188
 
Hello @george , thank you so much for all the information!
In the end of the story you could passthrough the RX6950XT and use with full performance?
I'm really struggling here to do it with my ASUS Z790-A WIFI .
 
Hi @leandrorossi , yes it works for me. I didn't use the computer for some time because of an unrelated hardware problem but now it is back online. Meanwhile I have upgraded the motherboard to an Asus PRIME X299-Deluxe, the CPU to an i9-10920X and Proxmox to 8.0.3. I use it as a dedicated multi OS VM server, only running 1 VM at a time on demand, macOS/Hackitosh (still on Ventura), Linux Mint 21, or MS Win 10. I only have to spoof the 6950 on macOS. I guess you might need to recheck some BIOS settings, I will try to see what I have on my motherboard.
 
Last edited:
Hello @george thank you very very much for your effort and willingness to share your procedure and outcome with RX 6950 XT on a MacOS VM. It is a topic that more people will be needing to solve I believe. I just bought me a Sapphire RX 6900 XT Toxic Extreme for my Proxmox MacOS VM which has the XTXH (RX6950) chip installed. I bought it knowing that the spoofing is possible on a Hackintosh but not sure (and praying) about the functionality in the Proxmox virtualized environment. You are the answer to my prayers :). So thank you again. Hopefully I will be able to make it work on my GIGABYTE Z790 Aero G motherboard.
 
Hello @george , All you need to do is to force the GPU to PCIe Gen 3.0 in the motherboard. (For first try, make sure disable SR-IOV and Resizable BAR in BIOS)

Then you need spoof the GPU using Proxmox rather than the SSDT-GPU-SPOOF which is somehow failing to inject the device-id. For your GPU use the device-id as 73BF which is RX6900XT along with RX6950 XT vbios.

Oh, never enable the PCI-Express and add the vbios.bin from your GPU. you can just dump using the wiki --> https://pve.proxmox.com/wiki/PCI_Passthrough

Screenshot 2024-12-12 at 3.42.32 PM.png

Along with SSDT-BRG0 to fix the PCIe bridging.

Enjoy your MacOS QEMU VM in ProxMox with full glory of RX6950XT

I have successfully passed through my 6650 XT by this method.

BTW, I tried using SSDT-GPU-SPOOF with the right device-id which did not work at all. May be something to fix in opencore may be or need a special SSDT to use with KVM.

Edit: My Hardware - Asus w680 Ace + 14700k + Sapphire 6650 XT

Edit 2: Make sure to set None for the display in the Hardware config in Proxmox

Edit 3: Updated to MacOS 15, Tried to use device properties to spoof the GPU, It worked. Now I removed the Proxmox device ID Spoof. Got the ID using gfxutil tool. Screenshot 2024-12-13 at 12.07.10 AM.png
 
Last edited:

About

The Proxmox community has been around for many years and offers help and support for Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway.
We think our community is one of the best thanks to people like you!

Get your subscription!

The Proxmox team works very hard to make sure you are running the best software and getting stable updates and security enhancements, as well as quick enterprise support. Tens of thousands of happy customers have a Proxmox subscription. Get yours easily in our online shop.

Buy now!