Chameleon

Chameleon Svn Source Tree

Root/branches/chucko/i386/libsaio/gma.c

1/*
2 * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
3 * All Rights Reserved.
4 * Copyright © 2010 Intel Corporation
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice (including the next
14 * paragraph) shall be included in all copies or substantial portions of the
15 * Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
24 *
25 */
26
27/*
28Original patch by Nawcom
29http://forum.voodooprojects.org/index.php/topic,1029.0.html
30
31Original Intel HDx000 code from valv
32Intel Ivy Bridge and Haswell code from ErmaC:
33- http://www.insanelymac.com/forum/topic/288241-intel-hd4000-inject-aaplig-platform-id/
34*/
35
36#include "libsa.h"
37#include "saio_internal.h"
38#include "bootstruct.h"
39#include "pci.h"
40#include "platform.h"
41#include "device_inject.h"
42#include "gma.h"
43#include "vbe.h"
44#include "graphics.h"
45
46#ifndef DEBUG_GMA
47#define DEBUG_GMA 0
48#endif
49
50#if DEBUG_GMA
51#define DBG(x...)printf(x)
52#else
53#define DBG(x...)
54#endif
55
56static uint8_t default_aapl_ivy[]={ 0x05,0x00,0x62,0x01 }; // ivy_bridge_ig_vals[5]
57#define AAPL_LEN_IVY ( sizeof(default_aapl_ivy) / sizeof(uint8_t) )
58static uint8_t default_aapl_haswell[]={ 0x00,0x00,0x26,0x0c }; // haswell_ig_vals[7]
59#define AAPL_LEN_HSW ( sizeof(default_aapl_haswell) / sizeof(uint8_t) )
60
61uint8_t GMAX3100_vals[23][4] = {
62{ 0x01,0x00,0x00,0x00 },//0 "AAPL,HasPanel"
63{ 0x01,0x00,0x00,0x00 },//1 "AAPL,SelfRefreshSupported"
64{ 0x01,0x00,0x00,0x00 },//2 "AAPL,aux-power-connected"
65{ 0x00,0x00,0x00,0x08 },//3 "AAPL,backlight-control"
66{ 0x64,0x00,0x00,0x00 },//4 "AAPL00,blackscreen-preferences"
67{ 0x00,0x00,0x00,0x08 },//5 "AAPL01,BacklightIntensity"
68{ 0x01,0x00,0x00,0x00 },//6 "AAPL01,blackscreen-preferences"
69{ 0x20,0x00,0x00,0x00 },//7 "AAPL01,DataJustify"
70{ 0x00,0x00,0x00,0x00 },//8 "AAPL01,Depth"
71{ 0x01,0x00,0x00,0x00 },//9 "AAPL01,Dither"
72{ 0x20,0x03,0x00,0x00 },//10 "AAPL01,DualLink"
73{ 0x00,0x00,0x00,0x00 },//11 "AAPL01,Height"
74{ 0x00,0x00,0x00,0x00 },//12 "AAPL01,Interlace"
75{ 0x00,0x00,0x00,0x00 },//13 "AAPL01,Inverter"
76{ 0x08,0x52,0x00,0x00 },//14 "AAPL01,InverterCurrent"
77{ 0x00,0x00,0x00,0x00 },//15 "AAPL01,InverterCurrency"
78{ 0x00,0x00,0x00,0x00 },//16 "AAPL01,LinkFormat"
79{ 0x01,0x00,0x00,0x00 },//17 "AAPL01,LinkType"
80{ 0x01,0x00,0x00,0x00 },//18 "AAPL01,Pipe"
81{ 0x3B,0x00,0x00,0x00 },//19 "AAPL01,PixelFormat"
82{ 0x00,0x00,0x00,0x00 },//20 "AAPL01,Refresh"
83{ 0x6B,0x10,0x00,0x00 },//21 "AAPL01,Stretch"
84{ 0xc8,0x95,0x00,0x00 },//22 "AAPL01,InverterFrequency"
85};
86
87uint8_t ivy_bridge_ig_vals[12][4] = {
88{ 0x00,0x00,0x66,0x01 },//0 "AAPL,ig-platform-id" //FB: 96MB, Pipes: 3, Ports: 4, FBMem: 3
89{ 0x01,0x00,0x66,0x01 },//1 "AAPL,ig-platform-id" //FB: 96MB, Pipes: 3, Ports: 4, FBMem: 3
90{ 0x02,0x00,0x66,0x01 },//2 "AAPL,ig-platform-id" //FB: 64MB, Pipes: 3, Ports: 1, FBMem: 1
91{ 0x03,0x00,0x66,0x01 },//3 "AAPL,ig-platform-id" //FB: 64MB, Pipes: 2, Ports: 2, FBMem: 2
92{ 0x04,0x00,0x66,0x01 },//4 "AAPL,ig-platform-id" //FB: 32MB, Pipes: 3, Ports: 1, FBMem: 1
93{ 0x05,0x00,0x62,0x01 },//5 "AAPL,ig-platform-id" //FB: 32MB, Pipes: 2, Ports: 3, FBMem: 2
94{ 0x06,0x00,0x62,0x01 },//6 "AAPL,ig-platform-id" //FB: 0MB, Pipes: 0, Ports: 0, FBMem: 0
95{ 0x07,0x00,0x62,0x01 },//7 "AAPL,ig-platform-id" //FB: 0MB, Pipes: 0, Ports: 0, FBMem: 0
96{ 0x08,0x00,0x66,0x01 },//8 "AAPL,ig-platform-id" //FB: 64MB, Pipes: 3, Ports: 3, FBMem: 3
97{ 0x09,0x00,0x66,0x01 },//9 "AAPL,ig-platform-id" //FB: 64MB, Pipes: 3, Ports: 3, FBMem: 3
98{ 0x0a,0x00,0x66,0x01 },//10 "AAPL,ig-platform-id" //FB: 32MB, Pipes: 2, Ports: 3, FBMem: 2
99{ 0x0b,0x00,0x66,0x01 }//11 "AAPL,ig-platform-id" //FB: 32MB, Pipes: 2, Ports: 3, FBMem: 2
100};
101
102uint8_t haswell_ig_vals[16][4] = { /* - TESTING DATA --*/
103{ 0x00,0x00,0x06,0x04 },// 0 "AAPL,ig-platform-id" //FB: 64MB, Pipes: 3, Ports: 3, FBMem: 3 - mobile GT1
104{ 0x00,0x00,0x06,0x0c },// 1 "AAPL,ig-platform-id" //FB: 64MB, Pipes: 3, Ports: 3, FBMem: 3 - SDV mobile GT1
105{ 0x00,0x00,0x16,0x04 },// 2 "AAPL,ig-platform-id" //FB: 64MB, Pipes: 3, Ports: 3, FBMem: 3 - mobile GT2
106{ 0x00,0x00,0x16,0x0a },// 3 "AAPL,ig-platform-id" //FB: 64MB, Pipes: 3, Ports: 3, FBMem: 3 - ULT mobile GT2
107{ 0x00,0x00,0x16,0x0c },// 4 "AAPL,ig-platform-id" //FB: 64MB, Pipes: 3, Ports: 3, FBMem: 3 - SDV mobile GT2
108{ 0x00,0x00,0x26,0x04 },// 5 "AAPL,ig-platform-id" //FB: 64MB, Pipes: 3, Ports: 3, FBMem: 3 - mobile GT3
109{ 0x00,0x00,0x26,0x0a },// 6 "AAPL,ig-platform-id" //FB: 64MB, Pipes: 3, Ports: 3, FBMem: 3 - ULT mobile GT3
110{ 0x00,0x00,0x26,0x0c },// 7 "AAPL,ig-platform-id" //FB: 64MB, Pipes: 3, Ports: 3, FBMem: 3 - SDV mobile GT3
111{ 0x00,0x00,0x26,0x0d }, // 8 "AAPL,ig-platform-id" //FB: 64MB, Pipes: 3, Ports: 3, FBMem: 3 - CRW mobile GT3
112{ 0x02,0x00,0x16,0x04 },// 9 "AAPL,ig-platform-id" //FB: 64MB, Pipes: 1, Ports: 1, FBMem: 1 - mobile GT2
113{ 0x03,0x00,0x22,0x0d }, // 10 "AAPL,ig-platform-id" //FB: 0MB, Pipes: 0, Ports: 0, FBMem: 0 - CRW Desktop GT3
114//{ 0x04,0x00,0x12,0x04 },// ?? "AAPL,ig-platform-id" //FB: 32MB, Pipes: 3, Ports: 3, FBMem: 3 - ULT mobile GT3
115{ 0x05,0x00,0x26,0x0a },// 11 "AAPL,ig-platform-id" //FB: 32MB, Pipes: 3, Ports: 3, FBMem: 3 - ULT mobile GT3
116{ 0x06,0x00,0x26,0x0a },// 12 "AAPL,ig-platform-id" //FB: 32MB, Pipes: 3, Ports: 3, FBMem: 3 - ULT mobile GT3
117{ 0x07,0x00,0x26,0x0d }, // 13 "AAPL,ig-platform-id" //FB: 64MB, Pipes: 3, Ports: 4, FBMem: 3 - CRW mobile GT3
118{ 0x08,0x00,0x26,0x0a },// 14 "AAPL,ig-platform-id" //FB: 64MB, Pipes: 3, Ports: 3, FBMem: 3 - ULT mobile GT3
119{ 0x08,0x00,0x2e,0x0a },// 15 "AAPL,ig-platform-id" //FB: 64MB, Pipes: 3, Ports: 3, FBMem: 3 - ULT reserved GT3
120};
121
122uint8_t HD2000_vals[16][4] = {
123{ 0x00,0x00,0x00,0x00 }, //0 "AAPL00,PixelFormat"
124{ 0x00,0x00,0x00,0x00 }, //1 "AAPL00,T1"
125{ 0x14,0x00,0x00,0x00 }, //2 "AAPL00,T2"
126{ 0xfa,0x00,0x00,0x00 }, //3 "AAPL00,T3"
127{ 0x2c,0x01,0x00,0x00 }, //4 "AAPL00,T4"
128{ 0x00,0x00,0x00,0x00 }, //5 "AAPL00,T5"
129{ 0x14,0x00,0x00,0x00 }, //6 "AAPL00,T6"
130{ 0xf4,0x01,0x00,0x00 }, //7 "AAPL00,T7"
131{ 0x00,0x00,0x00,0x00 }, //8 "AAPL00,LinkType"
132{ 0x00,0x00,0x00,0x00 }, //9 "AAPL00,LinkFormat"
133{ 0x00,0x00,0x00,0x00 }, //10 "AAPL00,DualLink"
134{ 0x00,0x00,0x00,0x00 }, //11 "AAPL00,Dither"
135{ 0x00,0x00,0x00,0x00 }, //12 "AAPL00,DataJustify"
136{ 0x00,0x00,0x00,0x00 }, //13 "graphic-options"
137{ 0x00,0x00,0x00,0x00 }, //14
138{ 0x01,0x00,0x00,0x00 } //15
139};
140
141uint8_t HD3000_vals[17][4] = {
142{ 0x00,0x00,0x00,0x00 }, //0 "AAPL00,PixelFormat"
143{ 0x00,0x00,0x00,0x00 }, //1 "AAPL00,T1"
144{ 0x14,0x00,0x00,0x00 }, //2 "AAPL00,T2"
145{ 0xfa,0x00,0x00,0x00 }, //3 "AAPL00,T3"
146{ 0x2c,0x01,0x00,0x00 }, //4 "AAPL00,T4"
147{ 0x00,0x00,0x00,0x00 }, //5 "AAPL00,T5"
148{ 0x14,0x00,0x00,0x00 }, //6 "AAPL00,T6"
149{ 0xf4,0x01,0x00,0x00 }, //7 "AAPL00,T7"
150{ 0x00,0x00,0x00,0x00 }, //8 "AAPL00,LinkType"
151{ 0x00,0x00,0x00,0x00 }, //9 "AAPL00,LinkFormat"
152{ 0x00,0x00,0x00,0x00 }, //10 "AAPL00,DualLink"
153{ 0x00,0x00,0x00,0x00 }, //11 "AAPL00,Dither"
154{ 0x00,0x00,0x00,0x00 }, //12 "AAPL00,DataJustify"
155{ 0x00,0x00,0x00,0x00 }, //13 "graphic-options"
156{ 0x00,0x00,0x00,0x00 }, //14
157{ 0x01,0x00,0x00,0x00 }, //15
158{ 0x00,0x00,0x01,0x00 } //16 AAPL,snb-platform-id
159};
160
161uint8_t HD4000_vals[15][4] = {
162{ 0x00,0x00,0x00,0x00 }, //0 "AAPL00,PixelFormat"
163{ 0x00,0x00,0x00,0x00 }, //1 "AAPL00,T1"
164{ 0x01,0x00,0x00,0x00 }, //2 "AAPL00,T2"
165{ 0xc8,0x00,0x00,0x00 }, //3 "AAPL00,T3"
166{ 0xc8,0x00,0x00,0x00 }, //4 "AAPL00,T4"
167{ 0x01,0x00,0x00,0x00 }, //5 "AAPL00,T5"
168{ 0x00,0x00,0x00,0x00 }, //6 "AAPL00,T6"
169{ 0x90,0x01,0x00,0x00 }, //7 "AAPL00,T7"
170{ 0x01,0x00,0x00,0x00 }, //8 "AAPL00,LinkType"
171{ 0x00,0x00,0x00,0x00 }, //9 "AAPL00,LinkFormat"
172{ 0x01,0x00,0x00,0x00 }, //10 "AAPL00,DualLink"
173{ 0x00,0x00,0x00,0x00 }, //11 "AAPL00,Dither"
174{ 0xc3,0x8c,0x64,0x00 }, //12 "AAPL,gray-value"
175{ 0x01,0x00,0x00,0x00 }, //13 "AAPL,gray-page"
176{ 0x0c,0x00,0x00,0x00 } //14 "graphics-options"
177};
178
179// http://www.insanelymac.com/forum/topic/286092-guide-1st-generation-intel-hd-graphics-qeci/
180uint8_t HDx000_os_info[20] = {
1810x30,0x49,0x01,0x11,0x01,0x10,0x08,0x00,0x00,0x01,
1820x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF
183};
184
185uint8_t HD2000_tbl_info[18] = {
1860x30,0x44,0x02,0x02,0x02,0x02,0x00,0x00,0x00,
1870x00,0x01,0x02,0x02,0x02,0x00,0x01,0x02,0x02
188};
189uint8_t HD2000_os_info[20] = {
1900x30,0x49,0x01,0x11,0x11,0x11,0x08,0x00,0x00,0x01,
1910xf0,0x1f,0x01,0x00,0x00,0x00,0x10,0x07,0x00,0x00
192};
193
194// The following values came from a Sandy Bridge MacBook Air
195uint8_t HD3000_tbl_info[18] = {
1960x30,0x44,0x02,0x02,0x02,0x02,0x00,0x00,0x00,
1970x00,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01
198};
199
200// The following values came from a Sandy Bridge MacBook Air
201uint8_t HD3000_os_info[20] = {
2020x30,0x49,0x01,0x12,0x12,0x12,0x08,0x00,0x00,0x01,
2030xf0,0x1f,0x01,0x00,0x00,0x00,0x10,0x07,0x00,0x00
204};
205
206
207uint8_t reg_TRUE[]= { 0x01, 0x00, 0x00, 0x00 };
208uint8_t reg_FALSE[] = { 0x00, 0x00, 0x00, 0x00 };
209
210// https://en.wikipedia.org/wiki/Comparison_of_Intel_graphics_processing_units#Seventh_generation
211
212/* http://cgit.freedesktop.org/xorg/driver/xf86-video-intel/tree/src/intel_module.c */
213
214static intel_gfx_info_t intel_gfx_chipsets[] = {
215{GMA_I810, "i810"},
216{GMA_I810_DC100, "i810-dc100"},
217{GMA_I810_E, "i810e"},
218{GMA_I815, "i815"},
219{GMA_I830_M, "i830M"},
220{GMA_845_G, "845G"},
221{GMA_I854, "854"},
222{GMA_I855_GM, "852GM/855GM"},
223{GMA_I865_G, "865G"},
224{GMA_I915_G, "915G"},
225{GMA_E7221_G, "E7221 (i915)"},
226{GMA_I915_GM, "915GM"},
227{GMA_I945_G, "945G"},
228 // 2776 /* Desktop GMA950 */
229 // 2782 /* GMA 915 */
230 // 2792 /* Mobile GMA915 */
231{GMA_I945_GM, "945GM"},
232{GMA_I945_GME, "945GME"},
233 // 27A6 /* Mobile GMA950 */
234 // 29C3 /* Desktop GMA3100 */
235{GMA_PINEVIEW_M, "Pineview GM"},
236{GMA_GMA3150_M, "Pineview GM"},// A012 /* Mobile GMA3150 */
237{GMA_PINEVIEW_G, "Pineview G"},
238{GMA_GMA3150_D, "Desktop GMA3150"}, // A002 /* Desktop GMA3150 */
239{GMA_I965_G, "965G"},
240{GMA_G35_G, "G35"},
241{GMA_I965_Q, "965Q"},
242{GMA_I946_GZ, "946GZ"},
243{GMA_I965_GM, "965GM"},
244{GMA_I965_GME, "965GME/GLE"},
245{GMA_G33_G, "G33"},
246 // 2A13 /* GMAX3100 */
247 // 2A43 /* GMAX3100 */
248{GMA_Q35_G, "Q35"},
249{GMA_Q33_G, "Q33"},
250{GMA_GM45_GM, "GM45"},
251{GMA_G45_E_G, "4 Series"},
252{GMA_G45_G, "G45/G43"},
253{GMA_Q45_G, "Q45/Q43"},
254{GMA_G41_G, "G41"},
255{GMA_B43_G, "B43"},
256{GMA_B43_G1, "B43"},
257 /**/
258{GMA_IRONLAKE_D_G, HD_GRAPHICS},
259{GMA_IRONLAKE_M_G, HD_GRAPHICS},
260 // 004A /* HD2000 */
261
262 /* Sandy */
263{GMA_SANDYBRIDGE_GT1, HD_GRAPHICS_2000 },
264{GMA_SANDYBRIDGE_GT2, HD_GRAPHICS_3000 },
265{GMA_SANDYBRIDGE_GT2_PLUS,HD_GRAPHICS_3000 },
266{GMA_SANDYBRIDGE_M_GT1,HD_GRAPHICS_2000 },
267{GMA_SANDYBRIDGE_M_GT2,HD_GRAPHICS_3000 },
268{GMA_SANDYBRIDGE_M_GT2_PLUS,HD_GRAPHICS_3000 },
269{GMA_SANDYBRIDGE_S_GT, HD_GRAPHICS },
270 // 010B /* ??? */
271 // 010E /* ??? */
272
273 /* Ivy */
274{GMA_IVYBRIDGE_M_GT1, HD_GRAPHICS_2500 },
275{GMA_IVYBRIDGE_M_GT2, HD_GRAPHICS_4000 },
276{GMA_IVYBRIDGE_D_GT1, HD_GRAPHICS_2500 },
277{GMA_IVYBRIDGE_D_GT2, HD_GRAPHICS_4000 },
278{GMA_IVYBRIDGE_S_GT1, HD_GRAPHICS },
279{GMA_IVYBRIDGE_S_GT2, "HD Graphics P4000" },
280{GMA_IVYBRIDGE_S_GT3, HD_GRAPHICS }, // 015e
281 {GMA_IVYBRIDGE_S_GT4, HD_GRAPHICS_2500 }, // 0172 /* HD Graphics 2500 Mobile */
282 {GMA_IVYBRIDGE_S_GT5, HD_GRAPHICS_2500 }, // 0176 /* HD Graphics 2500 Mobile */
283
284 /* Haswell */
285 // 0090 /* ??? */
286 // 0091 /* ??? */
287 // 0092 /* ??? */
288{GMA_HASWELL_D_GT1, HD_GRAPHICS },
289{GMA_HASWELL_D_GT2, HD_GRAPHICS_4600 }, /* 0412 */
290{GMA_HASWELL_D_GT3, HD_GRAPHICS_5000 }, /* ??? */
291{GMA_HASWELL_M_GT1, HD_GRAPHICS },
292{GMA_HASWELL_M_GT2, HD_GRAPHICS_4600 }, /* 0416 */
293{GMA_HASWELL_M_GT3, HD_GRAPHICS_5000 }, /* ??? */
294{GMA_HASWELL_S_GT1, HD_GRAPHICS },
295{GMA_HASWELL_S_GT2, "HD Graphics P4600/P4700" },
296{GMA_HASWELL_S_GT3, HD_GRAPHICS_5000 }, /* ??? */
297{GMA_HASWELL_B_GT1, HD_GRAPHICS }, /* ??? */
298{GMA_HASWELL_B_GT2, HD_GRAPHICS }, /* ??? */
299{GMA_HASWELL_B_GT3, HD_GRAPHICS }, /* ??? */
300{GMA_HASWELL_E_GT1, HD_GRAPHICS },
301{GMA_HASWELL_E_GT2, HD_GRAPHICS_4400 }, /* 041e */
302{GMA_HASWELL_E_GT3, HD_GRAPHICS }, /* ??? */
303{GMA_HASWELL_ULT_D_GT1,HD_GRAPHICS }, /* ??? */
304{GMA_HASWELL_ULT_D_GT2,HD_GRAPHICS }, /* ??? */
305{GMA_HASWELL_ULT_D_GT3,IRIS_5100 },
306{GMA_HASWELL_ULT_M_GT1,HD_GRAPHICS },
307{GMA_HASWELL_ULT_M_GT2,HD_GRAPHICS_4400 }, /* 0a16 */
308{GMA_HASWELL_ULT_M_GT3,HD_GRAPHICS_5000 }, /* 0a26 */
309{GMA_HASWELL_ULT_S_GT1,HD_GRAPHICS }, /* ??? */
310{GMA_HASWELL_ULT_S_GT2,HD_GRAPHICS }, /* ??? */
311{GMA_HASWELL_ULT_S_GT3,IRIS_5100 },
312{GMA_HASWELL_ULT_B_GT1,HD_GRAPHICS }, /* ??? */
313{GMA_HASWELL_ULT_B_GT2,HD_GRAPHICS }, /* ??? */
314{GMA_HASWELL_ULT_B_GT3,IRIS_5100 },
315{GMA_HASWELL_ULT_E_GT1,HD_GRAPHICS_4400 }, /* 0a0e */
316{GMA_HASWELL_ULT_E_GT2,HD_GRAPHICS_4200 }, /* 0a1e */
317// 0A2A /* ??? */
318{GMA_HASWELL_ULT_E_GT3,IRIS_5100 },
319{GMA_HASWELL_SDV_D_GT1_IG,HD_GRAPHICS }, // 0C02 /* Intel Haswell HD Graphics - GTL */
320// 0C04 /* DRAM Controller */
321{GMA_HASWELL_SDV_M_GT1_IG,HD_GRAPHICS }, // 0C06 /* Intel Haswell HD Graphics - GTL */
322{GMA_HASWELL_SDV_D_GT2_IG,HD_GRAPHICS }, // 0C12 /* Intel Haswell HD Graphics - GTM */
323{GMA_HASWELL_SDV_M_GT2_IG,HD_GRAPHICS }, // 0C16 /* Intel Haswell HD Graphics - GTH */
324{GMA_HASWELL_SDV_D_GT2_PLUS_IG,HD_GRAPHICS }, // 0C22 /* Intel Haswell HD Graphics - GTH */
325{GMA_HASWELL_SDV_M_GT2_PLUS_IG,HD_GRAPHICS }, // 0C26 /* Intel Haswell HD Graphics - GTH */
326{GMA_HASWELL_CRW_D_GT1,HD_GRAPHICS }, /* 0d02 */
327{GMA_HASWELL_CRW_D_GT2,HD_GRAPHICS_4600 },
328{GMA_HASWELL_CRW_D_GT3,IRIS_5200 }, /* 0d22 */
329{GMA_HASWELL_CRW_M_GT1,HD_GRAPHICS }, /* 0d06 */
330{GMA_HASWELL_CRW_M_GT2,HD_GRAPHICS_4600 }, /* 0d16 */
331{GMA_HASWELL_CRW_M_GT3,IRIS_5200 }, /* 0d26 */
332{GMA_HASWELL_CRW_S_GT1,HD_GRAPHICS }, /* 0d0a */
333{GMA_HASWELL_CRW_S_GT2,HD_GRAPHICS }, /* 0d1a */
334{GMA_HASWELL_CRW_S_GT3,IRIS_5200 },
335{GMA_HASWELL_CRW_B_GT1,HD_GRAPHICS }, /* 0d0b */
336{GMA_HASWELL_CRW_B_GT2,HD_GRAPHICS }, /* 0d1b */
337{GMA_HASWELL_CRW_B_GT3,IRIS_5200 },
338{GMA_HASWELL_CRW_E_GT1,HD_GRAPHICS }, /* 0d0e */
339{GMA_HASWELL_CRW_E_GT2,HD_GRAPHICS }, /* od1e */
340{GMA_HASWELL_CRW_E_GT3,IRIS_5200 },
341{GMA_HASWELL_CRW_M_GT2_PLUS_IG,HD_GRAPHICS }
342};
343
344#define GFX_DEVICES_LEN (sizeof(intel_gfx_chipsets) / sizeof(intel_gfx_chipsets[0]))
345
346/* END http://cgit.freedesktop.org/xorg/driver/xf86-video-intel/tree/src/intel_module.c */
347
348/* Get Intel GFX device name */
349static char *get_gma_controller_name(uint16_t device_id, uint16_t vendor_id)
350{
351int i = 0;
352static char desc[128];
353
354for (i = 0; i < GFX_DEVICES_LEN; i++)
355{
356if (intel_gfx_chipsets[i].model == ((device_id << 16) | vendor_id))
357{
358snprintf(desc, sizeof(desc), "%s %s", INTEL_NAME, intel_gfx_chipsets[i].label_info);
359return desc;
360}
361}
362snprintf(desc, sizeof(desc), "Unknown %s Graphics card", INTEL_NAME);
363return desc;
364}
365
366bool setup_gma_devprop(pci_dt_t *gma_dev)
367{
368char*devicepath = NULL;
369volatile uint8_t*regs;
370uint32_tbar[7];
371char*model = NULL;
372uint8_t BuiltIn =0x00;
373uint16_tvendor_id = gma_dev->vendor_id;
374uint16_tdevice_id = gma_dev->device_id;
375uint8_t ClassFix[4] = { 0x00, 0x00, 0x03, 0x00 };
376intn_igs = 0;
377intlen;
378const char*value;
379devicepath = get_pci_dev_path(gma_dev);
380
381bar[0] = pci_config_read32(gma_dev->dev.addr, 0x10);
382regs = (uint8_t *) (bar[0] & ~0x0f);
383
384model = get_gma_controller_name(device_id, vendor_id);
385
386verbose("---------------------------------------------\n");
387 verbose("------------ INTEL DEVICE INFO --------------\n");
388verbose("---------------------------------------------\n");
389verbose("Class code: [%04x]\n%s [%04x:%04x] (rev %02x)\nSubsystem: [%04x:%04x] :: %s\n",
390gma_dev->class_id, model, gma_dev->vendor_id, gma_dev->device_id, gma_dev->revision_id, gma_dev->subsys_id.subsys.vendor_id, gma_dev->subsys_id.subsys.device_id, devicepath);
391
392if (!string) {
393string = devprop_create_string();
394}
395
396struct DevPropDevice *device = devprop_add_device(string, devicepath);
397if (!device) {
398printf("Failed initializing dev-prop string dev-entry.\n");
399pause();
400return false;
401}
402
403devprop_add_value(device, "model", (uint8_t*)model, (strlen(model) + 1));
404devprop_add_value(device, "device_type", (uint8_t*)"display", 8);
405
406
407switch ((device_id << 16) | vendor_id)
408{
409 case GMA_IRONLAKE_D_G: // 0042
410 case GMA_IRONLAKE_M_G: // 0046
411 devprop_add_value(device, "built-in", &BuiltIn, 1);
412 devprop_add_value(device, "class-code", ClassFix, 4);
413 devprop_add_value(device, "hda-gfx",(uint8_t *)"onboard-1", 10);
414 devprop_add_value(device, "AAPL,os-info",HDx000_os_info, 20);
415 break;
416 /* 27A2, 27AE, 27A6, A001, A011, A012, */
417 case GMA_I945_GM: // Mobile GMA950 Mobile GMA3150
418 case GMA_I945_GME:
419 //case GMA_945GM:
420 case GMA_PINEVIEW_G:
421 case GMA_PINEVIEW_M:
422 case GMA_GMA3150_M:
423 devprop_add_value(device, "AAPL,HasPanel", reg_TRUE, 4);
424 devprop_add_value(device, "built-in", &BuiltIn, 1);
425 devprop_add_value(device, "class-code", ClassFix, 4);
426 break;
427
428 /* 2772 ,2776, A002 */
429 case GMA_I945_G: // Desktop GMA950 Desktop GMA3150
430 //case GMA_82945G:
431 case GMA_GMA3150_D:
432 BuiltIn = 0x01;
433 devprop_add_value(device, "built-in", &BuiltIn, 1);
434 devprop_add_value(device, "class-code", ClassFix, 4);
435 break;
436
437 /* 2A02, 2A12, 2A13, 2A42, 2A43 */
438 case GMA_I965_GM: // GMAX3100
439 case GMA_I965_GME:
440 //case 0x80862A13:
441 case GMA_GM45_GM:
442 //case GMA_GM45_GM2:
443 devprop_add_value(device, "AAPL,HasPanel", GMAX3100_vals[0], 4);
444 devprop_add_value(device, "AAPL,SelfRefreshSupported",GMAX3100_vals[1], 4);
445 devprop_add_value(device, "AAPL,aux-power-connected",GMAX3100_vals[2], 4);
446 devprop_add_value(device, "AAPL,backlight-control", GMAX3100_vals[3], 4);
447 devprop_add_value(device, "AAPL00,blackscreen-preferences",GMAX3100_vals[4], 4);
448 devprop_add_value(device, "AAPL01,BacklightIntensity",GMAX3100_vals[5], 4);
449 devprop_add_value(device, "AAPL01,blackscreen-preferences",GMAX3100_vals[6], 4);
450 devprop_add_value(device, "AAPL01,DataJustify", GMAX3100_vals[7], 4);
451 devprop_add_value(device, "AAPL01,Depth", GMAX3100_vals[8], 4);
452 devprop_add_value(device, "AAPL01,Dither", GMAX3100_vals[9], 4);
453 devprop_add_value(device, "AAPL01,DualLink", GMAX3100_vals[10], 4);
454 devprop_add_value(device, "AAPL01,Height", GMAX3100_vals[11], 4);
455 devprop_add_value(device, "AAPL01,Interlace", GMAX3100_vals[12], 4);
456 devprop_add_value(device, "AAPL01,Inverter", GMAX3100_vals[13], 4);
457 devprop_add_value(device, "AAPL01,InverterCurrent", GMAX3100_vals[14], 4);
458 devprop_add_value(device, "AAPL01,InverterCurrency",GMAX3100_vals[15], 4);
459 devprop_add_value(device, "AAPL01,LinkFormat", GMAX3100_vals[16], 4);
460 devprop_add_value(device, "AAPL01,LinkType", GMAX3100_vals[17], 4);
461 devprop_add_value(device, "AAPL01,Pipe", GMAX3100_vals[18], 4);
462 devprop_add_value(device, "AAPL01,PixelFormat", GMAX3100_vals[19], 4);
463 devprop_add_value(device, "AAPL01,Refresh", GMAX3100_vals[20], 4);
464 devprop_add_value(device, "AAPL01,Stretch", GMAX3100_vals[21], 4);
465 //devprop_add_value(device, "AAPL01,InverterFrequency",GMAX3100_vals[22], 4);
466 devprop_add_value(device, "class-code", ClassFix, 4);
467 break;
468
469 /* 0106 */
470 case GMA_SANDYBRIDGE_M_GT1: // HD Graphics 2000 Mobile
471 devprop_add_value(device, "class-code", ClassFix, 4);
472 devprop_add_value(device, "hda-gfx",(uint8_t *)"onboard-1", 10);
473 devprop_add_value(device, "AAPL00,PixelFormat",HD2000_vals[0], 4);
474 devprop_add_value(device, "AAPL00,T1",HD2000_vals[1], 4);
475 devprop_add_value(device, "AAPL00,T2",HD2000_vals[2], 4);
476 devprop_add_value(device, "AAPL00,T3",HD2000_vals[3], 4);
477 devprop_add_value(device, "AAPL00,T4",HD2000_vals[4], 4);
478 devprop_add_value(device, "AAPL00,T5",HD2000_vals[5], 4);
479 devprop_add_value(device, "AAPL00,T6",HD2000_vals[6], 4);
480 devprop_add_value(device, "AAPL00,T7",HD2000_vals[7], 4);
481 devprop_add_value(device, "AAPL00,LinkType",HD2000_vals[8], 4);
482 devprop_add_value(device, "AAPL00,LinkFormat",HD2000_vals[9], 4);
483 devprop_add_value(device, "AAPL00,DualLink",HD2000_vals[10], 4);
484 devprop_add_value(device, "AAPL00,Dither",HD2000_vals[11], 4);
485 devprop_add_value(device, "AAPL00,DataJustify",HD3000_vals[12], 4);
486 devprop_add_value(device, "graphic-options",HD2000_vals[13], 4);
487 devprop_add_value(device, "AAPL,tbl-info",HD2000_tbl_info, 18);
488 devprop_add_value(device, "AAPL,os-info",HD2000_os_info, 20);
489 break;
490
491 /* 0116, 0126 */
492 case GMA_SANDYBRIDGE_M_GT2: // HD Graphics 3000 Mobile
493 case GMA_SANDYBRIDGE_M_GT2_PLUS:
494 devprop_add_value(device, "class-code",ClassFix, 4);
495 devprop_add_value(device, "hda-gfx",(uint8_t *)"onboard-1", 10);
496 devprop_add_value(device, "AAPL00,PixelFormat",HD3000_vals[0], 4);
497 devprop_add_value(device, "AAPL00,T1",HD3000_vals[1], 4);
498 devprop_add_value(device, "AAPL00,T2",HD3000_vals[2], 4);
499 devprop_add_value(device, "AAPL00,T3",HD3000_vals[3], 4);
500 devprop_add_value(device, "AAPL00,T4",HD3000_vals[4], 4);
501 devprop_add_value(device, "AAPL00,T5",HD3000_vals[5], 4);
502 devprop_add_value(device, "AAPL00,T6",HD3000_vals[6], 4);
503 devprop_add_value(device, "AAPL00,T7",HD3000_vals[7], 4);
504 devprop_add_value(device, "AAPL00,LinkType",HD3000_vals[8], 4);
505 devprop_add_value(device, "AAPL00,LinkFormat",HD3000_vals[9], 4);
506 devprop_add_value(device, "AAPL00,DualLink",HD3000_vals[10], 4);
507 devprop_add_value(device, "AAPL00,Dither",HD3000_vals[11], 4);
508 devprop_add_value(device, "AAPL00,DataJustify",HD3000_vals[12], 4);
509 devprop_add_value(device, "graphic-options",HD3000_vals[13], 4);
510 devprop_add_value(device, "AAPL,tbl-info",HD3000_tbl_info, 18);
511 devprop_add_value(device, "AAPL,os-info",HD3000_os_info, 20);
512 devprop_add_value(device, "AAPL,snb-platform-id",HD3000_vals[16], 4);// previusly commented
513 break;
514
515 /* 0102 */
516 /* HD Graphics 2000 */
517 case GMA_SANDYBRIDGE_GT1: // 0102
518 device_id = 0x00000102;// Inject a valid mobile GPU device id instead of patching kexts
519 devprop_add_value(device, "built-in",&BuiltIn, 1);
520 devprop_add_value(device, "class-code",ClassFix, 4);
521 devprop_add_value(device, "device-id",(uint8_t*)&device_id, sizeof(device_id));
522 devprop_add_value(device, "hda-gfx",(uint8_t *)"onboard-1", 10);
523 devprop_add_value(device, "AAPL,tbl-info",HD2000_tbl_info, 18);
524 devprop_add_value(device, "AAPL,os-info",HD2000_os_info, 20);
525 break;
526
527 /* Sandy Bridge */
528 /* HD Graphics 3000 */
529 case GMA_SANDYBRIDGE_GT2: // 0112
530 case GMA_SANDYBRIDGE_GT2_PLUS: // 0122
531 devprop_add_value(device, "built-in",&BuiltIn, 1);
532 devprop_add_value(device, "class-code",ClassFix, 4);
533 device_id = 0x00000126;// Inject a valid mobile GPU device id instead of patching kexts
534 devprop_add_value(device, "device-id",(uint8_t*)&device_id, sizeof(device_id));
535 devprop_add_value(device, "hda-gfx",(uint8_t *)"onboard-1", 10);
536 devprop_add_value(device, "AAPL,tbl-info",HD3000_tbl_info, 18);
537 devprop_add_value(device, "AAPL,os-info",HD3000_os_info, 20);
538 break;
539
540 /* Ivy Bridge */
541 /* HD Graphics 4000, HD Graphics 4000 Mobile, HD Graphics P4000, HD Graphics 2500 HD, Graphics 2500 Mobile */
542 case GMA_IVYBRIDGE_D_GT1: // 0152
543 case GMA_IVYBRIDGE_M_GT1: // 0156
544 case GMA_IVYBRIDGE_S_GT1: // 015A
545 case GMA_IVYBRIDGE_S_GT3: // 015e
546 case GMA_IVYBRIDGE_D_GT2: // 0162
547 case GMA_IVYBRIDGE_M_GT2: // 0166
548 case GMA_IVYBRIDGE_S_GT2: // 016A
549 case GMA_IVYBRIDGE_S_GT4: // 0172
550 case GMA_IVYBRIDGE_S_GT5: // 0176
551
552 if (getValueForKey(kAAPLCustomIG, &value, &len, &bootInfo->chameleonConfig) && len == AAPL_LEN_IVY * 2)
553 {
554 uint8_t new_aapl0[AAPL_LEN_IVY];
555
556 if (hex2bin(value, new_aapl0, AAPL_LEN_IVY) == 0)
557 {
558 memcpy(default_aapl_ivy, new_aapl0, AAPL_LEN_IVY);
559
560 verbose("Using user supplied AAPL,ig-platform-id\n");
561 verbose("AAPL,ig-platform-id: %02x%02x%02x%02x\n",
562 default_aapl_ivy[0], default_aapl_ivy[1], default_aapl_ivy[2], default_aapl_ivy[3]);
563 }
564 devprop_add_value(device, "AAPL,ig-platform-id", default_aapl_ivy, AAPL_LEN_IVY);
565 }
566 else if (getIntForKey(kIntelCapriFB, &n_igs, &bootInfo->chameleonConfig))
567 {
568 if ((n_igs >= 0) || (n_igs <= 11))
569 {
570 verbose("AAPL,ig-platform-id was set in org.chameleon.Boot.plist with value %d\n", n_igs);
571 devprop_add_value(device, "AAPL,ig-platform-id", ivy_bridge_ig_vals[n_igs], 4);
572 }
573 else
574 {
575 verbose("AAPL,ig-platform-id was set in org.chameleon.Boot.plist with bad value please choose a number between 0 and 11.\n");
576 }
577 }
578 else
579 {
580 uint32_t ig_platform_id;
581 uint32_t ram = (((getVBEVideoRam() + 512) / 1024) + 512) / 1024;
582 switch (ram)
583 {
584 case 96:
585 ig_platform_id = 0x01660000; // 96mb Mobile
586 break;
587
588 case 64:
589 ig_platform_id = 0x01660009; // 64mb Mobile
590 break;
591
592 case 32:
593 ig_platform_id = 0x01620005; // 32mb Desktop
594 break;
595
596 default:
597 printf("Please specify 96, 64, or 32MB RAM for the HD4000 in the bios.\n"
598 "The selected %dMB RAM configuration is not supported for the HD4000.\n", ram);
599 pause();
600 return false;// Exit early before the AAPL,ig-platform-id property is set.
601 break;
602 }
603 devprop_add_value(device, "AAPL,ig-platform-id", (uint8_t *)&ig_platform_id, 4);
604 }
605
606 devprop_add_value(device, "AAPL00,DualLink", HD4000_vals[10], 4);
607 devprop_add_value(device, "built-in", &BuiltIn, 1);
608 devprop_add_value(device, "class-code", ClassFix, 4);
609 devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10);
610 break;
611
612 /* Haswell */
613 /* HD Graphics 5000, HD Graphics 5000 Mobile, HD Graphics P5000, HD Graphics 4600, HD Graphics 4600 Mobile */
614 //case 0x80860090:
615 //case 0x80860091:
616 //case 0x80860092:
617 case GMA_HASWELL_D_GT1: // 0402
618 case GMA_HASWELL_M_GT1: // 0406
619 case GMA_HASWELL_S_GT1: // 040a
620 case GMA_HASWELL_D_GT2: // 0412
621 case GMA_HASWELL_M_GT2: // 0416
622 case GMA_HASWELL_S_GT2: // 041a
623 case GMA_HASWELL_E_GT1: // 040e
624 case GMA_HASWELL_E_GT2: // 041e
625 case GMA_HASWELL_E_GT3: // 042e
626 case GMA_HASWELL_D_GT3: // 0422
627 case GMA_HASWELL_M_GT3: // 0426
628 case GMA_HASWELL_S_GT3: // 042a
629 case GMA_HASWELL_ULT_M_GT1: // 0a06
630 case GMA_HASWELL_ULT_E_GT1: // 0a0e
631 case GMA_HASWELL_ULT_M_GT2: // 0a16
632 case GMA_HASWELL_ULT_E_GT2: // 0a1e
633 case GMA_HASWELL_ULT_D_GT3: // 0a22
634 case GMA_HASWELL_ULT_M_GT3: // 0a26
635 case GMA_HASWELL_ULT_S_GT3: // 0a2a
636 case GMA_HASWELL_ULT_E_GT3: // 0a2e
637 case GMA_HASWELL_SDV_D_GT1_IG: // 0c02
638 case GMA_HASWELL_SDV_M_GT1_IG: // 0c06
639 case GMA_HASWELL_SDV_D_GT2_IG: // 0c12
640 case GMA_HASWELL_SDV_M_GT2_IG: // 0c16
641 case GMA_HASWELL_SDV_D_GT2_PLUS_IG: // 0c22
642 case GMA_HASWELL_SDV_M_GT2_PLUS_IG: // 0c26
643 case GMA_HASWELL_CRW_D_GT1: // 0d02
644 case GMA_HASWELL_CRW_D_GT2: // 0d12
645 case GMA_HASWELL_CRW_D_GT3: // 0d22
646 case GMA_HASWELL_CRW_M_GT1: // 0d06
647 case GMA_HASWELL_CRW_M_GT2: // 0d16
648 case GMA_HASWELL_CRW_M_GT3: // 0d26
649 case GMA_HASWELL_CRW_S_GT1: // 0d0a
650 case GMA_HASWELL_CRW_S_GT2: // 0d1a
651 case GMA_HASWELL_CRW_S_GT3: // 0d2a
652 case GMA_HASWELL_CRW_B_GT1: // 0d0b
653 case GMA_HASWELL_CRW_B_GT2: // 0d1b
654 case GMA_HASWELL_CRW_B_GT3: // 0d2b
655 case GMA_HASWELL_CRW_E_GT1: // 0d0e
656 case GMA_HASWELL_CRW_E_GT2: // 0d1e
657 case GMA_HASWELL_CRW_E_GT3: // 0d2e
658 case GMA_HASWELL_CRW_M_GT2_PLUS_IG: // 0d36
659
660 if (getValueForKey(kAAPLCustomIG, &value, &len, &bootInfo->chameleonConfig) && len == AAPL_LEN_HSW * 2)
661 {
662 uint8_t new_aapl0[AAPL_LEN_HSW];
663
664 if (hex2bin(value, new_aapl0, AAPL_LEN_HSW) == 0)
665 {
666 memcpy(default_aapl_haswell, new_aapl0, AAPL_LEN_HSW);
667
668 verbose("Using user supplied AAPL,ig-platform-id\n");
669 verbose("AAPL,ig-platform-id: %02x%02x%02x%02x\n",
670 default_aapl_haswell[0], default_aapl_haswell[1], default_aapl_haswell[2], default_aapl_haswell[3]);
671 }
672 devprop_add_value(device, "AAPL,ig-platform-id", default_aapl_haswell, AAPL_LEN_HSW);
673 }
674 else if (getIntForKey(kIntelAzulFB, &n_igs, &bootInfo->chameleonConfig))
675 {
676 if ((n_igs >= 0) || (n_igs <= 15))
677 {
678 verbose("AAPL,ig-platform-id was set in org.chameleon.Boot.plist with value %d\n", n_igs);
679 devprop_add_value(device, "AAPL,ig-platform-id", haswell_ig_vals[n_igs], 4);
680 }
681 else
682 {
683 verbose("AAPL,ig-platform-id was set in org.chameleon.Boot.plist with bad value please choose a number between 0 and 15.\n");
684 }
685 }
686 else
687 {
688uint32_t ig_platform_id = 0x0000260c; // set the default platform ig
689devprop_add_value(device, "AAPL,ig-platform-id", (uint8_t *)&ig_platform_id, 4);
690 }
691
692 devprop_add_value(device, "AAPL00,DualLink", HD4000_vals[10], 4);
693 devprop_add_value(device, "built-in", &BuiltIn, 1);
694 devprop_add_value(device, "class-code", ClassFix, 4);
695 devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10);
696 break;
697
698 default:
699 break;
700}
701
702stringdata = malloc(sizeof(uint8_t) * string->length);
703if (!stringdata)
704{
705printf("No stringdata.\n");
706pause();
707return false;
708}
709
710verbose("---------------------------------------------\n");
711memcpy(stringdata, (uint8_t*)devprop_generate_string(string), string->length);
712stringlength = string->length;
713
714return true;
715}
716

Archive Download this file

Revision: HEAD