Chameleon

Chameleon Svn Source Tree

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

1/*
2Original patch by Nawcom
3http://forum.voodooprojects.org/index.php/topic,1029.0.html
4
5 Original Intel HDx000 code from valv
6*/
7
8#include "libsa.h"
9#include "saio_internal.h"
10#include "bootstruct.h"
11#include "pci.h"
12#include "platform.h"
13#include "device_inject.h"
14#include "gma.h"
15#include "vbe.h"
16#include "graphics.h"
17#include "stdio.h"
18
19#ifndef DEBUG_GMA
20#define DEBUG_GMA 0
21#endif
22
23#if DEBUG_GMA
24#define DBG(x...)printf(x)
25#else
26#define DBG(x...)
27#endif
28
29uint8_t GMAX3100_vals[22][4] = {
30{ 0x01,0x00,0x00,0x00 },
31{ 0x01,0x00,0x00,0x00 },
32{ 0x01,0x00,0x00,0x00 },
33{ 0x00,0x00,0x00,0x08 },
34{ 0x64,0x00,0x00,0x00 },
35{ 0x00,0x00,0x00,0x08 },
36{ 0x01,0x00,0x00,0x00 },
37{ 0x20,0x00,0x00,0x00 },
38{ 0x00,0x00,0x00,0x00 },
39{ 0x01,0x00,0x00,0x00 },
40{ 0x20,0x03,0x00,0x00 },
41{ 0x00,0x00,0x00,0x00 },
42{ 0x00,0x00,0x00,0x00 },
43{ 0x00,0x00,0x00,0x00 },
44{ 0x08,0x52,0x00,0x00 },
45{ 0x00,0x00,0x00,0x00 },
46{ 0x00,0x00,0x00,0x00 },
47{ 0x01,0x00,0x00,0x00 },
48{ 0x01,0x00,0x00,0x00 },
49{ 0x3B,0x00,0x00,0x00 },
50{ 0x00,0x00,0x00,0x00 }
51};
52
53uint8_t HD2000_vals[16][4] = {
54{ 0x00,0x00,0x00,0x00 },
55{ 0x00,0x00,0x00,0x00 },
56{ 0x14,0x00,0x00,0x00 },
57{ 0xfa,0x00,0x00,0x00 },
58{ 0x2c,0x01,0x00,0x00 },
59{ 0x00,0x00,0x00,0x00 },
60{ 0x14,0x00,0x00,0x00 },
61{ 0xf4,0x01,0x00,0x00 },
62{ 0x00,0x00,0x00,0x00 },
63{ 0x00,0x00,0x00,0x00 },
64{ 0x00,0x00,0x00,0x00 },
65{ 0x00,0x00,0x00,0x00 },
66{ 0x00,0x00,0x00,0x00 },
67{ 0x00,0x00,0x00,0x00 },
68{ 0x00,0x00,0x00,0x00 },
69{ 0x01,0x00,0x00,0x00 },
70};
71
72uint8_t HD3000_vals[16][4] = {
73{ 0x00,0x00,0x00,0x00 },
74{ 0x00,0x00,0x00,0x00 },
75{ 0x14,0x00,0x00,0x00 },
76{ 0xfa,0x00,0x00,0x00 },
77{ 0x2c,0x01,0x00,0x00 },
78{ 0x00,0x00,0x00,0x00 },
79{ 0x14,0x00,0x00,0x00 },
80{ 0xf4,0x01,0x00,0x00 },
81{ 0x00,0x00,0x00,0x00 },
82{ 0x00,0x00,0x00,0x00 },
83{ 0x00,0x00,0x00,0x00 },
84{ 0x00,0x00,0x00,0x00 },
85{ 0x00,0x00,0x00,0x00 },
86{ 0x00,0x00,0x00,0x00 },
87{ 0x00,0x00,0x00,0x00 },
88{ 0x01,0x00,0x00,0x00 },
89};
90
91uint8_t HD2000_tbl_info[18] = {
920x30,0x44,0x02,0x02,0x02,0x02,0x00,0x00,0x00,
930x00,0x01,0x02,0x02,0x02,0x00,0x01,0x02,0x02
94};
95uint8_t HD2000_os_info[20] = {
960x30,0x49,0x01,0x11,0x11,0x11,0x08,0x00,0x00,0x01,
970xf0,0x1f,0x01,0x00,0x00,0x00,0x10,0x07,0x00,0x00
98};
99
100// MacMan: The following values came from a Sandy Bridge MacBook Air
101uint8_t HD3000_tbl_info[18] = {
1020x30,0x44,0x02,0x02,0x02,0x02,0x00,0x00,0x00,
1030x00,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01
104};
105
106//MacMan: The following values came from a Sandy Bridge MacBook Air
107uint8_t HD3000_os_info[20] = {
1080x30,0x49,0x01,0x12,0x12,0x12,0x08,0x00,0x00,0x01,
1090xf0,0x1f,0x01,0x00,0x00,0x00,0x10,0x07,0x00,0x00
110};
111
112
113uint8_t reg_TRUE[]= { 0x01, 0x00, 0x00, 0x00 };
114uint8_t reg_FALSE[] = { 0x00, 0x00, 0x00, 0x00 };
115
116static struct gma_gpu_t KnownGPUS[] = {
117{ 0x00000000, "Unknown"},
118{ 0x808627A2, "Mobile GMA950"},
119{ 0x808627AE, "Mobile GMA950"},
120{ 0x808627A6, "Mobile GMA950"},
121{ 0x8086A011, "Mobile GMA3150"},
122{ 0x8086A012, "Mobile GMA3150"},
123{ 0x80862772, "Desktop GMA950"},
124{ 0x80862776, "Desktop GMA950"},
125{ 0x8086A001, "Mobile GMA3150"},
126{ 0x8086A002, "Desktop GMA3150" },
127{ 0x80862A02, "GMAX3100"},
128{ 0x80862A03, "GMAX3100"},
129{ 0x80862A12, "GMAX3100"},
130{ 0x80862A13, "GMAX3100"},
131{ 0x80862A42, "GMAX3100"},
132{ 0x80862A43, "GMAX3100"},
133{ 0x80860102, "Intel HD Graphics 2000"},
134{ 0x80860106, "Intel HD Graphics 2000 Mobile"},
135{ 0x80860112, "Intel HD Graphics 3000"},
136{ 0x80860116, "Intel HD Graphics 3000 Mobile"},
137{ 0x80860122, "Intel HD Graphics 3000"},
138{ 0x80860126, "Intel HD Graphics 3000 Mobile"},
139 { 0x80860152, "Intel HD Graphics 2500"},
140 { 0x80860156, "Intel HD Graphics 2500 Mobile"},
141 { 0x80860162, "Intel HD Graphics 4000"},
142 { 0x80860166, "Intel HD Graphics 4000 Mobile"},
143 { 0x80860412, "Intel HD Graphics 4600"}, // MacMan
144 { 0x80860416, "Intel HD Graphics 4600 Mobile"}, // MacMan
145 { 0x80860422, "Intel HD Graphics 5000"}, // MacMan
146 { 0x80860426, "Intel HD Graphics 5000 Mobile"}, // MacMan
147};
148
149char *get_gma_model(uint32_t id) {
150int i = 0;
151
152for (i = 0; i < (sizeof(KnownGPUS) / sizeof(KnownGPUS[0])); i++)
153{
154if (KnownGPUS[i].device == id)
155return KnownGPUS[i].name;
156}
157return KnownGPUS[0].name;
158}
159
160bool setup_gma_devprop(pci_dt_t *gma_dev)
161{
162 intlen;
163 const char*value;
164 char*devicepath;
165volatile uint8_t*regs;
166uint32_tbar[7];
167char*model;
168unsigned intdevice_id;
169uint8_t BuiltIn = 0x00;
170uint8_t ClassFix[4] = { 0x00, 0x00, 0x03, 0x00 };
171 uint8_t hd3k_device_id[4] = { 0x26, 0x01, 0x00, 0x00 };
172 uint8_t hd4k_device_id[4] = { 0x66, 0x01, 0x00, 0x00 };
173 uint8_t hd4600_device_id[4] = { 0x12, 0x04, 0x00, 0x00 }; // MacMan
174 uint8_t hd5k_device_id[4] = { 0x16, 0x04, 0x00, 0x00 }; // MacMan
175 uint8_t snb_id_3k[4] = { 0x10, 0x00, 0x03, 0x00 };
176 uint8_t ig_id_2500[4] = { 0x0B, 0x00, 0x66, 0x01 }; // MacMan
177 uint8_t ig_id_4k[4] = { 0x0A, 0x00, 0x66, 0x01 };
178 uint8_t ig_id_4k_mobile[4] = { 0x09, 0x00, 0x66, 0x01 }; // MacMan
179 uint8_t ig_id_4600[4] = { 0x00, 0x00, 0x16, 0x04 }; // MacMan
180 uint8_t ig_id_5k[4] = { 0x00, 0x00, 0x26, 0x04 }; // MacMan
181 uint8_t ig_platform_id[4] = { 0x00, 0x00, 0x00, 0x00 }; // MacMan
182
183devicepath = get_pci_dev_path(gma_dev);
184
185bar[0] = pci_config_read32(gma_dev->dev.addr, 0x10);
186regs = (uint8_t *) (bar[0] & ~0x0f);
187
188model = get_gma_model((gma_dev->vendor_id << 16) | gma_dev->device_id);
189device_id = gma_dev->device_id;
190
191verbose("Intel %s [%04x:%04x] :: %s\n",
192model, gma_dev->vendor_id, gma_dev->device_id, devicepath);
193
194if (!string)
195string = devprop_create_string();
196
197struct DevPropDevice *device = malloc(sizeof(struct DevPropDevice));
198device = devprop_add_device(string, devicepath);
199
200if (!device)
201{
202printf("Failed initializing dev-prop string dev-entry.\n");
203pause();
204return false;
205}
206
207devprop_add_value(device, "model", (uint8_t*)model, (strlen(model) + 1));
208//devprop_add_value(device, "device_type", (uint8_t*)"display", 8);
209
210if ((model == (char *)&"Mobile GMA950")
211|| (model == (char *)&"Mobile GMA3150"))
212{
213devprop_add_value(device, "AAPL,HasPanel", reg_TRUE, 4);
214devprop_add_value(device, "built-in", &BuiltIn, 1);
215devprop_add_value(device, "class-code", ClassFix, 4);
216}
217else if ((model == (char *)&"Desktop GMA950")
218|| (model == (char *)&"Desktop GMA3150"))
219{
220BuiltIn = 0x01;
221devprop_add_value(device, "built-in", &BuiltIn, 1);
222devprop_add_value(device, "class-code", ClassFix, 4);
223}
224else if (model == (char *)&"GMAX3100")
225{
226devprop_add_value(device, "AAPL,HasPanel",GMAX3100_vals[0], 4);
227devprop_add_value(device, "AAPL,SelfRefreshSupported",GMAX3100_vals[1], 4);
228devprop_add_value(device, "AAPL,aux-power-connected",GMAX3100_vals[2], 4);
229devprop_add_value(device, "AAPL,backlight-control",GMAX3100_vals[3], 4);
230devprop_add_value(device, "AAPL00,blackscreen-preferences", GMAX3100_vals[4], 4);
231devprop_add_value(device, "AAPL01,BacklightIntensity",GMAX3100_vals[5], 4);
232devprop_add_value(device, "AAPL01,blackscreen-preferences", GMAX3100_vals[6], 4);
233devprop_add_value(device, "AAPL01,DataJustify",GMAX3100_vals[7], 4);
234devprop_add_value(device, "AAPL01,Depth",GMAX3100_vals[8], 4);
235devprop_add_value(device, "AAPL01,Dither",GMAX3100_vals[9], 4);
236devprop_add_value(device, "AAPL01,DualLink",GMAX3100_vals[10], 4);
237devprop_add_value(device, "AAPL01,Height",GMAX3100_vals[11], 4);
238devprop_add_value(device, "AAPL01,Interlace",GMAX3100_vals[12], 4);
239devprop_add_value(device, "AAPL01,Inverter",GMAX3100_vals[13], 4);
240devprop_add_value(device, "AAPL01,InverterCurrent",GMAX3100_vals[14], 4);
241devprop_add_value(device, "AAPL01,InverterCurrency",GMAX3100_vals[15], 4);
242devprop_add_value(device, "AAPL01,LinkFormat",GMAX3100_vals[16], 4);
243devprop_add_value(device, "AAPL01,LinkType",GMAX3100_vals[17], 4);
244devprop_add_value(device, "AAPL01,Pipe",GMAX3100_vals[18], 4);
245devprop_add_value(device, "AAPL01,PixelFormat",GMAX3100_vals[19], 4);
246devprop_add_value(device, "AAPL01,Refresh",GMAX3100_vals[20], 4);
247devprop_add_value(device, "AAPL01,Stretch",GMAX3100_vals[21], 4);
248devprop_add_value(device, "class-code",ClassFix, 4);
249}
250else if (model == (char *)&"Intel HD Graphics 2000")
251{
252devprop_add_value(device, "built-in", &BuiltIn, 1);
253devprop_add_value(device, "class-code", ClassFix, 4);
254devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10);
255devprop_add_value(device, "AAPL,tbl-info", HD2000_tbl_info, 18);
256devprop_add_value(device, "AAPL,os-info", HD2000_os_info, 20);
257 if (getValueForKey(kIGPlatformID, &value, &len, &bootInfo->chameleonConfig)) // MacMan
258 {
259 sscanf(value, "%8x", ig_platform_id);
260 devprop_add_value(device, "AAPL,snb-platform-id", ig_platform_id, 4);
261 verbose("Setting %s for snb-platform-id\n", value);
262 }
263}
264else if (model == (char *)&"Intel HD Graphics 2000 Mobile")
265{
266devprop_add_value(device, "class-code", ClassFix, 4);
267devprop_add_value(device, "graphic-options", HD2000_vals[13], 4);
268devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10);
269devprop_add_value(device, "AAPL00,DataJustify", HD3000_vals[12], 4);
270devprop_add_value(device, "AAPL00,Dither", HD2000_vals[11], 4);
271devprop_add_value(device, "AAPL00,DualLink", HD2000_vals[10], 4);
272devprop_add_value(device, "AAPL00,LinkFormat", HD2000_vals[9], 4);
273devprop_add_value(device, "AAPL00,LinkType", HD2000_vals[8], 4);
274devprop_add_value(device, "AAPL00,PixelFormat", HD2000_vals[0], 4);
275devprop_add_value(device, "AAPL00,T1", HD2000_vals[1], 4);
276devprop_add_value(device, "AAPL00,T2", HD2000_vals[2], 4);
277devprop_add_value(device, "AAPL00,T3", HD2000_vals[3], 4);
278devprop_add_value(device, "AAPL00,T4", HD2000_vals[4], 4);
279devprop_add_value(device, "AAPL00,T5", HD2000_vals[5], 4);
280devprop_add_value(device, "AAPL00,T6", HD2000_vals[6], 4);
281devprop_add_value(device, "AAPL00,T7", HD2000_vals[7], 4);
282devprop_add_value(device, "AAPL,os-info", HD2000_os_info, 20);
283devprop_add_value(device, "AAPL,tbl-info", HD2000_tbl_info, 18);
284 if (getValueForKey(kIGPlatformID, &value, &len, &bootInfo->chameleonConfig)) // MacMan
285 {
286 sscanf(value, "%8x", ig_platform_id);
287 devprop_add_value(device, "AAPL,snb-platform-id", ig_platform_id, 4);
288 verbose("Setting %s for snb-platform-id\n", value);
289 }
290}
291 else if (model == (char *)&"Intel HD Graphics 3000")
292{
293devprop_add_value(device, "built-in", &BuiltIn, 1);
294devprop_add_value(device, "class-code", ClassFix, 4);
295devprop_add_value(device, "device-id", hd3k_device_id, 4);
296devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10);
297devprop_add_value(device, "AAPL,tbl-info", HD3000_tbl_info, 18);
298devprop_add_value(device, "AAPL,os-info", HD3000_os_info, 20);
299 if (getValueForKey(kIGPlatformID, &value, &len, &bootInfo->chameleonConfig)) // MacMan
300 {
301 sscanf(value, "%8x", ig_platform_id);
302 devprop_add_value(device, "AAPL,snb-platform-id", ig_platform_id, 4);
303 verbose("Using %s for snb-platform-id\n", value);
304 }
305 else
306 {
307 devprop_add_value(device, "AAPL,snb-platform-id", snb_id_3k, 4);
308 }
309}
310else if (model == (char *)&"Intel HD Graphics 3000 Mobile")
311{
312devprop_add_value(device, "class-code", ClassFix, 4);
313devprop_add_value(device, "graphic-options", HD3000_vals[13], 4);
314devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10);
315devprop_add_value(device, "AAPL00,DataJustify", HD3000_vals[12], 4);
316devprop_add_value(device, "AAPL00,Dither", HD3000_vals[11], 4);
317devprop_add_value(device, "AAPL00,DualLink", HD3000_vals[10], 4);
318devprop_add_value(device, "AAPL00,LinkFormat", HD3000_vals[9], 4);
319devprop_add_value(device, "AAPL00,LinkType", HD3000_vals[8], 4);
320devprop_add_value(device, "AAPL00,PixelFormat", HD3000_vals[0], 4);
321devprop_add_value(device, "AAPL00,T1", HD3000_vals[1], 4);
322devprop_add_value(device, "AAPL00,T2", HD3000_vals[2], 4);
323devprop_add_value(device, "AAPL00,T3", HD3000_vals[3], 4);
324devprop_add_value(device, "AAPL00,T4", HD3000_vals[4], 4);
325devprop_add_value(device, "AAPL00,T5", HD3000_vals[5], 4);
326devprop_add_value(device, "AAPL00,T6", HD3000_vals[6], 4);
327devprop_add_value(device, "AAPL00,T7", HD3000_vals[7], 4);
328devprop_add_value(device, "AAPL,os-info", HD3000_os_info, 20);
329devprop_add_value(device, "AAPL,tbl-info", HD3000_tbl_info, 18);
330 if (getValueForKey(kIGPlatformID, &value, &len, &bootInfo->chameleonConfig)) // MacMan
331 {
332 sscanf(value, "%8x", ig_platform_id);
333 devprop_add_value(device, "AAPL,snb-platform-id", ig_platform_id, 4);
334 verbose("Setting %s for snb-platform-id\n", value);
335 }
336}
337 else if (model == (char *)&"Intel HD Graphics 2500") // MacMan
338{
339devprop_add_value(device, "built-in", &BuiltIn, 1);
340devprop_add_value(device, "class-code", ClassFix, 4);
341devprop_add_value(device, "device-id", hd4k_device_id, 4);
342devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10);
343 if (getValueForKey(kIGPlatformID, &value, &len, &bootInfo->chameleonConfig))
344 {
345 sscanf(value, "%8x", ig_platform_id);
346 devprop_add_value(device, "AAPL,ig-platform-id", ig_platform_id, 4);
347 verbose("Using %s for ig-platform-id\n", value);
348 }
349 else
350 {
351 devprop_add_value(device, "AAPL,ig-platform-id", ig_id_2500, 4);
352 }
353}
354 else if (model == (char *)&"Intel HD Graphics 4000")
355{
356devprop_add_value(device, "built-in", &BuiltIn, 1);
357devprop_add_value(device, "class-code", ClassFix, 4);
358devprop_add_value(device, "device-id", hd4k_device_id, 4);
359devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10);
360 if (getValueForKey(kIGPlatformID, &value, &len, &bootInfo->chameleonConfig)) // MacMan
361 {
362 sscanf(value, "%8x", ig_platform_id);
363 devprop_add_value(device, "AAPL,ig-platform-id", ig_platform_id, 4);
364 verbose("Using %s for ig-platform-id\n", value);
365 }
366 else
367 {
368 devprop_add_value(device, "AAPL,ig-platform-id", ig_id_4k, 4);
369 }
370}
371 else if (model == (char *)&"Intel HD Graphics 4000 Mobile")
372{
373devprop_add_value(device, "built-in", &BuiltIn, 1);
374devprop_add_value(device, "class-code", ClassFix, 4);
375devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10);
376 if (getValueForKey(kIGPlatformID, &value, &len, &bootInfo->chameleonConfig)) // MacMan
377 {
378 sscanf(value, "%8x", ig_platform_id);
379 devprop_add_value(device, "AAPL,ig-platform-id", ig_platform_id, 4);
380 verbose("Using %s for ig-platform-id\n", value);
381 }
382 else
383 {
384 devprop_add_value(device, "AAPL,ig-platform-id", ig_id_4k_mobile, 4);
385 }
386}
387 else if (model == (char *)&"Intel HD Graphics 4600") //MacMan
388{
389devprop_add_value(device, "built-in", &BuiltIn, 1);
390devprop_add_value(device, "class-code", ClassFix, 4);
391devprop_add_value(device, "device-id", hd4600_device_id, 4);
392devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10);
393 if (getValueForKey(kIGPlatformID, &value, &len, &bootInfo->chameleonConfig))
394 {
395 sscanf(value, "%8x", ig_platform_id);
396 devprop_add_value(device, "AAPL,ig-platform-id", ig_platform_id, 4);
397 verbose("Using %s for ig-platform-id\n", value);
398 }
399 else
400 {
401 devprop_add_value(device, "AAPL,ig-platform-id", ig_id_4600, 4);
402 }
403}
404 else if (model == (char *)&"Intel HD Graphics 5000") //MacMan
405{
406devprop_add_value(device, "built-in", &BuiltIn, 1);
407devprop_add_value(device, "class-code", ClassFix, 4);
408devprop_add_value(device, "device-id", hd5k_device_id, 4);
409devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10);
410 if (getValueForKey(kIGPlatformID, &value, &len, &bootInfo->chameleonConfig))
411 {
412 sscanf(value, "%8x", ig_platform_id);
413 devprop_add_value(device, "AAPL,ig-platform-id", ig_platform_id, 4);
414 verbose("Using %s for ig-platform-id\n", value);
415 }
416 else
417 {
418 devprop_add_value(device, "AAPL,ig-platform-id", ig_id_5k, 4);
419 }
420}
421
422stringdata = malloc(sizeof(uint8_t) * string->length);
423if (!stringdata)
424{
425printf("No stringdata.\n");
426pause();
427return false;
428}
429
430memcpy(stringdata, (uint8_t*)devprop_generate_string(string), string->length);
431stringlength = string->length;
432
433return true;
434}
435

Archive Download this file

Revision: 2264