Konfiguracja Dell/AMD Radeon R7 350X przy pomocy SSDT GPU SPOOF.

Zestaw poradników który pomoże zacząć Ci z DSDT i SSDT.
Awatar użytkownika
DKnoto
Posty: 1157
Rejestracja: 05 maja 2019, 21:01
Lokalizacja: Marki

Konfiguracja Dell/AMD Radeon R7 350X przy pomocy SSDT GPU SPOOF.

Post autor: DKnoto »

Hej,

Jakiś czas temu kupiłem używaną kartę Dell AMD Radeon R7 350X do mojego Dell OptiPlex 7040. Skusiłem się na ten staroć głównie z tego względu, iż jest to najmocniejsza karta zalecana przez producenta do tego modelu komputera. Pierwsze próby odpalenia tej karty na macOS Catalina nie przyniosły oczekiwanego efektu. System uruchamiał kartę graficzną tylko w trybie VESA. Postanowiłem więc pobawić się w podmianę PCI-ID karty aby skojarzyć ją z zalecanym sterownikiem AMD7000Controller. Przygotowałem następujący SSDT-GPU-SPOOF.dsl:

Kod: Zaznacz cały

//
//  GPU: AMD Radeon R7 350X from Dell, PCI-ID: 0x6610
//
DefinitionBlock ("", "SSDT", 2, "DKNOTO", "AMDGPU", 0x00001000)
{
    External (_SB_.PCI0, DeviceObj)
    External (_SB_.PCI0.PEG0.PEGP, DeviceObj)
    Scope (\_SB_.PCI0.PEG0.PEGP)
    {
        if (_OSI ("Darwin"))
        {
            Method (_DSM, 4, NotSerialized)  // _DSM: Device-Specific Method
            {
                Local0 = Package (0x08)
                {
                    "device-id",
                    Buffer (0x02)
                    {
                        0x2B, 0x68, 0x02, 0x10
                    },
                    "model",
                    Buffer ()
                    {
                        "AMD Radeon R7 350X"
                    }
                }
                DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                Return (Local0)
            }
        }
    }
    Scope (\_SB.PCI0)
    {
        Method (DTGP, 5, NotSerialized)
        {
            If (LEqual (Arg0, ToUUID ("a0b5b7c6-1318-441c-b0c9-fe695eaf949b")))
            {
                If (LEqual (Arg1, One))
                {
                    If (LEqual (Arg2, Zero))
                    {
                        Store (Buffer (One)
                            {
                                 0x03
                            }, Arg4)
                        Return (One)
                    }
                    If (LEqual (Arg2, One))
                    {
                        Return (One)
                    }
                }
            }
            Store (Buffer (One)
                {
                     0x00
                }, Arg4)
            Return (Zero)
        }
    }
}

Przy pomocy tak przygotowanego pliku sprawdziłem wszystkie PCI-ID zawarte w pliku Info.plist sterownika AMD7000Controller.kext.
System ładowałem przy pomocy Clover 5127, Lilu 1.5.0 i WhateverGreen 1.4.6 z dodanymi opcjami rozruchowymi radpg i -raddvi.
Niestety we wszystkich przypadkach system restartował się przy próbie uruchomienia sterownika.

Wtedy postanowiłem rozbudować plik SSDT-GPU-SPOOF.dsl o sekcję definicji wyjść. W tym celu zrzuciłem BIOS karty do pliku, w moim przypadku zrobiłem to na Linuksie:

Kod: Zaznacz cały

root# rom_src=`find /sys/ -name "rom"`
root# echo 1 > $rom_src
root# cat $rom_src > radeon.rom
root# echo 0 > $rom_src

Zdekodowałem BIOS karty przy pomocy dwóch oddzielnych narzędzi aby wyciągnąć z niego komplet informacji potrzebnych do zdefiniowania działania wyjścia.
radeon_bios_decode:

Kod: Zaznacz cały

ATOM BIOS Rom:
        SubsystemVendorID: 0x1028 SubsystemID: 0x0081
        IOBaseAddress: 0xe000
        Filename: C8720100.101
        BIOS Bootup Message:
Samoa XT C87201 4GB DDR3 256Mx16 DELL

PCI ID: 1002:6610
Connector at index 0
        Type [@offset 42614]: DisplayPort (10)
        Encoder [@offset 42618]: INTERNAL_UNIPHY (0x1e, 0x)
        i2cid [@offset 42680]: 0x90, OSX senseid: 0x1
        HotPlugID: 1
Connector at index 1
        Type [@offset 42624]: DVI-I (2)
        Encoder [@offset 42628]: INTERNAL_UNIPHY (0x1e, 0x)
        i2cid [@offset 42717]: 0x91, OSX senseid: 0x2
        HotPlugID: 2
Connector at index 2
        Type [@offset 42634]: DVI-I (2)
        Encoder [@offset 42638]: INTERNAL_KLDSCP_DAC1 (0x15, 0x)
        i2cid [@offset 42717]: 0x91, OSX senseid: 0x2
        HotPlugID: 2
redsock_bios_decoder:

Kod: Zaznacz cały

C8720100.101:

Samoa XT C87201 4GB DDR3 256Mx16 DELL

Subsystem Vendor ID: 1028
       Subsystem ID: 81
Object Header Structure Size: 187
Connector Object Table Offset: 34
Router Object Table Offset: 0
Encoder Object Table Offset: 88
Display Path Table Offset: 12
Connector Object Id [19] which is [DISPLAY_PORT]
        encoder obj id [0x1e] which is [INTERNAL_UNIPHY (osx txmit 0x10 [duallink 0x0] enc 0x0)] linkb: false
Connector Object Id [1] which is [DVI_I]
        encoder obj id [0x1e] which is [INTERNAL_UNIPHY (osx txmit 0x20 [duallink 0x0] enc 0x1)] linkb: true
Connector Object Id [1] which is [DVI_I]
        encoder obj id [0x15] which is [INTERNAL_KLDSCP_DAC1 (osx txmit 0x00 enc 0x10?)] linkb: false

Posiłkując się przewodnikiem i przykładowym opisem bufora ramki wyciągniętym ze sterownika:

Kod: Zaznacz cały

macOS Mojave 10.14.4 beta 1

-------------------------AMD8000Controller.kext-------------------------

Baladi (6) @ 0x5a3f0
DP, DP, DP, DP, DP, DP
000400000403000000010300000000001204030300000000
000400000403000000010100000000001102010100000000
000400000403000000010200000000002103020200000000
000400000403000000010400000000002205040400000000
000400000403000000010500000000001000050500000000
000400000403000000010600000000002001060600000000

Przygotowałem poprawki opisujące fizyczne wyjścia mojej karty:

Kod: Zaznacz cały

00040000 04030000 00010100 10000101
04000000 14020000 00010200 20010202

Pierwszy wiersz opisuje wyjście DP a drugi DVI-I DualLink. Na podstawie tych poprawek przystąpiłem do skonstruowania ostatecznej wersji pliku SSDT, rozbudowałem sekcję opisu kary, reszta zostaje bez zmian:

Kod: Zaznacz cały

Method (_DSM, 4, NotSerialized)  // _DSM: Device-Specific Method
            {
                Local0 = Package (0x08)
                {
                    "device-id",
                    Buffer (0x04)
                    {
                        0x2B, 0x68, 0x02, 0x10
                    },

                    "model",
                    Buffer ()
                    {
                        "AMD Radeon R7 350X"
                    },

                    "connectors",
                    Buffer ()
                    {
                        0x00, 0x04, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x10, 0x00, 0x01, 0x01,
                        0x04, 0x00, 0x00, 0x00, 0x14, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x20, 0x01, 0x02, 0x02
                    },

                    "connector-count",
                    Buffer ()
                    {
                        0x02, 0x00, 0x00, 0x00
                    }
                }
                DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                Return (Local0)
            }

Ponownie przetestowałem wszystkie PCI-ID ze sterownika AMD7000Controller i niestety efekty były identyczne jak za pierwszym razem. Wtedy wpadłem na pomysł aby przetestować PCI-ID ze sterownika AMD8000Controller. Tu system mnie zaskoczył, nie wywalił się ale nie odpalił też zobrazowania. Można było się do niego zalogować i bezpiecznie zamknąć. Nic ponad to. W tym miejscu straciłem wenę i w zasadzie postanowiłem poszukać innej karty.

Po kilku godzinach oderwania się od tematu przyszła mi do głowy jeszcze jedna myśl. Postanowiłem sprawdzić jak zadziała to rozwiązanie w starszej wersji systemu. Spróbowałem PCI-ID najbliższy mojej karty 0x683D1002, to karta Radeon R7 250X, Cape Verde XT w sterowniku AMD7000Controller.

System High Sierra 10.13.6 (17G14042) ładował się długo, i pojawiły się artefakty przy inicjowaniu docelowego trybu graficznego, ale odpalił. Tak prezentuje informacje o karcie:

HighSierra-Radeon-R7-350X-About.png
HighSierra-Radeon-R7-350X-About.png (26.95 KiB) Przejrzano 802 razy
HighSierra-Radeon-R7-350X-RapSys.png
HighSierra-Radeon-R7-350X-RapSys.png (22.55 KiB) Przejrzano 802 razy

Desktop: Dell OptiPlex 7040 | Intel Core i7 6700 | HD 530 | AMD Radeon FirePro W5100 | 24GB RAM
  • SSD/M.2 WD Black SN750 1TB: macOS Catalina 10.15.7 (19H1011)
  • SSD/SATA Samsung 850 EVO 120 GB: macOS High Sierra 10.13.6 (17G14042)

ODPOWIEDZ