원문 : http://blog.stuffedcow.net/2012/07/intel-hd4000-qeci-acceleration/
Intel HD Graphics 4000 (Ivy Bridge CPU에 내장)의 Graphics 가속 (Core Image, Quartz Extreme)을 Mac OS X 에서 지원한다. 드라이버는 MacBook Pro (Mid 2012) Software Update 1.0, Lion 10.7.5, 그리고 Mountain Lion 10.8 에 포함되어 있다. (물론, BridgeHelper 5.0 에도 포함되어 있다). 관련 드라이버는 다음과 같다.
- AppleIntelGraphicsHD4000.kext
- AppleIntelGraphicsFramebufferCapri.kext
- 이외에도 추가적으로 관련 드라이버가 존재할 수 있다.
ElNono 와 proteinshake에 의해 밝혀진 바에 따르면 해킨토시에서 그래픽 카드의 AAPL,ig-platform-id 를 로딩하기 위한 HD4000 드라이버에는 심각하게도 설정되지 않은 항목이 있다.물론 Apple 하드웨어가 아니라면 이 항목은 존재하지 않고 반드시 추가해주어야 한다.
AAPL,ig-platform-id 항목은 32-bit 숫자로서 다음과 같은 테이블의 값 중에 하나이다. 이 항목들을 규명하여 준 ElNono 에게 이 기회를 빌어 감사함을 전한다.
AAPL,ig-platform-id | Memory (MB) | Pipes | Ports | Comment |
---|
01660000 | 96 | 3 | 4 | |
01660001 | 96 | 3 | 4 | |
01660002 | 64 | 3 | 1 | No DVI |
01660003 | 64 | 2 | 2 | |
01660004 | 32 | 3 | 1 | No DVI |
01620005 | 32 | 2 | 3 | |
01620006 | 0 | 0 | 0 | No display |
01620007 | 0 | 0 | 0 | No display |
01660008 | 64 | 3 | 3 | |
01660009 | 64 | 3 | 3 | |
0166000a | 32 | 2 | 3 | |
0166000b | 32 | 2 | 3 | |
AAPL,ig-platform-id 는 그래픽 카드에 할당된 구성에 따라 사용될 값이다. AAPL,ig-platform-id 를 세팅할 12자리의 세팅값은 HD4000 드라이버를 로딩할 것이지만 몇 가지 관련사항이 있다.
첫째, 세팅값은 어떤 포트를 enabled 할지에 영향을 준다. 0 포트 구성은 가급적 피해야 한다.(no output?). 구성에 서 찾고 있는 포트가 아닐 수 있으므로 단지 한 포트는 피한다. GA-Z77M-D3H 보드인 경우, 한 포트를 구성하기 위해 enabled된 포트는 DVI 포트가 아니었다. 두개 혹은 그 이상의 포트를 구성할때는 DVI 포트 구성이 가능하다. 어떤 구성이건간에 VGA 포트는 enabled 되지 않는다. HDMI 포트는 확인하지 못했다.
두번째로 그래픽 카드의 메모리 구성은 반드시 BIOS 세팅값과 일치해야 한다. 만약 일치하지 않는다면 드라이버는 커널패닉(kernel panic, gen7_memory.cpp:721
)을 야기하거나 혹은 화면이 제대로 출력이 안된다. 예를 들면 구성을 0x01660000
(96 MB, 3 pipes, 4 ports) 값을 사용하였다면, 그래픽 카드의 메모리 크기는 96MB로 일치시켜 주어야 한다. OS X 는 DVMT Total Memory Size 세팅값(시스템 메모리가 8GB인 경우 항상 512 MB) 값과는 무관하므로, 최대값으로 내버려 둔다.
결과물
| +-o GFX0@2
| | | {
| | | "assigned-addresses" = <1010008200000000000080f70000000000004000181000c20f000000000000100000000000000010201000810000000000f000000000000040000000>
| | | "IOInterruptSpecifiers" = (<1000000007000000>,<0400000000000100>)
| | | "class-code" = <00000300>
| | | "IODeviceMemory" = (({"address"=4152360960,"length"=4194304}),({"address"=64692944896,"length"=268435456}),"IOSubMemoryDescriptor is not serializable")
| | | "AAPL,gray-page" = <01000000>
| | | "IOHibernateState" = <00000000>
| | | "IOPowerManagement" = {"MaxPowerState"=2,"ChildrenPowerState"=2,"CurrentPowerState"=2}
| | | "subsystem-vendor-id" = <58140000>
| | | "built-in" = <00>
| | | "acpi-device" = "IOACPIPlatformDevice is not serializable"
| | | "IOPCIMSIMode" = Yes
| | | "IOInterruptControllers" = ("io-apic-0","IOPCIMessagedInterruptController")
| | | "name" = "display"
| | | "vendor-id" = <86800000>
| | | "device-id" = <62010000>
| | | "IOPCIResourced" = Yes
| | | "compatible" = <"pci1458,d000","pci8086,162","pciclass,030000">
| | | "AAPL,iokit-ndrv" =
| | | "acpi-path" = "IOACPIPlane:/_SB/PCI0@0/GFX0@20000"
| | | "model" = <"Intel HD Graphics 4000">
| | | "subsystem-id" = <00d00000>
| | | "revision-id" = <09000000>
| | | "AAPL,ig-platform-id" = <00006601>
| | | "AAPL,gray-value" =
| | | "pcidebug" = "0:2:0"
| | | "IOName" = "display"
| | | "device_type" = <"display">
| | | "reg" = <0010000000000000000000000000000000000000101000020000000000000000000000000000400018100042000000000000000000000000000000102010000100000000000000000000000040000000>
| | | }
ioreg -l -p IODeviceTree
라는 명령어를 이용하여 그래픽카드의 항목이 정확하게 추가되었는지 확인할 수 있다. AAPL,ig-platform-id 항목은 ioreg
출력으로 확인할 수 있다. 정확한 값만이 AppleIntelGraphicsHD4000.kext
를 로딩할 수 있다.
AAPL,ig-platform-id 설정하기
목표는 테이블 항목 (예를들면, 01660000) 중 32비트값을 가진 AAPL,ig-platform-id
라는 디바이스 항목을 인젝션하는 것이다. 디바이스를 인젝션하는 많은 방법이 있고 그중 한가지이다. 특히, HENRY가 사용하는 방법은 카멜레온 부트로더의 GraphicsEnabler의 소스코드, GraphicsEnabler=y (gma.c),를 수정하는 방법이다. 몇가지 여기에 나열하여 보면:
- 부트로더의 GraphicsEnabler 소스코드를 수정하는 방법. HENRY는 Chimera 1.10 (rev 1999,
i386/libsaio/gma.c
) 소스코드를 수정하여 새로운 디바이스 항목값을 추가하였다. - 부트로드에서 사용하는 org.chameleon.Boot.plist 화일의 “device-properties” 값을 이용하여 디바이스를 인젝션하는 방법. 정확하게 이러한 string값이 어떻게 생성되는지 모르지만 몇가지 방법을 확인할 수 있다.: this thread. gfxutil 과 관련이 있는 듯 하다.
- 마지막으로 DSDT 값을 수정하여 그래픽 카드의 항목을 추가시켜 주는 방법.
Chameleon 부트로더를 수정하는 방법
HENRY는 Chameleon/Chimera 부트로드의 GraphicsEnabler 소스코드를 수정하는 방법을 택하였다. 수정하여 적용된 소스크드는 svn을 이용 다운로드 받을 수 있다. svn (http://forge.voodooprojects.org/svn/chameleon). 또한, HENRY는 Chameleon (rev. 2012) 과 Chimera (rev. 1999) 를 컴파일하여 다음과 같이 공개하였다.
- Chameleon svn r2012
- 추가 July 20, 2012: Chimera 1.11
- Chimera 1.11 여기에서 설명한 것과 유사하게 수정 (AAPL,ig-platform-id 는 01660009 으로 device-id 는 0166으로 설정).
- Chimera 1.10.0
AAPL,ig-platform-id 는 단지 하드웨어 가속을 enable시켜주기 위한 값일 뿐이다. HENRY는 다음과 같이 몇가지 사항과 관련없는 사항을 변경하였다.
device-id 와 revision. 드라이버는 mobile (0166) 혹은 desktop (0162)을 구별하지 않는다. 예상컨대 둘중 하나는 kext를 로딩하기 위해 필요한 듯 보이지만, high-order 16 bits 의 AAPL,ig-platform-id 를 일치시키는 것은 그닥 중요하지 않다. HENRY는 01660000 설정값을 이용하여 그의 설정값 0162:0009 를 그대로 남겨 두었다.
DSDT에서의 GFX0 와 IGPU . 이것도 그다지 중요하지 않다. 둘다 동일하게 동작하므로 그의 설정값, GFX0,을 그대로 남겨두었다.
SMBios version 과productname. HENRY는 smbios.plist 가 있든 없든 몇가지 시도를 하였다. 드라이버는 모든 경우에 로딩되었다. (Mac Pro, iMac, MacBook Pro 모두 로딩 되었다.)
관련 있는 Settings 값
AAPL,ig-platform-id. 이건 둘다 관련있다.
BIOS에서 Graphics memory 설정값. 이 값은 반드시 일치시켜 주어야 한다.
Connectors. 모든 커넥트 포트가 enabled 되는 것은 아니다. 잘못된 display 설정은 현재 사용되는 connector를 disabled 시키는 현상을 일으킨다. AAPL,ig-platform-id 값을 변경하는 것은 connectors enabled 혹은 disabled 시킬 것이다.