Root/
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 | /*␊ |
2 | ␉Original patch by Nawcom␊ |
3 | ␉http://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 | ␊ |
26 | uint8_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 | ␊ |
50 | uint8_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 | ␊ |
69 | uint8_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 | ␊ |
88 | uint8_t HD2000_tbl_info[18] = {␊ |
89 | ␉0x30,0x44,0x02,0x02,0x02,0x02,0x00,0x00,0x00,␊ |
90 | ␉0x00,0x01,0x02,0x02,0x02,0x00,0x01,0x02,0x02␊ |
91 | };␊ |
92 | uint8_t HD2000_os_info[20] = {␊ |
93 | ␉0x30,0x49,0x01,0x11,0x11,0x11,0x08,0x00,0x00,0x01,␊ |
94 | ␉0xf0,0x1f,0x01,0x00,0x00,0x00,0x10,0x07,0x00,0x00␊ |
95 | };␊ |
96 | ␊ |
97 | // The following values came from a Sandy Bridge MacBook Air␊ |
98 | uint8_t HD3000_tbl_info[18] = {␊ |
99 | ␉0x30,0x44,0x02,0x02,0x02,0x02,0x00,0x00,0x00,␊ |
100 | ␉0x00,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01␊ |
101 | };␊ |
102 | ␊ |
103 | // The following values came from a Sandy Bridge MacBook Air␊ |
104 | uint8_t HD3000_os_info[20] = {␊ |
105 | ␉0x30,0x49,0x01,0x12,0x12,0x12,0x08,0x00,0x00,0x01,␊ |
106 | ␉0xf0,0x1f,0x01,0x00,0x00,0x00,0x10,0x07,0x00,0x00␊ |
107 | };␊ |
108 | ␊ |
109 | ␊ |
110 | uint8_t reg_TRUE[]␉= { 0x01, 0x00, 0x00, 0x00 };␊ |
111 | uint8_t reg_FALSE[] = { 0x00, 0x00, 0x00, 0x00 };␊ |
112 | ␊ |
113 | static 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 | ␊ |
139 | char *get_gma_model(uint32_t id) {␊ |
140 | ␉int i = 0;␊ |
141 | ␉␊ |
142 | ␉for (i = 0; i < (sizeof(KnownGPUS) / sizeof(KnownGPUS[0])); i++)␊ |
143 | ␉{␊ |
144 | ␉␉if (KnownGPUS[i].device == id)␊ |
145 | ␉␉␉return KnownGPUS[i].name;␊ |
146 | ␉}␊ |
147 | ␉return KnownGPUS[0].name;␊ |
148 | }␊ |
149 | ␊ |
150 | bool setup_gma_devprop(pci_dt_t *gma_dev)␊ |
151 | {␊ |
152 | ␉char␉␉␉␉␉*devicepath;␊ |
153 | ␉volatile uint8_t␉␉*regs;␊ |
154 | ␉uint32_t␉␉␉␉bar[7];␊ |
155 | ␉char␉␉␉␉␉*model;␊ |
156 | ␉uint8_t BuiltIn =␉␉0x00;␊ |
157 | ␉uint8_t ClassFix[4] =␉{ 0x00, 0x00, 0x03, 0x00 };␊ |
158 | ␉unsigned int␉␉␉device_id;␉␊ |
159 | ␉␊ |
160 | ␉devicepath = get_pci_dev_path(gma_dev);␊ |
161 | ␉␊ |
162 | ␉bar[0] = pci_config_read32(gma_dev->dev.addr, 0x10);␊ |
163 | ␉regs = (uint8_t *) (bar[0] & ~0x0f);␊ |
164 | ␉␊ |
165 | ␉model = get_gma_model((gma_dev->vendor_id << 16) | gma_dev->device_id);␊ |
166 | ␉device_id = gma_dev->device_id;␊ |
167 | ␉␊ |
168 | ␉verbose("Intel %s [%04x:%04x] :: %s\n",␊ |
169 | ␉␉␉model, gma_dev->vendor_id, gma_dev->device_id, devicepath);␊ |
170 | ␉␊ |
171 | ␉if (!string)␊ |
172 | ␉␉string = devprop_create_string();␊ |
173 | ␉␊ |
174 | ␉struct DevPropDevice *device = malloc(sizeof(struct DevPropDevice));␊ |
175 | ␉device = devprop_add_device(string, devicepath);␊ |
176 | ␉␊ |
177 | ␉if (!device)␊ |
178 | ␉{␊ |
179 | ␉␉printf("Failed initializing dev-prop string dev-entry.\n");␊ |
180 | ␉␉pause();␊ |
181 | ␉␉return false;␊ |
182 | ␉}␊ |
183 | ␉␊ |
184 | ␉devprop_add_value(device, "model", (uint8_t*)model, (strlen(model) + 1));␊ |
185 | ␉devprop_add_value(device, "device_type", (uint8_t*)"display", 8);␉␊ |
186 | ␉␊ |
187 | ␉if ((model == (char *)&"Mobile GMA950")␊ |
188 | ␉␉|| (model == (char *)&"Mobile GMA3150"))␊ |
189 | ␉{␊ |
190 | ␉␉devprop_add_value(device, "AAPL,HasPanel", reg_TRUE, 4);␊ |
191 | ␉␉devprop_add_value(device, "built-in", &BuiltIn, 1);␊ |
192 | ␉␉devprop_add_value(device, "class-code", ClassFix, 4);␊ |
193 | ␉}␊ |
194 | ␉else if ((model == (char *)&"Desktop GMA950")␊ |
195 | ␉␉␉|| (model == (char *)&"Desktop GMA3150"))␊ |
196 | ␉{␊ |
197 | ␉␉BuiltIn = 0x01;␊ |
198 | ␉␉devprop_add_value(device, "built-in", &BuiltIn, 1);␊ |
199 | ␉␉devprop_add_value(device, "class-code", ClassFix, 4);␊ |
200 | ␉}␊ |
201 | ␉else if (model == (char *)&"GMAX3100")␊ |
202 | ␉{␊ |
203 | ␉␉devprop_add_value(device, "AAPL,HasPanel",␉␉␉␉␉GMAX3100_vals[0], 4);␊ |
204 | ␉␉devprop_add_value(device, "AAPL,SelfRefreshSupported",␉␉GMAX3100_vals[1], 4);␊ |
205 | ␉␉devprop_add_value(device, "AAPL,aux-power-connected",␉␉GMAX3100_vals[2], 4);␊ |
206 | ␉␉devprop_add_value(device, "AAPL,backlight-control",␉␉␉GMAX3100_vals[3], 4);␊ |
207 | ␉␉devprop_add_value(device, "AAPL00,blackscreen-preferences", GMAX3100_vals[4], 4);␊ |
208 | ␉␉devprop_add_value(device, "AAPL01,BacklightIntensity",␉␉GMAX3100_vals[5], 4);␊ |
209 | ␉␉devprop_add_value(device, "AAPL01,blackscreen-preferences", GMAX3100_vals[6], 4);␊ |
210 | ␉␉devprop_add_value(device, "AAPL01,DataJustify",␉␉␉␉GMAX3100_vals[7], 4);␊ |
211 | ␉␉devprop_add_value(device, "AAPL01,Depth",␉␉␉␉␉GMAX3100_vals[8], 4);␊ |
212 | ␉␉devprop_add_value(device, "AAPL01,Dither",␉␉␉␉␉GMAX3100_vals[9], 4);␊ |
213 | ␉␉devprop_add_value(device, "AAPL01,DualLink",␉␉␉␉GMAX3100_vals[10], 4);␊ |
214 | ␉␉devprop_add_value(device, "AAPL01,Height",␉␉␉␉␉GMAX3100_vals[11], 4);␊ |
215 | ␉␉devprop_add_value(device, "AAPL01,Interlace",␉␉␉␉GMAX3100_vals[12], 4);␊ |
216 | ␉␉devprop_add_value(device, "AAPL01,Inverter",␉␉␉␉GMAX3100_vals[13], 4);␊ |
217 | ␉␉devprop_add_value(device, "AAPL01,InverterCurrent",␉␉␉GMAX3100_vals[14], 4);␊ |
218 | ␉␉devprop_add_value(device, "AAPL01,InverterCurrency",␉␉GMAX3100_vals[15], 4);␊ |
219 | ␉␉devprop_add_value(device, "AAPL01,LinkFormat",␉␉␉␉GMAX3100_vals[16], 4);␊ |
220 | ␉␉devprop_add_value(device, "AAPL01,LinkType",␉␉␉␉GMAX3100_vals[17], 4);␊ |
221 | ␉␉devprop_add_value(device, "AAPL01,Pipe",␉␉␉␉␉GMAX3100_vals[18], 4);␊ |
222 | ␉␉devprop_add_value(device, "AAPL01,PixelFormat",␉␉␉␉GMAX3100_vals[19], 4);␊ |
223 | ␉␉devprop_add_value(device, "AAPL01,Refresh",␉␉␉␉␉GMAX3100_vals[20], 4);␊ |
224 | ␉␉devprop_add_value(device, "AAPL01,Stretch",␉␉␉␉␉GMAX3100_vals[21], 4);␊ |
225 | ␉␉devprop_add_value(device, "class-code",␉␉␉␉␉␉ClassFix, 4);␊ |
226 | ␉}␊ |
227 | ␉else if (model == (char *)&"Intel HD Graphics 2000 Mobile")␊ |
228 | ␉{␊ |
229 | ␉␉devprop_add_value(device, "class-code", ClassFix, 4);␊ |
230 | ␉␉devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10); ␊ |
231 | ␉␉devprop_add_value(device, "AAPL00,PixelFormat", HD2000_vals[0], 4);␊ |
232 | ␉␉devprop_add_value(device, "AAPL00,T1", HD2000_vals[1], 4);␊ |
233 | ␉␉devprop_add_value(device, "AAPL00,T2", HD2000_vals[2], 4);␊ |
234 | ␉␉devprop_add_value(device, "AAPL00,T3", HD2000_vals[3], 4);␊ |
235 | ␉␉devprop_add_value(device, "AAPL00,T4", HD2000_vals[4], 4);␊ |
236 | ␉␉devprop_add_value(device, "AAPL00,T5", HD2000_vals[5], 4);␊ |
237 | ␉␉devprop_add_value(device, "AAPL00,T6", HD2000_vals[6], 4);␊ |
238 | ␉␉devprop_add_value(device, "AAPL00,T7", HD2000_vals[7], 4);␊ |
239 | ␉␉devprop_add_value(device, "AAPL00,LinkType", HD2000_vals[8], 4);␊ |
240 | ␉␉devprop_add_value(device, "AAPL00,LinkFormat", HD2000_vals[9], 4);␊ |
241 | ␉␉devprop_add_value(device, "AAPL00,DualLink", HD2000_vals[10], 4);␊ |
242 | ␉␉devprop_add_value(device, "AAPL00,Dither", HD2000_vals[11], 4);␊ |
243 | ␉␉devprop_add_value(device, "AAPL00,DataJustify", HD3000_vals[12], 4);␊ |
244 | ␉␉devprop_add_value(device, "graphic-options", HD2000_vals[13], 4);␊ |
245 | ␉␉devprop_add_value(device, "AAPL,tbl-info", HD2000_tbl_info, 18);␊ |
246 | ␉␉devprop_add_value(device, "AAPL,os-info", HD2000_os_info, 20);␊ |
247 | ␉}␊ |
248 | ␉else if (model == (char *)&"Intel HD Graphics 3000 Mobile")␊ |
249 | ␉{␊ |
250 | ␉␉devprop_add_value(device, "class-code", ClassFix, 4);␊ |
251 | ␉␉devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10); ␊ |
252 | ␉␉devprop_add_value(device, "AAPL00,PixelFormat", HD3000_vals[0], 4);␊ |
253 | ␉␉devprop_add_value(device, "AAPL00,T1", HD3000_vals[1], 4);␊ |
254 | ␉␉devprop_add_value(device, "AAPL00,T2", HD3000_vals[2], 4);␊ |
255 | ␉␉devprop_add_value(device, "AAPL00,T3", HD3000_vals[3], 4);␊ |
256 | ␉␉devprop_add_value(device, "AAPL00,T4", HD3000_vals[4], 4);␊ |
257 | ␉␉devprop_add_value(device, "AAPL00,T5", HD3000_vals[5], 4);␊ |
258 | ␉␉devprop_add_value(device, "AAPL00,T6", HD3000_vals[6], 4);␊ |
259 | ␉␉devprop_add_value(device, "AAPL00,T7", HD3000_vals[7], 4);␊ |
260 | ␉␉devprop_add_value(device, "AAPL00,LinkType", HD3000_vals[8], 4);␊ |
261 | ␉␉devprop_add_value(device, "AAPL00,LinkFormat", HD3000_vals[9], 4);␊ |
262 | ␉␉devprop_add_value(device, "AAPL00,DualLink", HD3000_vals[10], 4);␊ |
263 | ␉␉devprop_add_value(device, "AAPL00,Dither", HD3000_vals[11], 4);␊ |
264 | ␉␉devprop_add_value(device, "AAPL00,DataJustify", HD3000_vals[12], 4);␊ |
265 | ␉␉devprop_add_value(device, "graphic-options", HD3000_vals[13], 4);␊ |
266 | ␉␉devprop_add_value(device, "AAPL,tbl-info", HD3000_tbl_info, 18);␊ |
267 | ␉␉devprop_add_value(device, "AAPL,os-info", HD3000_os_info, 20);␊ |
268 | ␉}␊ |
269 | ␉else if (model == (char *)&"Intel HD Graphics 2000")␊ |
270 | ␉{␊ |
271 | ␉␉devprop_add_value(device, "built-in", &BuiltIn, 1);␊ |
272 | ␉␉devprop_add_value(device, "class-code", ClassFix, 4);␊ |
273 | ␉␉devprop_add_value(device, "device-id", (uint8_t*)&device_id, sizeof(device_id));␊ |
274 | ␉␉devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10); ␊ |
275 | ␉␉devprop_add_value(device, "AAPL,tbl-info", HD2000_tbl_info, 18);␊ |
276 | ␉␉devprop_add_value(device, "AAPL,os-info", HD2000_os_info, 20);␊ |
277 | ␉}␊ |
278 | ␉else if (model == (char *)&"Intel HD Graphics 3000")␊ |
279 | ␉{␊ |
280 | ␉␉devprop_add_value(device, "built-in", &BuiltIn, 1);␊ |
281 | ␉␉devprop_add_value(device, "class-code", ClassFix, 4);␊ |
282 | ␉␉device_id = 0x00000126;␉␉␉␉␉␉␉␉␉␉␉// Inject a valid mobile GPU device id instead of patching kexts␊ |
283 | ␉␉devprop_add_value(device, "device-id", (uint8_t*)&device_id, sizeof(device_id));␊ |
284 | ␉␉devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10); ␊ |
285 | ␉␉devprop_add_value(device, "AAPL,tbl-info", HD3000_tbl_info, 18);␊ |
286 | ␉␉devprop_add_value(device, "AAPL,os-info", HD3000_os_info, 20);␊ |
287 | ␉}␊ |
288 | ␉␊ |
289 | ␉stringdata = malloc(sizeof(uint8_t) * string->length);␊ |
290 | ␉if (!stringdata)␊ |
291 | ␉{␊ |
292 | ␉␉printf("No stringdata.\n");␊ |
293 | ␉␉pause();␊ |
294 | ␉␉return false;␊ |
295 | ␉}␊ |
296 | ␉␊ |
297 | ␉memcpy(stringdata, (uint8_t*)devprop_generate_string(string), string->length);␊ |
298 | ␉stringlength = string->length;␊ |
299 | ␉␊ |
300 | ␉return true;␊ |
301 | }␊ |
302 |