Original Link
@아이뱅크 님께서 링크를 남겨주신 게시물을 따라.. 야밤에 토니맥을 마실 갔다가- 잠도 안오고 해서 한 번 간략하게나마 정리를 해볼까 합니다. 정보 제공해주신 @아이뱅크님, @D'Artagnan 님 감사합니다.

---------------------------------------------------------------------------------------------

애플 OEM ACPI 테이블을 보면 아래의 이름으로 GPU 함수 이름이 정리되어 있습니다.

iMac13/14/15/17: Discrete GPU = "GFX0" (@0). Integrated GPU = "IGPU" (@2 or 0x00020000)
MacPro3,1/5,1: Discrete GPU#1 = "PSX1" (@0).
MacPro6,1: Discrete GPU#1 = "GFX1" (@0). Discrete GPU#2 = "GFX2" (@0).

iMac13/14/15/17의 외장 GPU는 GFX0으로 할당되고 내장 그래픽은 IGPU로 할당 됩니다.
MacPro3,1/5,1은 외장 GPU가
PSX1으로 할당 됩니다.
MacPro6,1은 외장 GPU1번이
GFX1 외장 GPU2번이  GFX2로 할당되게 되는데요.


커스텀 맥을 사용할 때 빈번하게 발생하는 블랙 아웃은 할당되는 함수에서 GPU 포트가 할당되어 있지 않기 때문입니다.
그래서 설치후 블랙 아웃이 발생하게 된다고 Tonymac에 글을 남긴 shilohh의 표현이 그렇습니다.
(근데 토니맥에 글을 정말 복잡하게 써놓긴 했어요;; ㅎㅎ)


* 주의 *

가) 최소한 Error 수정을 끝낸 DSDT.aml을 첨부 했을 때 빛을 발휘 합니다!
나) DSDT의 GPU 네이밍이 GFX0 / GFX1등으로 되어 있지 않다면 SSDT에 인젝션을 권장 합니다

어쩔수 없이 맥에서 DSDT를 추출할 경우 아래의 과정을 거쳐 주세요
1) 최초 부팅 시 클로버 부트로더 GUI에서 F4를 누르고 5초 정도 기다려 주세요
2) EFI/Clover/ACPI/origin 폴더에 다량의 aml이 추출됩니다
3) 그 중 OEM으로 추출된 DSDT.aml을 바탕화면으로 복사합니다
4) 만약 SSDT.aml과 SSDT-1이 있다면 SSDT-2를 새로 만들어서 GPU 인젝션을 하시면 됩니다
5) 완성된 SSDT-1.aml은 EFI/Clover/ACPI/patched에 넣어 줍니다
6) DSDT.aml은  EFI/Clover/ACPI/patched에 넣어 줍니다
 

SSDT GPU Injection workflow

우선  IORegistryExplorer에서 여러분의 그래픽 카드의 디바이스 이름이 어떻게 되어 있는지 확인하면, DSDT에서 그래픽 장착 슬롯에 대한 디바이스 이름을 손쉽게 확인할 수 있습니다.

IOResistryExplorer path                   /    SSDT Scope Variations

PCI0@0 > PEG0@1 > PEGP@0         /     (\_SB.PCI0.PEG0.PEGP)
PCI0@0 > BR3A@3 > H000@0       /     (_SB.PCI0.BR3A.H000)
PCI0@0 > BR3A@3 > D077@0        /     (_SB.PCI0.BR3A.D077)
PCI0@0 > BR2A@2 > H000@0       /     (_SB.PCI0.BR2A.H000)
PCI0@0 > BR2A@2 > D075@0        /     (_SB.PCI0.BR3A.D075)

IOResistryExplorer에서 검색한 GPU 디바이스 이름을 DSDT.aml에서 찾았을 때
"Name (_ADR, Zero)" 또는 "Name (_ADR, 0x00)"으로 보일 때 해당 DSDT는 잘못되었다고 보셔야 하고 윈도우에서 추출하셔서 다시 시도하시기 바랍니다.

 

가장 많은 케이스가될 PEG0.PEGP에 대한 수정 방법 입니다.


DSDT.aml / PEG0.PEGP 

    External (PEGP, DeviceObj)
    External (\_SB_.PCI0.PEG0, DeviceObj)
.
.
    Scope (\_SB_.PCI0.PEG0)
    {
           Scope (PEGP)
          {
                  Name (_STA, Zero)
          }
          Device (GFX1)

a) 위 코드를 SSDT-1.aml의 Device (_SB.PCI0.NPE3.GFX1) 코드 위에 붙여 넣습니다. b)의 과정을 보시면 더 잘 이해 되실 겁니다.

/*
 * Intel ACPI Component Architecture
 * AML Disassembler version 20100331
 *
 * Disassembly of iASLTzPejO.aml, Sun Oct  9 01:14:02 2016
 *
 *
 * Original Table Header:
 *     Signature        "SSDT"
 *     Length           0x0000015F (351)
 *     Revision         0x01
 *     Checksum         0x26
 *     OEM ID           "shiloh"
 *     OEM Table ID     "GFX1"
 *     OEM Revision     0x00001000 (4096)
 *     Compiler ID      "INTL"
 *     Compiler Version 0x20100331 (537920305)
 */
DefinitionBlock ("iASLTzPejO.aml", "SSDT", 1, "shiloh", "GFX1", 0x00001000)
{
    External (PEGP, DeviceObj)  /* DSDT.aml에 포함된 GPU 정보 코드 */
    External (\_SB_.PCI0.PEG0, DeviceObj)  /* Zero Address 코드 */
 
    Scope (\_SB.PCI0.PEG0) /* Zero Address 를 패치 합니다 */
    {
        Scope (PEGP)  /*  DSDT.aml의 PEGP 주소를 비워냅니다 */
        {
            Name (_STA, Zero)
        }

        Device (GFX1)  /* SMbios는 맥프로6,1이기에 GFX1으로 GPU정보를 로드 합니다 */
        {
            Name (_ADR, Zero)
            Name (_SUN, One)
            Method (_DSM, 4, NotSerialized)
            {
                If (LEqual (Arg2, Zero))
                {
                    Return (Buffer (One)
                    {
                        0x03
                    })
                }

                Return (Package (0x0E)
                {
                    "@0,connector-type", 
                    Buffer (0x04)
                    {
                        0x00, 0x08, 0x00, 0x00
                    }, 

                    "@1,connector-type", 
                    Buffer (0x04)
                    {
                        0x00, 0x08, 0x00, 0x00
                    }, 

                    "@2,connector-type", 
                    Buffer (0x04)
                    {
                        0x00, 0x08, 0x00, 0x00
                    }, 

                    "@3,connector-type", 
                    Buffer (0x04)
                    {
                        0x00, 0x08, 0x00, 0x00
                    }, 

                    "@4,connector-type", 
                    Buffer (0x04)
                    {
                        0x00, 0x08, 0x00, 0x00
                    }, 

                    "@5,connector-type", 
                    Buffer (0x04)
                    {
                        0x00, 0x08, 0x00, 0x00
                    }, 

                    "hda-gfx", 
                    Buffer (0x0A)
                    {
                        "onboard-1"
                    }
                })
            }
        }

        Device (HDAU)   /* Scope 구문안에 있으므로 HDAU를 패치할 패스를 기재 안합니다 */ 
        {
            Name (_ADR, One)
            Method (_DSM, 4, NotSerialized)
            {
                If (LEqual (Arg2, Zero))
                {
                    Return (Buffer (One)
                    {
                        0x03
                    })
                }

                Return (Package (0x02)
                {
                    "hda-gfx", 
                    Buffer (0x0A)
                    {
                        "onboard-1"
                    }
                })
            }
        }
    }
}

b) 위 코드는 DSDT.aml에 GPU와 관련된 정보가 없을 때 SSDT-1에서 GPU정보를 참고하라는 의미입니다.
* DSDT에 이미  GPU 정보가 있는 것도 있습니다만, 포트 정보가 인식되냐 안되냐의 문제보다 GPU Device 이름이 SMBIOS 버전에 맞는 GPU 정보가 나오는지가 관건입니다.
* 무작정 DSDT의 디바이스 이름 한 두개  변경 한다고 인젝션이 되지 않습니다. (에러로 인한 DSDT 수정외에는 추가 SSDT등을 통해서 편집하는게 유지 보수 면에서는 간편하다고 할 수 있습니다)
 

 

NPE2.SLT2 : HP Z420 / Z620의 C602, X79 칩셋
* 제가 사용중인 실사용 코드이며 HP Z420용입니다. 타 시스템의 칩셋은 이 것과 다를 수 있습니다.

우선 DSDT.aml 스샷을 보겠습니다.

스크린샷 2016-10-09 오전 2.42.07.png
DSDT상에서 NPE2/SLT2에 그래픽 카드를 설치한 것은 IORegistryExplorer에서 확인한 내용이지만 정작 C602 칩셋의 경우, GPU 관련 정보를 넣으면 여전히 블랙아웃이 생기므로 SSDT에 GPU정보를 인젝션하거나 EFI String으로 블랙 아웃을 회피할 수 있겠습니다. 바로 아래 링크를 누르시면 참고해 보실 수 있습니다

.

클로버 Device Properties를 이용한 EFI String

 


/*
 * Intel ACPI Component Architecture
 * AML Disassembler version 20100331
 *
 * Disassembly of iASL87J1f0.aml, Sat Oct  8 23:32:20 2016
 *
 *
 * Original Table Header:
 *     Signature        "SSDT"
 *     Length           0x0000021F (543)
 *     Revision         0x01
 *     Checksum         0x63
 *     OEM ID           "APPLE "
 *     OEM Table ID     "Devicein"
 *     OEM Revision     0x00015601 (87553)
 *     Compiler ID      "INTL"
 *     Compiler Version 0x20100331 (537920305)
 */
DefinitionBlock ("iASL87J1f0.aml", "SSDT", 1, "APPLE ", "Devicein", 0x00015601)
/* 저는 SSDT drop table을 GFX1으로 안하고 Devicein으로 Config.plist에서 로드합니다 */
{
    External (\_SB_.PCI0, DeviceObj)    /* \_SB.PCI0의 전체를 참고 합니다 */
    External (\_SB_.PCI0.NPE2, DeviceObj)   /* \_SB_,PCI0.NPE2를 참고 합니다 */
    External (\_SB_.PCI0.NPE2.SLT2, DeviceObj) /* \_SB_,PCI0.NPE2.SLT2를 참고 합니다 */

    Method (XOSI, 1, NotSerialized)
    {
        Name (WINV, Package (0x06)
        {
            "Windows", 
            "Windows 2001", 
            "Windows 2001 SP2", 
            "Windows 2006", 
            "Windows 2006 SP1", 
            "Windows 2009"
        })
        Return (LNotEqual (Match (WINV, MEQ, Arg0, MTR, Zero, Zero), 
            Ones))
    }

    Scope (\_SB.PCI0)  /* HDEF 관련 패치입니다만 GPU 정보는 아닙니다 */
    {
        Device (HDEF)
        {
            Name (_ADR, 0x001B0000)
            Name (_PRW, Package (0x02)
            {
                0x08, 
                0x04
            })
            Method (_DSM, 4, NotSerialized)
            {
                If (LEqual (Arg2, Zero))
                {
                    Return (Buffer (One)
                    {
                        0x03
                    })
                }

                Return (Package (0x02)
                {
                    "hda-gfx", 
                    Buffer (0x0A)
                    {
                        "onboard-1"
                    }
                })
            }
        }
    }

    Scope (\_SB.PCI0.NPE2.SLT2)  /* SLT2 코드의 제로 어드레스를 비워 냅니다 */
    {
        Name (_STA, Zero)
    }

    Scope (\_SB.PCI0.NPE2)  /* NPE2 코드에 GFX1으로 GPU정보를 로드합니다  */
    {
        Device (GFX1) /* 저도 MacPro6,1로 사용중이라 GPU이름을  GFX1으로 합니다 */
        {
            Name (_ADR, Zero)
            Name (_SUN, 0x05)
            Method (_DSM, 4, NotSerialized)
            {
                If (LEqual (Arg2, Zero))
                {
                    Return (Buffer (One)
                    {
                        0x03
                    })
                }

                Return (Package (0x0C)
                {
                    "@0,connector-type", 
                    Buffer (0x04)
                    {
                        0x00, 0x04, 0x00, 0x00
                    }, 

                    "@1,connector-type", 
                    Buffer (0x04)
                    {
                        0x00, 0x08, 0x00, 0x00
                    }, 

                    "@2,connector-type", 
                    Buffer (0x04)
                    {
                        0x00, 0x02, 0x00, 0x00
                    }, 

                    "@3,AAPL,boot-display", 
                    Buffer (Zero) {}, 
                    "@3,connector-type", 
                    Buffer (0x04)
                    {
                        0x04, 0x00, 0x00, 0x00
                    }, 

                    "hda-gfx", 
                    Buffer (0x0A)
                    {
                        "onboard-1"
                    }
                })
            }
        }

        Device (HDAU)  /* Scope 구문안에 있으므로 HDAU를 패치할 패스를 기재 안합니다  */
        {
            Name (_ADR, One)
            Method (_DSM, 4, NotSerialized)
            {
                If (LEqual (Arg2, Zero))
                {
                    Return (Buffer (One)
                    {
                        0x03
                    })
                }

                Return (Package (0x02)
                {
                    "hda-gfx", 
                    Buffer (0x0A)
                    {
                        "onboard-1"
                    }
                })
            }
        }
    }
}


 

멀티 GPU

GPU가 장착된 슬롯 번호는 DSDT의 _SUN 함수의 주소를 확인하시면 됩니다

_SUN, One : 1번 슬롯
_SUN, 0x02 :  2번 슬롯
_SUN, 0x03 :  3번 슬롯
_SUN, 0x04 :  4번 슬롯
_SUN, 0x05 :  5번 슬롯... 등등..

 

일반 데스크탑 메인보드라면 CPU에서 가까운 곳이 One에 해당하고 서버 보드들은 CPU에서 먼 곳이 One입니다만, 꼭 _SUN 함수가 중요하진 않습니다. 그 이유중 하나가 EFI String을 할 경우 간혹 _SUN함수로 인해 슬롯 정보가 제대로 인식을 하지 않는 경우가 있기 때문입니다. 

만약 멀티플 GPU를 설정하려면 아래처럼 진행 하시면 됩니다.

가) 첫 번째 GPU는 SSDT-1.aml이며 onboard-1입니다. SSDT Table은  Device1
나) 두 번째 GPU는 SSDT-2.aml이며 onboard-2입니다. SSDT Table은  Device2

이렇게 해주시면 되는데 SSDT Table은 여러분이 인식하기 편한 것으로 하시고, Config.plist에서는 모두 Table Drop되어야 합니다.

 

 

동작 확인
만약 IOResistryExplorer에서 Display 키워드를 입력하고 3차경로가 여러분의 SMBIOS에 맞는 GFX1@0또는 GFX0@0 표시 된다면  이미 블랙 아웃없이 부팅이 되었다는 뜻이겠죠? AGPDFix가 필요 없어지는 시점인 것입니다. 아래 스샷이 정상적으로 동작하는 예제입니다

스크린샷 2016-10-08 오후 9.05.08.png

 

 HP Z420, 620, 820 시리즈 유저는 Recovery mode 진입시  npci=0x3000 부트 플래그를 주고, AsusAICPUPM만 활성화 시킨다음 진입해보세요. 매번 nv_disable=1을 지정했던 옵션을 더이상 하지 않아도 되는 장점이 있습니다. 

 

 

클럽 : 당주

See the Unseen

★ 글쓴이에게 고마우시면 커피한잔 후원(클릭) ★ 후원 정보를 입력하지 않았습니다.

"Nvidia GPU를 SSDT-1.aml에 인젝션하는 글타래입니다."글의 댓글은 현재 63개 있습니다.
비회원은 13분 40초 후에 댓글을 열람할수 있습니다.
로그인 하시면 바로 확인 하실수 있습니다.



No 제목 조회 닉네임 등록일
848 macOS팁| 앱스토어 다운로드 이슈 - 캐시삭제 434 Mactopia 10.09
» 팁/안정화| HOT Nvidia GPU를 SSDT-1.aml에 인젝션하는 글타래입니다. 63 3225 zisqo 10.08
846 macOS팁| 씨에라용 Nvidia 드라이버 4 1116 마음의창 10.08
845 팁/안정화| HP Z420/620 GPU inject를 통해 nv_disable=1을 벗어나 봅니다 3 944 zisqo 10.08
844 팁/안정화| HP Z420 / Z620 디스플레이 블랙아웃 회피 방법입니다. 7 1120 zisqo 10.08
843 macOS팁| 106키 한국어키보드에서 한영키 인식시키기 11 2180 안녕하세요 10.07
842 팁/안정화| 퓨리온님의 시에라&엘캐피탄 16GB 용량초과문제 & dd명령 더 빠르게 2 681 안녕하세요 10.07
841 팁/안정화| 키보드 언어변경 1 387 아이뱅크 10.05
840 팁/안정화| 디스플레이 EDID 정보 편집 방법입니다. 5 1180 zisqo 10.04
839 팁/안정화| rx480 관련 글타래 6 1174 KsJ 10.04
838 팁/안정화| 스피드스텝 이후 잠자기에서 깨어나지 않을 때 조치 방법중 하나입니다. 1 860 zisqo 10.04
837 macOS팁| 맥의 키보드 및 디스플레이 설정 초기화 5 866 XEXEX 10.04
836 팁/안정화| [시에라 성공]b150-ds3h 사운드 잡기 alc887 2 1336 SeungHanKim 10.04
835 팁/안정화| VGA -> DVI 컨버터 쓰지 마세요! 2 588 SangHoMetHackin 10.03
834 macOS팁| macOS 또는 OS X에서 Caps lock 키 지연시간 제거방법 (Elimination of Caps lock key delay on 10.11 +) 496 D'Artagnan 09.30
833 팁/안정화| [임시 글타래] RX 480으로 1순위 부팅 이슈 66 1193 D'Artagnan 09.30
832 macOS팁| macOS에서 블루투스 이어폰 사용 시 aptX 코덱을 강제로 활성화하는 방법 3 276 Mactopia 09.29
831 팁/안정화| AGDPfix.app 사용할 필요 없이 바로 그래픽 활성화  5 2434 아이뱅크 09.29
830 팁/안정화| rx480 모니터 케이블 분리 안해도 되는 팁 17 739 comed78 09.29
829 팁/안정화| 시에라 전용 최신 버전 웹드라이버에 문제가 있습니다. (잠자기 이슈, 디스플레이 연결 유실 등) 36 2791 D'Artagnan 09.29
828 팁/안정화| 10.12.1 베타2 에서 AmdRadeonX4100.kext 안정화 작업이 있었네요 4 606 comed78 09.28
827 팁/안정화| 썬더볼트3 지원설정 13 1123 아이뱅크 09.28
826 팁/안정화| rx480 깊은 잠자기 테스트 10 789 comed78 09.27
825 팁/안정화| 시에라(Sierra)에서 잠재우기 및 깨우기 설정 2 1565 terminator 09.27
824 팁/안정화| 디스플레이 인치 및 아이콘 변경 방법 (10.12:16A323) 2 721 김찬 09.26
823 팁/안정화| [Solved]HD5200 HDMI Audio+ApplHDA Patcher 1.5 5 666 작은거인 09.25
822 macOS팁| 시에라 알려진 와이파이 버그 해결방법 9 1289 Mactopia 09.24
821 팁/안정화| 폴라리스RX470 (480?) 씨에라 10.12.1 PB 에서 정상가속됩니다. 23 2110 봄날 09.23
820 팁/안정화| 클로버 최신(+r3751 이상) 엔당 드라이버 활성화 방법 8 2126 Mactopia 09.22
819 강좌/연재| 커스텀맥 설치/안정화/사용 관련 팁을 공유하는 게시판 입니다. 397 Mactopia 09.22
818 팁/안정화| 멀티 OS 간 불루투스 페어링 공유하기 5 443 작은거인 09.19
817 팁/안정화| 16A323 GM 버전 바로 올렸습니다. 6 622 IanMinchangShin 09.16
816 팁/안정화| Gigabyte Z97X-UD3H 시에라 GM 업데이트 6 660 제러스 09.12
815 팁/안정화| macOS sierra GM 으로 무사히 옮겼습니다 10 1118 XEXEX 09.11
814 팁/안정화| 하스웰, Z97, R9 270 Sierra GM 설치 3 539 봄날 09.09
813 macOS팁| 시에라 기기 등록 공개 베타 소프트웨어를 얻으세요 12 544 아이뱅크 09.09
812 팁/안정화| 잠자기 후 블루투스 장비 페어링이 안될 때 390 작은거인 09.04
811 팁/안정화| 이번 보안업데이트 엔비디아 쓰시는 분들은 잠시웨잇! 4 374 soullees 09.03
810 팁/안정화| USB 카드리더기를 애플 카드리더기로 인식시키기 1 553 leejo0531 08.31
809 팁/안정화| BU-4096 블투동글 구입시 참고할 점 10 826 faananan 08.28
서버에 요청 중입니다. 잠시만 기다려 주십시오...