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:
- ATOM BIOS Rom:
- SubsystemVendorID: 0x148c SubsystemID: 0x2372
- IOBaseAddress: 0x0000
- Filename: I1727OAD.SLC
- BIOS Bootup Message:
- D00901 Polaris10 XT A1 GDDR5 256Mx32 8GB I1727OAD.SLC 2016
- PCI ID: 1002:67df
- Connector at index 0
- Type [@offset 40846]: DisplayPort (10)
- Encoder [@offset 40850]: INTERNAL_UNIPHY2 (0x21)
- i2cid [@offset 40956]: 0x90, OSX senseid: 0x1
- HotPlugID: 6
- Connector at index 1
- Type [@offset 40856]: DisplayPort (10)
- Encoder [@offset 40860]: INTERNAL_UNIPHY2 (0x21)
- i2cid [@offset 40983]: 0x92, OSX senseid: 0x3
- HotPlugID: 4
- Connector at index 2
- Type [@offset 40866]: DisplayPort (10)
- Encoder [@offset 40870]: INTERNAL_UNIPHY1 (0x20)
- i2cid [@offset 41010]: 0x91, OSX senseid: 0x2
- HotPlugID: 1
- Connector at index 3
- Type [@offset 40876]: HDMI-A (11)
- Encoder [@offset 40880]: INTERNAL_UNIPHY1 (0x20)
- i2cid [@offset 41037]: 0x93, OSX senseid: 0x4
- HotPlugID: 5
- Connector at index 4
- Type [@offset 40886]: DVI-D (3)
- Encoder [@offset 40890]: INTERNAL_UNIPHY (0x1e)
- i2cid [@offset 41064]: 0x95, OSX senseid: 0x6
- HotPlugID: 3
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:
- D00901 Polaris10 XT A1 GDDR5 256Mx32 8GB I1727OAD.SLC 2016
- Subsystem Vendor ID: 148c
- Subsystem ID: 2372
- Object Header Structure Size: 340
- Connector Object Table Offset: 48
- Router Object Table Offset: 0
- Encoder Object Table Offset: fb
- Display Path Table Offset: 12
- 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
- Connector Object Id [19] which is [DISPLAY_PORT]
- encoder obj id [0x21] which is [INTERNAL_UNIPHY2 (osx txmit 0x22 [duallink 0x2] enc 0x5)] linkb: true
- Connector Object Id [19] which is [DISPLAY_PORT]
- encoder obj id [0x20] which is [INTERNAL_UNIPHY1 (osx txmit 0x11 [duallink 0x1] enc 0x2)] linkb: false
- Connector Object Id [12] which is [HDMI_TYPE_A]
- encoder obj id [0x20] which is [INTERNAL_UNIPHY1 (osx txmit 0x21] [duallink 0x1] enc 0x3)] linkb: true
- Connector Object Id [4] which is [DVI_D]
- encoder obj id [0x1e] which is [INTERNAL_UNIPHY (osx txmit 0x10 [duallink 0x0] enc 0x0)] linkb: false
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):
- -------------------------AMD9510Controller.kext-------------------------
- Exmoor (6) @ 0x107080
- LVDS, LVDS, DP, DP, DP, DP
- 020000000001000000010151000000002205020400000000
- 020000000001000000010261010000001204010300000000
- 000400000403000000010343000000001102030100000000
- 000400000001000000010431000000002103050500000000
- 000400000403000000010523000000001000040200000000
- 000400000001000000010611000000002001050500000000
- Berbice (5) @ 0x107110
- LVDS, DP, DP, DP, DP
- 020000000001000039050108000000002001010100000000
- 000400000001000000010243000000001000020200000000
- 000400000403000000010313000000002103030300000000
- 000400000403000000010453000000001102040400000000
- 000400000403000000010533000000001204050500000000
- Baladi (6) @ 0x107300
- DP, DP, DP, DP, DP, DP
- 000400000403000000010300000000001204030300000000
- 000400000403000000010100000000001102010100000000
- 000400000403000000010200000000002103020200000000
- 000400000403000000010400000000002205040400000000
- 000400000403000000010500000000001000050500000000
- 000400000403000000010600000000002001060600000000
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:
dieser Code mit Anschlüssen für 3x Displayport, 1x HDMI und 1x DVI-D:
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:
- <key>Graphics</key>
- <dict>
- <key>DualLink</key>
- <integer>1</integer>
- <key>FBName</key>
- <string>Berbice</string>
- <key>ig-platform-id</key>
- <string>0x19120000</string>
- <key>Inject</key>
- <dict>
- <key>ATI</key>
- <true></true>
- <key>Intel</key>
- <false></false>
- </dict>
- <key>InjectEDID</key>
- <false></false>
- </dict>
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:
- <key>KernelAndKextPatches</key>
- <dict>
- <key>ATIConnectorsController</key>
- <string>9510</string>
- <key>ATIConnectorsData</key>
- <string>020000000001000039050108000000002001010100000000000400000001000000010243000000001000020200000000000400000403000000010313000000002103030300000000000400000403000000010453000000001102040400000000000400000403000000010533000000001204050500000000</string>
- <key>ATIConnectorsPatch</key>
- <string>000400000403000000010100000000001204060100000000000400000403000000010200000000002205040300000000000800000402000000010300000000001102010200000000000800000402000000010400000000002103050400000000040000000004000000010500000000001000030600000000</string>
Hier sind nun folgende 4 Einträge durch die von uns früher ermittelten Werte zu erstzen:
Hier setzen wir zwischen die beiden "string"-Felder unseren ermittelten Wert des original BERBICE-Framebuffers, in unserem Fall also:
Das selbe machen wir für den gepatchten Framebuffereintrag, so daß dort dann folgendes steht:
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>