Chameleon

Chameleon Svn Source Tree

Root/tags/2.1/i386/libsaio/gma.c

Source at commit 2381 created 10 years 21 days ago.
By ifabio, Apply patch: (Credits to Thomas Jansen aka tja) - Reading options from all devices during boot. The options for the boot menu are only read from the devices rd(0,0) or bt(0,0). Consequently, boot menu options (e.g. "Quiet Boot", "Timeout", etc.) in plists on other devices (like most users have) are ignored. This patch extends the list of paths to search for the options plist on all devices that can be found.
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
16#ifndef DEBUG_GMA
17#define DEBUG_GMA 0
18#endif
19
20#if DEBUG_GMA
21#define DBG(x...)printf(x)
22#else
23#define DBG(x...)
24#endif
25
26uint8_t GMAX3100_vals[22][4] = {
27{ 0x01,0x00,0x00,0x00 },
28{ 0x01,0x00,0x00,0x00 },
29{ 0x01,0x00,0x00,0x00 },
30{ 0x00,0x00,0x00,0x08 },
31{ 0x64,0x00,0x00,0x00 },
32{ 0x00,0x00,0x00,0x08 },
33{ 0x01,0x00,0x00,0x00 },
34{ 0x20,0x00,0x00,0x00 },
35{ 0x00,0x00,0x00,0x00 },
36{ 0x01,0x00,0x00,0x00 },
37{ 0x20,0x03,0x00,0x00 },
38{ 0x00,0x00,0x00,0x00 },
39{ 0x00,0x00,0x00,0x00 },
40{ 0x00,0x00,0x00,0x00 },
41{ 0x08,0x52,0x00,0x00 },
42{ 0x00,0x00,0x00,0x00 },
43{ 0x00,0x00,0x00,0x00 },
44{ 0x01,0x00,0x00,0x00 },
45{ 0x01,0x00,0x00,0x00 },
46{ 0x3B,0x00,0x00,0x00 },
47{ 0x00,0x00,0x00,0x00 }
48};
49
50uint8_t HD2000_vals[16][4] = {
51{ 0x00,0x00,0x00,0x00 },
52{ 0x00,0x00,0x00,0x00 },
53{ 0x14,0x00,0x00,0x00 },
54{ 0xfa,0x00,0x00,0x00 },
55{ 0x2c,0x01,0x00,0x00 },
56{ 0x00,0x00,0x00,0x00 },
57{ 0x14,0x00,0x00,0x00 },
58{ 0xf4,0x01,0x00,0x00 },
59{ 0x00,0x00,0x00,0x00 },
60{ 0x00,0x00,0x00,0x00 },
61{ 0x00,0x00,0x00,0x00 },
62{ 0x00,0x00,0x00,0x00 },
63{ 0x00,0x00,0x00,0x00 },
64{ 0x00,0x00,0x00,0x00 },
65{ 0x00,0x00,0x00,0x00 },
66{ 0x01,0x00,0x00,0x00 },
67};
68
69uint8_t HD3000_vals[16][4] = {
70{ 0x00,0x00,0x00,0x00 },
71{ 0x00,0x00,0x00,0x00 },
72{ 0x14,0x00,0x00,0x00 },
73{ 0xfa,0x00,0x00,0x00 },
74{ 0x2c,0x01,0x00,0x00 },
75{ 0x00,0x00,0x00,0x00 },
76{ 0x14,0x00,0x00,0x00 },
77{ 0xf4,0x01,0x00,0x00 },
78{ 0x00,0x00,0x00,0x00 },
79{ 0x00,0x00,0x00,0x00 },
80{ 0x00,0x00,0x00,0x00 },
81{ 0x00,0x00,0x00,0x00 },
82{ 0x00,0x00,0x00,0x00 },
83{ 0x00,0x00,0x00,0x00 },
84{ 0x00,0x00,0x00,0x00 },
85{ 0x01,0x00,0x00,0x00 },
86};
87
88uint8_t HD2000_tbl_info[18] = {
890x30,0x44,0x02,0x02,0x02,0x02,0x00,0x00,0x00,
900x00,0x01,0x02,0x02,0x02,0x00,0x01,0x02,0x02
91};
92uint8_t HD2000_os_info[20] = {
930x30,0x49,0x01,0x11,0x11,0x11,0x08,0x00,0x00,0x01,
940xf0,0x1f,0x01,0x00,0x00,0x00,0x10,0x07,0x00,0x00
95};
96
97// The following values came from a Sandy Bridge MacBook Air
98uint8_t HD3000_tbl_info[18] = {
990x30,0x44,0x02,0x02,0x02,0x02,0x00,0x00,0x00,
1000x00,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01
101};
102
103// The following values came from a Sandy Bridge MacBook Air
104uint8_t HD3000_os_info[20] = {
1050x30,0x49,0x01,0x12,0x12,0x12,0x08,0x00,0x00,0x01,
1060xf0,0x1f,0x01,0x00,0x00,0x00,0x10,0x07,0x00,0x00
107};
108
109
110uint8_t reg_TRUE[]= { 0x01, 0x00, 0x00, 0x00 };
111uint8_t reg_FALSE[] = { 0x00, 0x00, 0x00, 0x00 };
112
113static struct gma_gpu_t KnownGPUS[] = {
114{ 0x00000000, "Unknown"},
115{ 0x808627A2, "Mobile GMA950"},
116{ 0x808627AE, "Mobile GMA950"},
117{ 0x808627A6, "Mobile GMA950"},
118{ 0x8086A011, "Mobile GMA3150"},
119{ 0x8086A012, "Mobile GMA3150"},
120{ 0x80862772, "Desktop GMA950"},
121{ 0x80862776, "Desktop GMA950"},
122//{ 0x8086A001, "Desktop GMA3150" },
123{ 0x8086A001, "Mobile GMA3150"},
124{ 0x8086A002, "Desktop GMA3150" },
125{ 0x80862A02, "GMAX3100"},
126{ 0x80862A03, "GMAX3100"},
127{ 0x80862A12, "GMAX3100"},
128{ 0x80862A13, "GMAX3100"},
129{ 0x80862A42, "GMAX3100"},
130{ 0x80862A43, "GMAX3100"},
131{ 0x80860102, "Intel HD Graphics 2000"},
132{ 0x80860106, "Intel HD Graphics 2000 Mobile"},
133{ 0x80860112, "Intel HD Graphics 3000"},
134{ 0x80860116, "Intel HD Graphics 3000 Mobile"},
135{ 0x80860122, "Intel HD Graphics 3000"},
136{ 0x80860126, "Intel HD Graphics 3000 Mobile"},
137};
138
139char *get_gma_model(uint32_t id) {
140int i = 0;
141
142for (i = 0; i < (sizeof(KnownGPUS) / sizeof(KnownGPUS[0])); i++)
143{
144if (KnownGPUS[i].device == id)
145return KnownGPUS[i].name;
146}
147return KnownGPUS[0].name;
148}
149
150bool setup_gma_devprop(pci_dt_t *gma_dev)
151{
152char*devicepath;
153volatile uint8_t*regs;
154uint32_tbar[7];
155char*model;
156uint8_t BuiltIn =0x00;
157uint8_t ClassFix[4] ={ 0x00, 0x00, 0x03, 0x00 };
158unsigned intdevice_id;
159
160devicepath = get_pci_dev_path(gma_dev);
161
162bar[0] = pci_config_read32(gma_dev->dev.addr, 0x10);
163regs = (uint8_t *) (bar[0] & ~0x0f);
164
165model = get_gma_model((gma_dev->vendor_id << 16) | gma_dev->device_id);
166device_id = gma_dev->device_id;
167
168verbose("Intel %s [%04x:%04x] :: %s\n",
169model, gma_dev->vendor_id, gma_dev->device_id, devicepath);
170
171if (!string)
172string = devprop_create_string();
173
174struct DevPropDevice *device = malloc(sizeof(struct DevPropDevice));
175device = devprop_add_device(string, devicepath);
176
177if (!device)
178{
179printf("Failed initializing dev-prop string dev-entry.\n");
180pause();
181return false;
182}
183
184devprop_add_value(device, "model", (uint8_t*)model, (strlen(model) + 1));
185devprop_add_value(device, "device_type", (uint8_t*)"display", 8);
186
187if ((model == (char *)&"Mobile GMA950")
188|| (model == (char *)&"Mobile GMA3150"))
189{
190devprop_add_value(device, "AAPL,HasPanel", reg_TRUE, 4);
191devprop_add_value(device, "built-in", &BuiltIn, 1);
192devprop_add_value(device, "class-code", ClassFix, 4);
193}
194else if ((model == (char *)&"Desktop GMA950")
195|| (model == (char *)&"Desktop GMA3150"))
196{
197BuiltIn = 0x01;
198devprop_add_value(device, "built-in", &BuiltIn, 1);
199devprop_add_value(device, "class-code", ClassFix, 4);
200}
201else if (model == (char *)&"GMAX3100")
202{
203devprop_add_value(device, "AAPL,HasPanel",GMAX3100_vals[0], 4);
204devprop_add_value(device, "AAPL,SelfRefreshSupported",GMAX3100_vals[1], 4);
205devprop_add_value(device, "AAPL,aux-power-connected",GMAX3100_vals[2], 4);
206devprop_add_value(device, "AAPL,backlight-control",GMAX3100_vals[3], 4);
207devprop_add_value(device, "AAPL00,blackscreen-preferences", GMAX3100_vals[4], 4);
208devprop_add_value(device, "AAPL01,BacklightIntensity",GMAX3100_vals[5], 4);
209devprop_add_value(device, "AAPL01,blackscreen-preferences", GMAX3100_vals[6], 4);
210devprop_add_value(device, "AAPL01,DataJustify",GMAX3100_vals[7], 4);
211devprop_add_value(device, "AAPL01,Depth",GMAX3100_vals[8], 4);
212devprop_add_value(device, "AAPL01,Dither",GMAX3100_vals[9], 4);
213devprop_add_value(device, "AAPL01,DualLink",GMAX3100_vals[10], 4);
214devprop_add_value(device, "AAPL01,Height",GMAX3100_vals[11], 4);
215devprop_add_value(device, "AAPL01,Interlace",GMAX3100_vals[12], 4);
216devprop_add_value(device, "AAPL01,Inverter",GMAX3100_vals[13], 4);
217devprop_add_value(device, "AAPL01,InverterCurrent",GMAX3100_vals[14], 4);
218devprop_add_value(device, "AAPL01,InverterCurrency",GMAX3100_vals[15], 4);
219devprop_add_value(device, "AAPL01,LinkFormat",GMAX3100_vals[16], 4);
220devprop_add_value(device, "AAPL01,LinkType",GMAX3100_vals[17], 4);
221devprop_add_value(device, "AAPL01,Pipe",GMAX3100_vals[18], 4);
222devprop_add_value(device, "AAPL01,PixelFormat",GMAX3100_vals[19], 4);
223devprop_add_value(device, "AAPL01,Refresh",GMAX3100_vals[20], 4);
224devprop_add_value(device, "AAPL01,Stretch",GMAX3100_vals[21], 4);
225devprop_add_value(device, "class-code",ClassFix, 4);
226}
227else if (model == (char *)&"Intel HD Graphics 2000 Mobile")
228{
229devprop_add_value(device, "class-code", ClassFix, 4);
230devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10);
231devprop_add_value(device, "AAPL00,PixelFormat", HD2000_vals[0], 4);
232devprop_add_value(device, "AAPL00,T1", HD2000_vals[1], 4);
233devprop_add_value(device, "AAPL00,T2", HD2000_vals[2], 4);
234devprop_add_value(device, "AAPL00,T3", HD2000_vals[3], 4);
235devprop_add_value(device, "AAPL00,T4", HD2000_vals[4], 4);
236devprop_add_value(device, "AAPL00,T5", HD2000_vals[5], 4);
237devprop_add_value(device, "AAPL00,T6", HD2000_vals[6], 4);
238devprop_add_value(device, "AAPL00,T7", HD2000_vals[7], 4);
239devprop_add_value(device, "AAPL00,LinkType", HD2000_vals[8], 4);
240devprop_add_value(device, "AAPL00,LinkFormat", HD2000_vals[9], 4);
241devprop_add_value(device, "AAPL00,DualLink", HD2000_vals[10], 4);
242devprop_add_value(device, "AAPL00,Dither", HD2000_vals[11], 4);
243devprop_add_value(device, "AAPL00,DataJustify", HD3000_vals[12], 4);
244devprop_add_value(device, "graphic-options", HD2000_vals[13], 4);
245devprop_add_value(device, "AAPL,tbl-info", HD2000_tbl_info, 18);
246devprop_add_value(device, "AAPL,os-info", HD2000_os_info, 20);
247}
248else if (model == (char *)&"Intel HD Graphics 3000 Mobile")
249{
250devprop_add_value(device, "class-code", ClassFix, 4);
251devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10);
252devprop_add_value(device, "AAPL00,PixelFormat", HD3000_vals[0], 4);
253devprop_add_value(device, "AAPL00,T1", HD3000_vals[1], 4);
254devprop_add_value(device, "AAPL00,T2", HD3000_vals[2], 4);
255devprop_add_value(device, "AAPL00,T3", HD3000_vals[3], 4);
256devprop_add_value(device, "AAPL00,T4", HD3000_vals[4], 4);
257devprop_add_value(device, "AAPL00,T5", HD3000_vals[5], 4);
258devprop_add_value(device, "AAPL00,T6", HD3000_vals[6], 4);
259devprop_add_value(device, "AAPL00,T7", HD3000_vals[7], 4);
260devprop_add_value(device, "AAPL00,LinkType", HD3000_vals[8], 4);
261devprop_add_value(device, "AAPL00,LinkFormat", HD3000_vals[9], 4);
262devprop_add_value(device, "AAPL00,DualLink", HD3000_vals[10], 4);
263devprop_add_value(device, "AAPL00,Dither", HD3000_vals[11], 4);
264devprop_add_value(device, "AAPL00,DataJustify", HD3000_vals[12], 4);
265devprop_add_value(device, "graphic-options", HD3000_vals[13], 4);
266devprop_add_value(device, "AAPL,tbl-info", HD3000_tbl_info, 18);
267devprop_add_value(device, "AAPL,os-info", HD3000_os_info, 20);
268}
269else if (model == (char *)&"Intel HD Graphics 2000")
270{
271devprop_add_value(device, "built-in", &BuiltIn, 1);
272devprop_add_value(device, "class-code", ClassFix, 4);
273devprop_add_value(device, "device-id", (uint8_t*)&device_id, sizeof(device_id));
274devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10);
275devprop_add_value(device, "AAPL,tbl-info", HD2000_tbl_info, 18);
276devprop_add_value(device, "AAPL,os-info", HD2000_os_info, 20);
277}
278else if (model == (char *)&"Intel HD Graphics 3000")
279{
280devprop_add_value(device, "built-in", &BuiltIn, 1);
281devprop_add_value(device, "class-code", ClassFix, 4);
282device_id = 0x00000126;// Inject a valid mobile GPU device id instead of patching kexts
283devprop_add_value(device, "device-id", (uint8_t*)&device_id, sizeof(device_id));
284devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10);
285devprop_add_value(device, "AAPL,tbl-info", HD3000_tbl_info, 18);
286devprop_add_value(device, "AAPL,os-info", HD3000_os_info, 20);
287}
288
289stringdata = malloc(sizeof(uint8_t) * string->length);
290if (!stringdata)
291{
292printf("No stringdata.\n");
293pause();
294return false;
295}
296
297memcpy(stringdata, (uint8_t*)devprop_generate_string(string), string->length);
298stringlength = string->length;
299
300return true;
301}
302

Archive Download this file

Revision: 2381