Erstellung eines Framebuffer-Patches für Polaris Karten mit macOS Sierra 10.12.X

  • Polaris Karte gekauft und noch auf Sierra angewiesen? Hier steht wie Ihr unter Sierra den Framebuffer passend patchen könnt damit Eure Polaris Karte auch hier richtig funktioniert.

    Als Beispiel die Erstellung eines Framebuffer-Patches für eine Powercolor RX 480 8GB DDR5 (PCI ID: 1002:67df)

    Als erstes müssen wir dafür sorgen, daß Dein Mainboard via HDMI mit deinem Monitor verbunden ist. Sollte Dein Monitor nur einen Displayport- oder DVI-Eingang haben, benötigst Du dafür ein HDMI-auf-Displayport- oder HDMI-auf-DVI-Kabel. Bekommst Du günstig und schnell via AMAZON.DE.

    Als nächstes musst Du dein Gigabyte-BIOS so konfigurieren, daß Deine IGPU (Mainboardinterne Grafik) als primary gesetzt ist. Da dieses Mainboard (und das dazu passende letzte BIOS-Update) bereits von 2013 ist, schau bitte mal, ob Du im BIOS auch eine Funktion namens "CSM" hast, die Du ggf. ein- bzw. ausschalten kannst. Schalte diese Funktion bitte ein. Lt. meinen GOOGLE-Recherchen heisst die Funktion in deinem BIOS "CSM Support" und befindet sich unter den Einstellungen "BIOS Features".

    Wie ich bereits in meinem letzten Beitrag erwähnt habe, kann die PowerColor RX480 bereits im PCIe slot #1 eingebaut sein. In erster Linie geht es darum, das Du mittels der IGPU ins BIOS kommst und somit auch unter CLOVER ein Bild auf dem Monitor hast.

    Gehen wir mal davon aus, daß dies nun der Fall ist, so kommen wir zum nächsten Schritt: wir benötigen für die RX480 einen für SIERRA (macOS 10.12.4) passenden Framebuffer, mit dem wir die 3 Displayport sowie den HDMI- als auch den DVI-Anschluss ansprechen können. Ich habe mir das VBIOS Deiner PowerColor RX480 bei Techpowerup.com besorgt und hoffe mal, daß ich das richtige erwischt habe.

    Für den Framebuffer-Patch benötigen wir 2 Scripts: radeon_bios_decode.sh und redsock_bios_decoder.sh sowie die ".rom"-Datei Deines VBIOS.
    Beide Scripts findet Ihr als Anhang zu diesem Beitrag unten. Anwendung beider Scripts wäre wie folgt:

    Unter OS X ein Terminalfenster aufmachen, das erste Script per drag-and-drop ins offene Terminalfenster ziehen, gefolgt von einem "<" und einem Leerzeichen und anschliessend das "xxx.rom"-File per drag-and-drop ins Terminalfenster ziehen. Dann sollte dort in etwa stehen
    (das erste ist jeweils der Pfadname, der bei Euch anders aussehen kann und derzeit meine Pfade zeigt, unter dem die Dateien bei mir liegen):

    " /Volumes/Install\ macOS\ Sierra/APPS_and_FILES/Decoders/radeon_bios_decode < /Users/mvo/Desktop/Powercolor.RX480.8192.160727.rom "

    Jetzt ENTER drücken und man erhält daraufhin folgende Ausgabe:


    Auf die selbe Art und weise holen wir uns mit dem zweiten Script nun noch die fehlenden Werte:
    script plus "< " plus VBIOS.ROM-File ins Terminalfenster ziehen und ENTER drücken. Ergebnis sieht dann wie folgt aus:


    Jetzt haben wir alle relevanten Infos, die wir zum Erstellen eines passenden Frambuffer-Patches brauchen.
    Holen wir uns also die originalen Framebufferdaten aus SIERRA, um diese für uns passend zu patchen. Hierzu benötigen wir das PHP-file "ATI_FrameBuffers_Sierra_Edition.php" und ebenfalls das Terminal unter OS X. Dort tippen wir den Befehl "php " ein, ziehen wieder die Datei "ATI_FrameBuffers_Sierra_Edition.php" direkt dahinter ins Terminalfenster und drücken Enter (sollte macOS Euch jetzt auffordern XCODE zu laden, tut dies bitte, denn wir werden es später erneut benötigen).
    Ergebnis sieht wie folgt aus (da für uns nur der AMD9150Controller wichtig ist, hier nur dessen Einträge):


    Die von uns genutzte PowerColor RX480 hat insgesamt 5 Anschlüsse, also ist der für uns am besten passende Framebuffer "BERBICE", da dieser ebenfalls über 5 Anschlüsse verfügt. Wir können aber erkennen, das BERBICE für einen internen Anschluss (LVDS) sowie 4 externe Displayport-Anschlüsse ausgelegt ist.
    Nun heisst es diesen zu patchen. Dadurch wird dann aus:

    Code
    1. LVDS, DP, DP, DP, DP
    2. 020000000001000039050108000000002001010100000000
    3. 000400000001000000010243000000001000020200000000
    4. 000400000403000000010313000000002103030300000000
    5. 000400000403000000010453000000001102040400000000
    6. 000400000403000000010533000000001204050500000000


    dieser Code mit Anschlüssen für 3x Displayport, 1x HDMI und 1x DVI-D:

    Code
    1. DP, DP, DP, HDMI, DVI-D
    2. 000400000403000000010243000000001204060100000000
    3. 000400000403000000010313000000002205040300000000
    4. 000400000403000000010453000000001102010200000000
    5. 000800000402000000010533000000002103050400000000
    6. 040000001402000000010300000000001000030600000000


    Daraus ergibt sich dann für die spätere Verwendung unter CLOVER folgender Patchcode:

    original FB: 020000000001000039050108000000002001010100000000000400000001000000010243000000001000020200000000000400000403000000010313000000002103030300000000000400000403000000010453000000001102040400000000000400000403000000010533000000001204050500000000

    patched FB: 000400000403000000010243000000001204060100000000000400000403000000010313000000002205040300000000000400000403000000010453000000001102010200000000000800000402000000010533000000002103050400000000040000001402000000010300000000001000030600000000

    Soweit, so gut. Jetzt müßen wir noch die entsprechenden AMD-Kexte patchen, damit unsere RX480 Karte überhaupt von den Apple Treibern erkannt wird. Dazu legen wir uns Kopien der nachfolgend genannten Kext-Dateien an:

    AMD9510Controller.kext und AMDRadeonX4100.kext

    Bei beiden müssen wir die interne "Info.plist"-Datei anpassen. Dazu einen Rechtsklick auf die jeweilige Kext-Datei und "Paketinhalt zeigen" auswählen, den Ordner "Contents" öffnen und nun die "Info.plist" per doppelklick öffnen. Wer sich, wie ich gesagte hatte, XCode heruntergeladen und installiert hat, sollte daraufhin folgendes Bild bekommen (am Beispiel der AMDRadeonX4100.kext):

    Für uns relevant ist hier der Eintrag unter "IOPCIMatch", denn hier müssen wir nun die Device-ID unserer RX480 nachtragen: 0x67DF1002. Einfach diesen Wert mit einem Leerzeichen davor hinter dem Wert "0x67EF1002" eintragen. Info.plist speichern - fertig.
    Das selbe machen wir im Falle der AMD9510Controller.kext:

    Auch hier tragen wir wieder unsere Device-ID nach: " 0x67DF1002" direkt hinter "0x67EF1002". Speichern, Fertig.
    Jetzt beide gepatchten Kexte mittels Kext Wizard wieder in den Ordner /System/Library/Extensions laden, den KernelCache refreshen und weiter geht es.

    Finaler Schritt: anpassen der CLOVER "config.plist" Datei.
    Hierzu öffnen wir unsere CLOVER config.plist und suchen uns folgenden Bereich raus:


    Kann bei Euch ein bißchen anders aussehen, da der hier zu sehende Teil aus meiner config.plist stammt (welche bereits für eine RX480/RX580 genutzt wird). Wichtig sind hierbei die Einträge <key>FBName</key> und <key>ATI</key>. Bei FBNamen tragt Ihr darunter den Namen des von Euch gepatchten Framebuffers ein (in unserem Fall eben BERBICE, und für ATI setzt Ihr darunter den Wert auf <true></true>, da CLOVER ja das Injecten für AMD Grafikkarten übernehmen soll. Das ist alles, was in dieser Sektion eingestellt werden muss.

    Nächster Part für die CLOVER config.plist: der Bereich "<key>KernelAndKextPatches</key>" - bei mir sieht dieser so aus:

    Code
    1. <key>KernelAndKextPatches</key>
    2. <dict>
    3. <key>ATIConnectorsController</key>
    4. <string>9510</string>
    5. <key>ATIConnectorsData</key>
    6. <string>020000000001000039050108000000002001010100000000000400000001000000010243000000001000020200000000000400000403000000010313000000002103030300000000000400000403000000010453000000001102040400000000000400000403000000010533000000001204050500000000</string>
    7. <key>ATIConnectorsPatch</key>
    8. <string>000400000403000000010100000000001204060100000000000400000403000000010200000000002205040300000000000800000402000000010300000000001102010200000000000800000402000000010400000000002103050400000000040000000004000000010500000000001000030600000000</string>


    Hier sind nun folgende 4 Einträge durch die von uns früher ermittelten Werte zu erstzen:

    Code
    1. <key>ATIConnectorsData</key>
    2. <string></string>
    3. <key>ATIConnectorsPatch</key>
    4. <string></string>


    Hier setzen wir zwischen die beiden "string"-Felder unseren ermittelten Wert des original BERBICE-Framebuffers, in unserem Fall also:

    Code
    1. <key>ATIConnectorsData</key>
    2. <string>020000000001000039050108000000002001010100000000000400000001000000010243000000001000020200000000000400000403000000010313000000002103030300000000000400000403000000010453000000001102040400000000000400000403000000010533000000001204050500000000</string>


    Das selbe machen wir für den gepatchten Framebuffereintrag, so daß dort dann folgendes steht:

    Code
    1. <key>ATIConnectorsPatch</key>
    2. <string>000400000403000000010243000000001204060100000000000400000403000000010313000000002205040300000000000400000403000000010453000000001102010200000000000800000402000000010533000000002103050400000000040000001402000000010300000000001000030600000000</string>

    FERTIG! Eigentlich gar nicht so schwer, wenn man weiss, wie es geht ;-)
    Wenn wir nun unseren Hackintosh durchbooten, sollte SIERRA die RX480 vollständig erkennen und unterstützen.
    ABER: jedoch nur solange wir unsere IGPU als primary GFX im BIOS gesetzt haben! Als alleinige und primary Grafikkarte läuft die RX480 nicht, bzw wenn nur ohne METAL-Unterstützung, also ohne Beschleunigung. Und bislang ist für dieses Problem noch keine Lösung in Sicht.

    Solange man aber eine Helperkarte hat, welche man als primary GFX deklarieren kann, kann man die RX-Karten in ihrer vollen Pracht auch unter macOS nutzen.
    Anbei die von mir in diesem Tutorial erwähnten Scripte zum auslesen der VBIOS-Daten und der Framebuffer unter SIERRA.

    Ergänzung:

    wer sich nun fragt, woraus sich das Ergebnis des gepachten Framebuffers ergibt, dem sei auch dies hier nochmal kurz erklärt:
    dazu müssen wir uns nochmal die beiden Ergebnisse der ersten beiden „radeon“-scripte im Detail ansehen. Wir schauen uns hierzu
    mal nur die Werte für den ersten Displayport aus vorherigem Beispiel an:

    Das Script „radeon_bios_decode.sh“ liefert uns folgendes Ergebnis:

    Connector at index 0
    Type [@offset 40846]: DisplayPort (10)
    Encoder [@offset 40850]: INTERNAL_UNIPHY2 (0x21)
    i2cid [@offset 40956]: 0x90, OSX senseid: 0x1
    HotPlugID: 6

    Das Script „redsock_bios_decoder.sh“ liefert uns folgendes Ergebnis:

    Connector Object Id [19] which is [DISPLAY_PORT]
    encoder obj id [0x21] which is [INTERNAL_UNIPHY2 (osx txmit 0x12 [duallink 0x2] enc 0x4)] linkb: false

    Für den exakten Patch wichtig sind die Werte der folgenden Angaben (in der Reihenfolge, wie sie im Patch eingepasst werden):

    osx txmit , enc, HotPlug und senseid

    Schauen wir uns die erste Zeile des gepachten Frambuffers an:

    000400000403000000010243000000001204060100000000

    Wir müssen hier also nur darauf achten, das wir die einzelnen Werte, die uns beide Scripte liefern, korrekt setzen. Dabei muss darauf geachtet werden, das der erste Anschluss auch die erste Reihe sein sollte, der zweite Anschluss die zweite Reihe usw.

    Die beiden vorderen Werte (in unserem Beispiel „0004“ und „0403“) stehen für die Art des Anschlußes, sprich ob es sich dabei um einen Displayport-, HDMI-, DVI- oder internen LVDS Anschluss handelt. Dabei gilt folgende Regel:

    Displayport ist gleich 0004 und 0403
    HDMI ist gleich 0008 und 0402
    DVI ist gleich 0400 und 1402
    LVDS (intern) ist gleich 0200 und 0001

    Bastelt man das alles zusammen, ergibt sich daraus für unser Beispiel eben:

    patched FB:
    000400000403000000010143000000001204060100000000 ---> Displayport
    000400000403000000010213000000002205040300000000 ---> Displayport
    000400000403000000010353000000001102010200000000 ---> Displayport
    000800000402000000010433000000002103050400000000 ---> HDMI
    040000001402000000010500000000001000030600000000 ---> DVI-D

    und so wird daraus dann:
    000400000403000000010143000000001204060100000000000400000403000000010213000000002205040300000000000400000403000000010353000000001102010200000000000800000402000000010433000000002103050400000000040000001402000000010500000000001000030600000000

    Vielen Dank an @Mork vom Ork für diesen hervorragenden Beitrag.</dict>

Share