PageRenderTime 50ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/edk2/Clover/rEFIt_UEFI/Platform/gma.c

https://gitlab.com/envieidoc/Clover
C | 371 lines | 294 code | 25 blank | 52 comment | 27 complexity | c48c5cfcbe9d73a6808ce9fa9b58752d MD5 | raw file
  1. /*
  2. Original patch by Nawcom
  3. http://forum.voodooprojects.org/index.php/topic,1029.0.html
  4. */
  5. #include "Platform.h"
  6. #include "gma.h"
  7. #ifndef DEBUG_GMA
  8. #ifndef DEBUG_ALL
  9. #define DEBUG_GMA 1
  10. #else
  11. #define DEBUG_GMA DEBUG_ALL
  12. #endif
  13. #endif
  14. #if DEBUG_GMA == 0
  15. #define DBG(...)
  16. #else
  17. #define DBG(...) DebugLog(DEBUG_GMA, __VA_ARGS__)
  18. #endif
  19. extern CHAR8* gDeviceProperties;
  20. //Slice - corrected all values, still not sure
  21. UINT8 GMAX3100_vals[28][4] = {
  22. { 0x01, 0x00, 0x00, 0x00 }, //0 "AAPL,HasPanel"
  23. { 0x01, 0x00, 0x00, 0x00 }, //1 "AAPL,SelfRefreshSupported"
  24. { 0x01, 0x00, 0x00, 0x00 }, //2 "AAPL,aux-power-connected"
  25. { 0x01, 0x00, 0x00, 0x08 }, //3 "AAPL,backlight-control"
  26. { 0x00, 0x00, 0x00, 0x00 }, //4 "AAPL00,blackscreen-preferences"
  27. { 0x56, 0x00, 0x00, 0x08 }, //5 "AAPL01,BacklightIntensity"
  28. { 0x00, 0x00, 0x00, 0x00 }, //6 "AAPL01,blackscreen-preferences"
  29. { 0x01, 0x00, 0x00, 0x00 }, //7 "AAPL01,DataJustify"
  30. { 0x20, 0x00, 0x00, 0x00 }, //8 "AAPL01,Depth"
  31. { 0x01, 0x00, 0x00, 0x00 }, //9 "AAPL01,Dither"
  32. { 0x20, 0x03, 0x00, 0x00 }, //10 "AAPL01,Height"
  33. { 0x00, 0x00, 0x00, 0x00 }, //11 "AAPL01,Interlace"
  34. { 0x00, 0x00, 0x00, 0x00 }, //12 "AAPL01,Inverter"
  35. { 0x08, 0x52, 0x00, 0x00 }, //13 "AAPL01,InverterCurrent"
  36. { 0x00, 0x00, 0x00, 0x00 }, //14 "AAPL01,LinkFormat"
  37. { 0x00, 0x00, 0x00, 0x00 }, //15 "AAPL01,LinkType"
  38. { 0x01, 0x00, 0x00, 0x00 }, //16 "AAPL01,Pipe"
  39. { 0x01, 0x00, 0x00, 0x00 }, //17 "AAPL01,PixelFormat"
  40. { 0x01, 0x00, 0x00, 0x00 }, //18 "AAPL01,Refresh"
  41. { 0x3B, 0x00, 0x00, 0x00 }, //19 "AAPL01,Stretch"
  42. { 0xc8, 0x95, 0x00, 0x00 }, //20 "AAPL01,InverterFrequency"
  43. { 0x6B, 0x10, 0x00, 0x00 }, //21 "subsystem-vendor-id"
  44. { 0xA2, 0x00, 0x00, 0x00 }, //22 "subsystem-id"
  45. { 0x05, 0x00, 0x62, 0x01 }, //23 "AAPL,ig-platform-id" HD4000 //STLVNUB
  46. { 0x06, 0x00, 0x62, 0x01 }, //24 "AAPL,ig-platform-id" HD4000 iMac
  47. { 0x09, 0x00, 0x66, 0x01 }, //25 "AAPL,ig-platform-id" HD4000
  48. { 0x03, 0x00, 0x22, 0x0d }, //26 "AAPL,ig-platform-id" HD4600 //bcc9 http://www.insanelymac.com/forum/topic/290783-intel-hd-graphics-4600-haswell-working-displayport/
  49. { 0x00, 0x00, 0x62, 0x01 } //27 - automatic solution
  50. };
  51. // 5 - 32Mb 6 - 48Mb 9 - 64Mb, 0 - 96Mb
  52. UINT8 FakeID_126[] = {0x26, 0x01, 0x00, 0x00 };
  53. extern CHAR8 ClassFix[];
  54. UINT8 reg_TRUE[] = { 0x01, 0x00, 0x00, 0x00 };
  55. UINT8 reg_FALSE[] = { 0x00, 0x00, 0x00, 0x00 };
  56. UINT8 OsInfo[] = {0x30, 0x49, 0x01, 0x11, 0x01, 0x10, 0x08, 0x00, 0x00,
  57. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF};
  58. static struct gma_gpu_t KnownGPUS[] = {
  59. { 0x0000, "Intel Unknown" },
  60. { 0x2582, "GMA 915" },
  61. { 0x2592, "GMA 915" },
  62. { 0x27A2, "GMA 950" },
  63. { 0x27AE, "GMA 950" },
  64. // { 0x27A6, "Mobile GMA950" }, //not a GPU
  65. { 0xA011, "Mobile GMA3150" },
  66. { 0xA012, "Mobile GMA3150" },
  67. { 0x2772, "Desktop GMA950" },
  68. { 0x29C2, "Desktop GMA3100" },
  69. // { 0x2776, "Desktop GMA950" }, //not a GPU
  70. // { 0xA001, "Desktop GMA3150" },
  71. { 0xA001, "Mobile GMA3150" },
  72. { 0xA002, "Desktop GMA3150" },
  73. { 0x2A02, "GMAX3100" },
  74. // { 0x2A03, "GMAX3100" },//not a GPU
  75. { 0x2A12, "GMAX3100" },
  76. // { 0x2A13, "GMAX3100" },
  77. { 0x2A42, "GMAX3100" },
  78. // { 0x2A43, "GMAX3100" },
  79. { 0x0042, "Intel HD Graphics" },
  80. { 0x0046, "Intel HD Graphics" },
  81. { 0x0102, "Intel HD Graphics 2000" },
  82. { 0x0106, "Intel HD Graphics 3000" },
  83. { 0x010A, "Intel HD Graphics P3000" }, //Xeon E3 1200 v1, needs FakeID
  84. { 0x0112, "Intel HD Graphics 2000" },
  85. { 0x0116, "Intel HD Graphics 3000" },
  86. { 0x0122, "Intel HD Graphics 3000" },
  87. { 0x0126, "Intel HD Graphics 3000" },
  88. { 0x0162, "Intel HD Graphics 4000" }, //Desktop
  89. { 0x0166, "Intel HD Graphics 4000" }, // MacBookPro10,1 have this string as model name whatever chameleon team may say
  90. { 0x0152, "Intel HD Graphics 2500" }, //iMac
  91. { 0x0156, "Intel HD Graphics 4000" }, //MacBook
  92. { 0x016A, "Intel HD Graphics P4000" }, //Xeon E3-1245
  93. { 0x0412, "Intel HD Graphics 4600" }, //Haswell
  94. { 0x0416, "Intel HD Graphics 4600" }, //Haswell
  95. { 0x041E, "Intel HD Graphics 4400" }, //Haswell
  96. { 0x0A0E, "Intel HD Graphics 4400" }, //Haswell
  97. { 0x0A16, "Intel HD Graphics 4400" }, //Haswell
  98. { 0x0A1E, "Intel HD Graphics 4200" }, // Haswell *
  99. { 0x0A26, "Intel HD Graphics 5000" }, //Haswell *
  100. { 0x0A2E, "Intel Iris" }, // Haswell Intel Iris 5100 (i7-4558U, i7-4578U) *
  101. { 0x0D22, "Intel Iris Pro" }, //Haswell *
  102. { 0x0D26, "Intel Iris Pro" }, //Haswell i7 4860HQ *
  103. { 0x1602, "Intel HD Graphics" }, // *
  104. { 0x1606, "Intel HD Graphics" }, // *
  105. { 0x161E, "Intel HD Graphics 5300" }, // *
  106. { 0x1616, "Intel HD Graphics 5500" }, // *
  107. { 0x1612, "Intel HD Graphics 5600" }, // * Broadwell i7-5700HQ
  108. { 0x1626, "Intel HD Graphics 6000" }, // *
  109. { 0x162B, "Intel Iris" }, // *
  110. { 0x1622, "Intel Iris Pro" }, // *
  111. { 0x1912, "Intel HD Graphics 530" }, // *
  112. { 0x1916, "Intel HD Graphics 520" }, // * or Intel® Iris™ Graphics 540
  113. { 0x191B, "Intel HD Graphics 530" }, // *
  114. { 0x1926, "Intel Iris Graphics 550" }, // *
  115. // 0x0e08 - Xeon E5-1620
  116. };
  117. CHAR8 *get_gma_model(UINT16 id)
  118. {
  119. INT32 i;
  120. for (i = 0; i < (sizeof(KnownGPUS) / sizeof(KnownGPUS[0])); i++)
  121. {
  122. if (KnownGPUS[i].device == id)
  123. return KnownGPUS[i].name;
  124. }
  125. return KnownGPUS[0].name;
  126. }
  127. BOOLEAN setup_gma_devprop(pci_dt_t *gma_dev)
  128. {
  129. CHAR8 *devicepath;
  130. DevPropDevice *device;
  131. // UINT8 *regs;
  132. UINT32 DualLink;
  133. // UINT32 bar[7];
  134. CHAR8 *model;
  135. UINT8 BuiltIn = 0x00;
  136. UINTN j;
  137. INT32 i;
  138. BOOLEAN Injected = FALSE;
  139. // UINT32 SnbId = 0;
  140. // MACHINE_TYPES MacModel;
  141. // UINT8 IG_ID[4] = { 0x00, 0x00, 0x62, 0x01 };
  142. devicepath = get_pci_dev_path(gma_dev);
  143. model = get_gma_model(gma_dev->device_id);
  144. for (j = 0; j < NGFX; j++) {
  145. if ((gGraphics[j].Vendor == Intel) &&
  146. (gGraphics[j].DeviceID == gma_dev->device_id)) {
  147. model = gGraphics[j].Model;
  148. break;
  149. }
  150. }
  151. // DBG("Finally model=%a\n", model);
  152. DBG("Intel %a [%04x:%04x] :: %a\n",
  153. model, gma_dev->vendor_id, gma_dev->device_id, devicepath);
  154. if (!string)
  155. string = devprop_create_string();
  156. //device = devprop_add_device(string, devicepath); //AllocatePool inside
  157. device = devprop_add_device_pci(string, gma_dev);
  158. if (!device) {
  159. DBG("Failed initializing dev-prop string dev-entry.\n");
  160. //pause();
  161. return FALSE;
  162. }
  163. if (gSettings.NrAddProperties != 0xFFFE) {
  164. for (i = 0; i < gSettings.NrAddProperties; i++) {
  165. if (gSettings.AddProperties[i].Device != DEV_INTEL) {
  166. continue;
  167. }
  168. Injected = TRUE;
  169. devprop_add_value(device,
  170. gSettings.AddProperties[i].Key,
  171. (UINT8*)gSettings.AddProperties[i].Value,
  172. gSettings.AddProperties[i].ValueLen);
  173. }
  174. }
  175. if (Injected) {
  176. DBG("custom IntelGFX properties injected, continue\n");
  177. }
  178. if (gSettings.FakeIntel) {
  179. UINT32 FakeID = gSettings.FakeIntel >> 16;
  180. devprop_add_value(device, "device-id", (UINT8*)&FakeID, 4);
  181. FakeID = gSettings.FakeIntel & 0xFFFF;
  182. devprop_add_value(device, "vendor-id", (UINT8*)&FakeID, 4);
  183. }
  184. if (gSettings.NoDefaultProperties) {
  185. DBG("Intel: no default properties\n");
  186. return TRUE;
  187. }
  188. DualLink = gSettings.DualLink;
  189. if (gSettings.InjectEDID) {
  190. devprop_add_value(device, "AAPL00,override-no-connect", gSettings.CustomEDID, 128);
  191. }
  192. devprop_add_value(device, "model", (UINT8*)model, (UINT32)AsciiStrLen(model));
  193. devprop_add_value(device, "device_type", (UINT8*)"display", 7);
  194. devprop_add_value(device, "subsystem-vendor-id", GMAX3100_vals[21], 4);
  195. if (gSettings.UseIntelHDMI) {
  196. devprop_add_value(device, "hda-gfx", (UINT8*)"onboard-1", 10);
  197. }
  198. // MacModel = GetModelFromString(gSettings.ProductName);
  199. switch (gma_dev->device_id) {
  200. case 0x0102:
  201. devprop_add_value(device, "class-code", (UINT8*)ClassFix, 4);
  202. case 0x0106:
  203. case 0x0112:
  204. case 0x0116:
  205. case 0x0122:
  206. case 0x0126:
  207. /* switch (MacModel) {
  208. case MacBookPro81:
  209. SnbId = 0x00000100;
  210. break;
  211. case MacBookPro83:
  212. SnbId = 0x00000200;
  213. break;
  214. case MacMini51:
  215. SnbId = 0x10000300;
  216. break;
  217. case Macmini52:
  218. SnbId = 0x20000300;
  219. break;
  220. case MacBookAir41:
  221. SnbId = 0x00000400;
  222. break;
  223. default:
  224. break;
  225. }
  226. if (SnbId != 0) {
  227. devprop_add_value(device, "AAPL,snb-platform-id", (UINT8*)&SnbId, 4);
  228. }
  229. */
  230. case 0x0152:
  231. case 0x0156:
  232. case 0x0162:
  233. case 0x0166:
  234. case 0x016a:
  235. case 0x0412:
  236. case 0x0416:
  237. case 0x041e:
  238. case 0x0a0e:
  239. case 0x0a16:
  240. case 0x0a1e:
  241. case 0x0a26:
  242. case 0x0a2e:
  243. case 0x0d22:
  244. case 0x0d26:
  245. case 0x1602:
  246. case 0x1606:
  247. case 0x161E:
  248. case 0x1616:
  249. case 0x1612:
  250. case 0x1626:
  251. case 0x162b:
  252. case 0x1622:
  253. case 0x1912:
  254. case 0x1916:
  255. case 0x191b:
  256. case 0x1926:
  257. if (!gSettings.IgPlatform) {
  258. switch (gma_dev->device_id) {
  259. case 0x162:
  260. case 0x16a:
  261. devprop_add_value(device, "AAPL,ig-platform-id", GMAX3100_vals[23], 4);
  262. devprop_add_value(device, "class-code", (UINT8*)ClassFix, 4);
  263. break;
  264. case 0x152:
  265. devprop_add_value(device, "AAPL,ig-platform-id", GMAX3100_vals[24], 4);
  266. break;
  267. case 0x166:
  268. case 0x156:
  269. devprop_add_value(device, "AAPL,ig-platform-id", GMAX3100_vals[25], 4);
  270. break;
  271. case 0x0102:
  272. case 0x0106:
  273. case 0x0112:
  274. case 0x0116:
  275. case 0x0122:
  276. case 0x0126:
  277. break;
  278. default:
  279. devprop_add_value(device, "AAPL,ig-platform-id", GMAX3100_vals[26], 4);
  280. break;
  281. }
  282. } else {
  283. devprop_add_value(device, "AAPL,ig-platform-id", (UINT8*)&gSettings.IgPlatform, 4);
  284. }
  285. case 0xA011:
  286. case 0xA012:
  287. if (DualLink != 0) {
  288. devprop_add_value(device, "AAPL00,DualLink", (UINT8*)&DualLink, 1);
  289. }
  290. case 0x2582:
  291. case 0x2592:
  292. case 0x27A2:
  293. case 0x27AE:
  294. devprop_add_value(device, "AAPL,HasPanel", reg_TRUE, 4);
  295. devprop_add_value(device, "built-in", &BuiltIn, 1);
  296. break;
  297. case 0x2772:
  298. case 0x29C2:
  299. case 0x0042:
  300. case 0x0046:
  301. case 0xA002:
  302. devprop_add_value(device, "built-in", &BuiltIn, 1);
  303. devprop_add_value(device, "AAPL00,DualLink", (UINT8*)&DualLink, 1);
  304. devprop_add_value(device, "AAPL,os-info", (UINT8*)&OsInfo, sizeof(OsInfo));
  305. break;
  306. case 0x2A02:
  307. case 0x2A12:
  308. case 0x2A42:
  309. devprop_add_value(device, "AAPL,HasPanel", GMAX3100_vals[0], 4);
  310. devprop_add_value(device, "AAPL,SelfRefreshSupported", GMAX3100_vals[1], 4);
  311. devprop_add_value(device, "AAPL,aux-power-connected", GMAX3100_vals[2], 4);
  312. devprop_add_value(device, "AAPL,backlight-control", GMAX3100_vals[3], 4);
  313. devprop_add_value(device, "AAPL00,blackscreen-preferences", GMAX3100_vals[4], 4);
  314. devprop_add_value(device, "AAPL01,BacklightIntensity", GMAX3100_vals[5], 4);
  315. devprop_add_value(device, "AAPL01,blackscreen-preferences", GMAX3100_vals[6], 4);
  316. devprop_add_value(device, "AAPL01,DataJustify", GMAX3100_vals[7], 4);
  317. // devprop_add_value(device, "AAPL01,Depth", GMAX3100_vals[8], 4);
  318. devprop_add_value(device, "AAPL01,Dither", GMAX3100_vals[9], 4);
  319. devprop_add_value(device, "AAPL01,DualLink", (UINT8 *)&DualLink, 1);
  320. // devprop_add_value(device, "AAPL01,Height", GMAX3100_vals[10], 4);
  321. devprop_add_value(device, "AAPL01,Interlace", GMAX3100_vals[11], 4);
  322. devprop_add_value(device, "AAPL01,Inverter", GMAX3100_vals[12], 4);
  323. devprop_add_value(device, "AAPL01,InverterCurrent", GMAX3100_vals[13], 4);
  324. // devprop_add_value(device, "AAPL01,InverterCurrency", GMAX3100_vals[15], 4);
  325. devprop_add_value(device, "AAPL01,LinkFormat", GMAX3100_vals[14], 4);
  326. devprop_add_value(device, "AAPL01,LinkType", GMAX3100_vals[15], 4);
  327. devprop_add_value(device, "AAPL01,Pipe", GMAX3100_vals[16], 4);
  328. // devprop_add_value(device, "AAPL01,PixelFormat", GMAX3100_vals[17], 4);
  329. devprop_add_value(device, "AAPL01,Refresh", GMAX3100_vals[18], 4);
  330. devprop_add_value(device, "AAPL01,Stretch", GMAX3100_vals[19], 4);
  331. devprop_add_value(device, "AAPL01,InverterFrequency", GMAX3100_vals[20], 4);
  332. // devprop_add_value(device, "class-code", (UINT8*)ClassFix, 4);
  333. // devprop_add_value(device, "subsystem-vendor-id", GMAX3100_vals[21], 4);
  334. devprop_add_value(device, "subsystem-id", GMAX3100_vals[22], 4);
  335. devprop_add_value(device, "built-in", &BuiltIn, 1);
  336. break;
  337. default:
  338. DBG("Intel card id=%x unsupported, please report to projectosx\n", gma_dev->device_id);
  339. return FALSE;
  340. }
  341. #if DEBUG_GMA == 2
  342. gBS->Stall(5000000);
  343. #endif
  344. return TRUE;
  345. }