intel-agp.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090
  1. /*
  2. * Intel AGPGART routines.
  3. */
  4. #include <linux/module.h>
  5. #include <linux/pci.h>
  6. #include <linux/slab.h>
  7. #include <linux/init.h>
  8. #include <linux/kernel.h>
  9. #include <linux/pagemap.h>
  10. #include <linux/agp_backend.h>
  11. #include <asm/smp.h>
  12. #include "agp.h"
  13. #include "intel-agp.h"
  14. #include <linux/intel-gtt.h>
  15. #include "intel-gtt.c"
  16. int intel_agp_enabled;
  17. EXPORT_SYMBOL(intel_agp_enabled);
  18. static int intel_fetch_size(void)
  19. {
  20. int i;
  21. u16 temp;
  22. struct aper_size_info_16 *values;
  23. pci_read_config_word(agp_bridge->dev, INTEL_APSIZE, &temp);
  24. values = A_SIZE_16(agp_bridge->driver->aperture_sizes);
  25. for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) {
  26. if (temp == values[i].size_value) {
  27. agp_bridge->previous_size = agp_bridge->current_size = (void *) (values + i);
  28. agp_bridge->aperture_size_idx = i;
  29. return values[i].size;
  30. }
  31. }
  32. return 0;
  33. }
  34. static int __intel_8xx_fetch_size(u8 temp)
  35. {
  36. int i;
  37. struct aper_size_info_8 *values;
  38. values = A_SIZE_8(agp_bridge->driver->aperture_sizes);
  39. for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) {
  40. if (temp == values[i].size_value) {
  41. agp_bridge->previous_size =
  42. agp_bridge->current_size = (void *) (values + i);
  43. agp_bridge->aperture_size_idx = i;
  44. return values[i].size;
  45. }
  46. }
  47. return 0;
  48. }
  49. static int intel_8xx_fetch_size(void)
  50. {
  51. u8 temp;
  52. pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp);
  53. return __intel_8xx_fetch_size(temp);
  54. }
  55. static int intel_815_fetch_size(void)
  56. {
  57. u8 temp;
  58. /* Intel 815 chipsets have a _weird_ APSIZE register with only
  59. * one non-reserved bit, so mask the others out ... */
  60. pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp);
  61. temp &= (1 << 3);
  62. return __intel_8xx_fetch_size(temp);
  63. }
  64. static void intel_tlbflush(struct agp_memory *mem)
  65. {
  66. pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2200);
  67. pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280);
  68. }
  69. static void intel_8xx_tlbflush(struct agp_memory *mem)
  70. {
  71. u32 temp;
  72. pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp);
  73. pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp & ~(1 << 7));
  74. pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp);
  75. pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp | (1 << 7));
  76. }
  77. static void intel_cleanup(void)
  78. {
  79. u16 temp;
  80. struct aper_size_info_16 *previous_size;
  81. previous_size = A_SIZE_16(agp_bridge->previous_size);
  82. pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp);
  83. pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9));
  84. pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value);
  85. }
  86. static void intel_8xx_cleanup(void)
  87. {
  88. u16 temp;
  89. struct aper_size_info_8 *previous_size;
  90. previous_size = A_SIZE_8(agp_bridge->previous_size);
  91. pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp);
  92. pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9));
  93. pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value);
  94. }
  95. static int intel_configure(void)
  96. {
  97. u32 temp;
  98. u16 temp2;
  99. struct aper_size_info_16 *current_size;
  100. current_size = A_SIZE_16(agp_bridge->current_size);
  101. /* aperture size */
  102. pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
  103. /* address to map to */
  104. pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
  105. agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  106. /* attbase - aperture base */
  107. pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
  108. /* agpctrl */
  109. pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280);
  110. /* paccfg/nbxcfg */
  111. pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2);
  112. pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG,
  113. (temp2 & ~(1 << 10)) | (1 << 9));
  114. /* clear any possible error conditions */
  115. pci_write_config_byte(agp_bridge->dev, INTEL_ERRSTS + 1, 7);
  116. return 0;
  117. }
  118. static int intel_815_configure(void)
  119. {
  120. u32 temp, addr;
  121. u8 temp2;
  122. struct aper_size_info_8 *current_size;
  123. /* attbase - aperture base */
  124. /* the Intel 815 chipset spec. says that bits 29-31 in the
  125. * ATTBASE register are reserved -> try not to write them */
  126. if (agp_bridge->gatt_bus_addr & INTEL_815_ATTBASE_MASK) {
  127. dev_emerg(&agp_bridge->dev->dev, "gatt bus addr too high");
  128. return -EINVAL;
  129. }
  130. current_size = A_SIZE_8(agp_bridge->current_size);
  131. /* aperture size */
  132. pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE,
  133. current_size->size_value);
  134. /* address to map to */
  135. pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
  136. agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  137. pci_read_config_dword(agp_bridge->dev, INTEL_ATTBASE, &addr);
  138. addr &= INTEL_815_ATTBASE_MASK;
  139. addr |= agp_bridge->gatt_bus_addr;
  140. pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, addr);
  141. /* agpctrl */
  142. pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
  143. /* apcont */
  144. pci_read_config_byte(agp_bridge->dev, INTEL_815_APCONT, &temp2);
  145. pci_write_config_byte(agp_bridge->dev, INTEL_815_APCONT, temp2 | (1 << 1));
  146. /* clear any possible error conditions */
  147. /* Oddness : this chipset seems to have no ERRSTS register ! */
  148. return 0;
  149. }
  150. static void intel_820_tlbflush(struct agp_memory *mem)
  151. {
  152. return;
  153. }
  154. static void intel_820_cleanup(void)
  155. {
  156. u8 temp;
  157. struct aper_size_info_8 *previous_size;
  158. previous_size = A_SIZE_8(agp_bridge->previous_size);
  159. pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp);
  160. pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR,
  161. temp & ~(1 << 1));
  162. pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE,
  163. previous_size->size_value);
  164. }
  165. static int intel_820_configure(void)
  166. {
  167. u32 temp;
  168. u8 temp2;
  169. struct aper_size_info_8 *current_size;
  170. current_size = A_SIZE_8(agp_bridge->current_size);
  171. /* aperture size */
  172. pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
  173. /* address to map to */
  174. pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
  175. agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  176. /* attbase - aperture base */
  177. pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
  178. /* agpctrl */
  179. pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
  180. /* global enable aperture access */
  181. /* This flag is not accessed through MCHCFG register as in */
  182. /* i850 chipset. */
  183. pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp2);
  184. pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR, temp2 | (1 << 1));
  185. /* clear any possible AGP-related error conditions */
  186. pci_write_config_word(agp_bridge->dev, INTEL_I820_ERRSTS, 0x001c);
  187. return 0;
  188. }
  189. static int intel_840_configure(void)
  190. {
  191. u32 temp;
  192. u16 temp2;
  193. struct aper_size_info_8 *current_size;
  194. current_size = A_SIZE_8(agp_bridge->current_size);
  195. /* aperture size */
  196. pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
  197. /* address to map to */
  198. pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
  199. agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  200. /* attbase - aperture base */
  201. pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
  202. /* agpctrl */
  203. pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
  204. /* mcgcfg */
  205. pci_read_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, &temp2);
  206. pci_write_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, temp2 | (1 << 9));
  207. /* clear any possible error conditions */
  208. pci_write_config_word(agp_bridge->dev, INTEL_I840_ERRSTS, 0xc000);
  209. return 0;
  210. }
  211. static int intel_845_configure(void)
  212. {
  213. u32 temp;
  214. u8 temp2;
  215. struct aper_size_info_8 *current_size;
  216. current_size = A_SIZE_8(agp_bridge->current_size);
  217. /* aperture size */
  218. pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
  219. if (agp_bridge->apbase_config != 0) {
  220. pci_write_config_dword(agp_bridge->dev, AGP_APBASE,
  221. agp_bridge->apbase_config);
  222. } else {
  223. /* address to map to */
  224. pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
  225. agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  226. agp_bridge->apbase_config = temp;
  227. }
  228. /* attbase - aperture base */
  229. pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
  230. /* agpctrl */
  231. pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
  232. /* agpm */
  233. pci_read_config_byte(agp_bridge->dev, INTEL_I845_AGPM, &temp2);
  234. pci_write_config_byte(agp_bridge->dev, INTEL_I845_AGPM, temp2 | (1 << 1));
  235. /* clear any possible error conditions */
  236. pci_write_config_word(agp_bridge->dev, INTEL_I845_ERRSTS, 0x001c);
  237. return 0;
  238. }
  239. static int intel_850_configure(void)
  240. {
  241. u32 temp;
  242. u16 temp2;
  243. struct aper_size_info_8 *current_size;
  244. current_size = A_SIZE_8(agp_bridge->current_size);
  245. /* aperture size */
  246. pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
  247. /* address to map to */
  248. pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
  249. agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  250. /* attbase - aperture base */
  251. pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
  252. /* agpctrl */
  253. pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
  254. /* mcgcfg */
  255. pci_read_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, &temp2);
  256. pci_write_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, temp2 | (1 << 9));
  257. /* clear any possible AGP-related error conditions */
  258. pci_write_config_word(agp_bridge->dev, INTEL_I850_ERRSTS, 0x001c);
  259. return 0;
  260. }
  261. static int intel_860_configure(void)
  262. {
  263. u32 temp;
  264. u16 temp2;
  265. struct aper_size_info_8 *current_size;
  266. current_size = A_SIZE_8(agp_bridge->current_size);
  267. /* aperture size */
  268. pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
  269. /* address to map to */
  270. pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
  271. agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  272. /* attbase - aperture base */
  273. pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
  274. /* agpctrl */
  275. pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
  276. /* mcgcfg */
  277. pci_read_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, &temp2);
  278. pci_write_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, temp2 | (1 << 9));
  279. /* clear any possible AGP-related error conditions */
  280. pci_write_config_word(agp_bridge->dev, INTEL_I860_ERRSTS, 0xf700);
  281. return 0;
  282. }
  283. static int intel_830mp_configure(void)
  284. {
  285. u32 temp;
  286. u16 temp2;
  287. struct aper_size_info_8 *current_size;
  288. current_size = A_SIZE_8(agp_bridge->current_size);
  289. /* aperture size */
  290. pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
  291. /* address to map to */
  292. pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
  293. agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  294. /* attbase - aperture base */
  295. pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
  296. /* agpctrl */
  297. pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
  298. /* gmch */
  299. pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2);
  300. pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp2 | (1 << 9));
  301. /* clear any possible AGP-related error conditions */
  302. pci_write_config_word(agp_bridge->dev, INTEL_I830_ERRSTS, 0x1c);
  303. return 0;
  304. }
  305. static int intel_7505_configure(void)
  306. {
  307. u32 temp;
  308. u16 temp2;
  309. struct aper_size_info_8 *current_size;
  310. current_size = A_SIZE_8(agp_bridge->current_size);
  311. /* aperture size */
  312. pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
  313. /* address to map to */
  314. pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
  315. agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
  316. /* attbase - aperture base */
  317. pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
  318. /* agpctrl */
  319. pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
  320. /* mchcfg */
  321. pci_read_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, &temp2);
  322. pci_write_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, temp2 | (1 << 9));
  323. return 0;
  324. }
  325. /* Setup function */
  326. static const struct gatt_mask intel_generic_masks[] =
  327. {
  328. {.mask = 0x00000017, .type = 0}
  329. };
  330. static const struct aper_size_info_8 intel_815_sizes[2] =
  331. {
  332. {64, 16384, 4, 0},
  333. {32, 8192, 3, 8},
  334. };
  335. static const struct aper_size_info_8 intel_8xx_sizes[7] =
  336. {
  337. {256, 65536, 6, 0},
  338. {128, 32768, 5, 32},
  339. {64, 16384, 4, 48},
  340. {32, 8192, 3, 56},
  341. {16, 4096, 2, 60},
  342. {8, 2048, 1, 62},
  343. {4, 1024, 0, 63}
  344. };
  345. static const struct aper_size_info_16 intel_generic_sizes[7] =
  346. {
  347. {256, 65536, 6, 0},
  348. {128, 32768, 5, 32},
  349. {64, 16384, 4, 48},
  350. {32, 8192, 3, 56},
  351. {16, 4096, 2, 60},
  352. {8, 2048, 1, 62},
  353. {4, 1024, 0, 63}
  354. };
  355. static const struct aper_size_info_8 intel_830mp_sizes[4] =
  356. {
  357. {256, 65536, 6, 0},
  358. {128, 32768, 5, 32},
  359. {64, 16384, 4, 48},
  360. {32, 8192, 3, 56}
  361. };
  362. static const struct agp_bridge_driver intel_generic_driver = {
  363. .owner = THIS_MODULE,
  364. .aperture_sizes = intel_generic_sizes,
  365. .size_type = U16_APER_SIZE,
  366. .num_aperture_sizes = 7,
  367. .needs_scratch_page = true,
  368. .configure = intel_configure,
  369. .fetch_size = intel_fetch_size,
  370. .cleanup = intel_cleanup,
  371. .tlb_flush = intel_tlbflush,
  372. .mask_memory = agp_generic_mask_memory,
  373. .masks = intel_generic_masks,
  374. .agp_enable = agp_generic_enable,
  375. .cache_flush = global_cache_flush,
  376. .create_gatt_table = agp_generic_create_gatt_table,
  377. .free_gatt_table = agp_generic_free_gatt_table,
  378. .insert_memory = agp_generic_insert_memory,
  379. .remove_memory = agp_generic_remove_memory,
  380. .alloc_by_type = agp_generic_alloc_by_type,
  381. .free_by_type = agp_generic_free_by_type,
  382. .agp_alloc_page = agp_generic_alloc_page,
  383. .agp_alloc_pages = agp_generic_alloc_pages,
  384. .agp_destroy_page = agp_generic_destroy_page,
  385. .agp_destroy_pages = agp_generic_destroy_pages,
  386. .agp_type_to_mask_type = agp_generic_type_to_mask_type,
  387. };
  388. static const struct agp_bridge_driver intel_815_driver = {
  389. .owner = THIS_MODULE,
  390. .aperture_sizes = intel_815_sizes,
  391. .size_type = U8_APER_SIZE,
  392. .num_aperture_sizes = 2,
  393. .needs_scratch_page = true,
  394. .configure = intel_815_configure,
  395. .fetch_size = intel_815_fetch_size,
  396. .cleanup = intel_8xx_cleanup,
  397. .tlb_flush = intel_8xx_tlbflush,
  398. .mask_memory = agp_generic_mask_memory,
  399. .masks = intel_generic_masks,
  400. .agp_enable = agp_generic_enable,
  401. .cache_flush = global_cache_flush,
  402. .create_gatt_table = agp_generic_create_gatt_table,
  403. .free_gatt_table = agp_generic_free_gatt_table,
  404. .insert_memory = agp_generic_insert_memory,
  405. .remove_memory = agp_generic_remove_memory,
  406. .alloc_by_type = agp_generic_alloc_by_type,
  407. .free_by_type = agp_generic_free_by_type,
  408. .agp_alloc_page = agp_generic_alloc_page,
  409. .agp_alloc_pages = agp_generic_alloc_pages,
  410. .agp_destroy_page = agp_generic_destroy_page,
  411. .agp_destroy_pages = agp_generic_destroy_pages,
  412. .agp_type_to_mask_type = agp_generic_type_to_mask_type,
  413. };
  414. static const struct agp_bridge_driver intel_820_driver = {
  415. .owner = THIS_MODULE,
  416. .aperture_sizes = intel_8xx_sizes,
  417. .size_type = U8_APER_SIZE,
  418. .num_aperture_sizes = 7,
  419. .needs_scratch_page = true,
  420. .configure = intel_820_configure,
  421. .fetch_size = intel_8xx_fetch_size,
  422. .cleanup = intel_820_cleanup,
  423. .tlb_flush = intel_820_tlbflush,
  424. .mask_memory = agp_generic_mask_memory,
  425. .masks = intel_generic_masks,
  426. .agp_enable = agp_generic_enable,
  427. .cache_flush = global_cache_flush,
  428. .create_gatt_table = agp_generic_create_gatt_table,
  429. .free_gatt_table = agp_generic_free_gatt_table,
  430. .insert_memory = agp_generic_insert_memory,
  431. .remove_memory = agp_generic_remove_memory,
  432. .alloc_by_type = agp_generic_alloc_by_type,
  433. .free_by_type = agp_generic_free_by_type,
  434. .agp_alloc_page = agp_generic_alloc_page,
  435. .agp_alloc_pages = agp_generic_alloc_pages,
  436. .agp_destroy_page = agp_generic_destroy_page,
  437. .agp_destroy_pages = agp_generic_destroy_pages,
  438. .agp_type_to_mask_type = agp_generic_type_to_mask_type,
  439. };
  440. static const struct agp_bridge_driver intel_830mp_driver = {
  441. .owner = THIS_MODULE,
  442. .aperture_sizes = intel_830mp_sizes,
  443. .size_type = U8_APER_SIZE,
  444. .num_aperture_sizes = 4,
  445. .needs_scratch_page = true,
  446. .configure = intel_830mp_configure,
  447. .fetch_size = intel_8xx_fetch_size,
  448. .cleanup = intel_8xx_cleanup,
  449. .tlb_flush = intel_8xx_tlbflush,
  450. .mask_memory = agp_generic_mask_memory,
  451. .masks = intel_generic_masks,
  452. .agp_enable = agp_generic_enable,
  453. .cache_flush = global_cache_flush,
  454. .create_gatt_table = agp_generic_create_gatt_table,
  455. .free_gatt_table = agp_generic_free_gatt_table,
  456. .insert_memory = agp_generic_insert_memory,
  457. .remove_memory = agp_generic_remove_memory,
  458. .alloc_by_type = agp_generic_alloc_by_type,
  459. .free_by_type = agp_generic_free_by_type,
  460. .agp_alloc_page = agp_generic_alloc_page,
  461. .agp_alloc_pages = agp_generic_alloc_pages,
  462. .agp_destroy_page = agp_generic_destroy_page,
  463. .agp_destroy_pages = agp_generic_destroy_pages,
  464. .agp_type_to_mask_type = agp_generic_type_to_mask_type,
  465. };
  466. static const struct agp_bridge_driver intel_840_driver = {
  467. .owner = THIS_MODULE,
  468. .aperture_sizes = intel_8xx_sizes,
  469. .size_type = U8_APER_SIZE,
  470. .num_aperture_sizes = 7,
  471. .needs_scratch_page = true,
  472. .configure = intel_840_configure,
  473. .fetch_size = intel_8xx_fetch_size,
  474. .cleanup = intel_8xx_cleanup,
  475. .tlb_flush = intel_8xx_tlbflush,
  476. .mask_memory = agp_generic_mask_memory,
  477. .masks = intel_generic_masks,
  478. .agp_enable = agp_generic_enable,
  479. .cache_flush = global_cache_flush,
  480. .create_gatt_table = agp_generic_create_gatt_table,
  481. .free_gatt_table = agp_generic_free_gatt_table,
  482. .insert_memory = agp_generic_insert_memory,
  483. .remove_memory = agp_generic_remove_memory,
  484. .alloc_by_type = agp_generic_alloc_by_type,
  485. .free_by_type = agp_generic_free_by_type,
  486. .agp_alloc_page = agp_generic_alloc_page,
  487. .agp_alloc_pages = agp_generic_alloc_pages,
  488. .agp_destroy_page = agp_generic_destroy_page,
  489. .agp_destroy_pages = agp_generic_destroy_pages,
  490. .agp_type_to_mask_type = agp_generic_type_to_mask_type,
  491. };
  492. static const struct agp_bridge_driver intel_845_driver = {
  493. .owner = THIS_MODULE,
  494. .aperture_sizes = intel_8xx_sizes,
  495. .size_type = U8_APER_SIZE,
  496. .num_aperture_sizes = 7,
  497. .needs_scratch_page = true,
  498. .configure = intel_845_configure,
  499. .fetch_size = intel_8xx_fetch_size,
  500. .cleanup = intel_8xx_cleanup,
  501. .tlb_flush = intel_8xx_tlbflush,
  502. .mask_memory = agp_generic_mask_memory,
  503. .masks = intel_generic_masks,
  504. .agp_enable = agp_generic_enable,
  505. .cache_flush = global_cache_flush,
  506. .create_gatt_table = agp_generic_create_gatt_table,
  507. .free_gatt_table = agp_generic_free_gatt_table,
  508. .insert_memory = agp_generic_insert_memory,
  509. .remove_memory = agp_generic_remove_memory,
  510. .alloc_by_type = agp_generic_alloc_by_type,
  511. .free_by_type = agp_generic_free_by_type,
  512. .agp_alloc_page = agp_generic_alloc_page,
  513. .agp_alloc_pages = agp_generic_alloc_pages,
  514. .agp_destroy_page = agp_generic_destroy_page,
  515. .agp_destroy_pages = agp_generic_destroy_pages,
  516. .agp_type_to_mask_type = agp_generic_type_to_mask_type,
  517. };
  518. static const struct agp_bridge_driver intel_850_driver = {
  519. .owner = THIS_MODULE,
  520. .aperture_sizes = intel_8xx_sizes,
  521. .size_type = U8_APER_SIZE,
  522. .num_aperture_sizes = 7,
  523. .needs_scratch_page = true,
  524. .configure = intel_850_configure,
  525. .fetch_size = intel_8xx_fetch_size,
  526. .cleanup = intel_8xx_cleanup,
  527. .tlb_flush = intel_8xx_tlbflush,
  528. .mask_memory = agp_generic_mask_memory,
  529. .masks = intel_generic_masks,
  530. .agp_enable = agp_generic_enable,
  531. .cache_flush = global_cache_flush,
  532. .create_gatt_table = agp_generic_create_gatt_table,
  533. .free_gatt_table = agp_generic_free_gatt_table,
  534. .insert_memory = agp_generic_insert_memory,
  535. .remove_memory = agp_generic_remove_memory,
  536. .alloc_by_type = agp_generic_alloc_by_type,
  537. .free_by_type = agp_generic_free_by_type,
  538. .agp_alloc_page = agp_generic_alloc_page,
  539. .agp_alloc_pages = agp_generic_alloc_pages,
  540. .agp_destroy_page = agp_generic_destroy_page,
  541. .agp_destroy_pages = agp_generic_destroy_pages,
  542. .agp_type_to_mask_type = agp_generic_type_to_mask_type,
  543. };
  544. static const struct agp_bridge_driver intel_860_driver = {
  545. .owner = THIS_MODULE,
  546. .aperture_sizes = intel_8xx_sizes,
  547. .size_type = U8_APER_SIZE,
  548. .num_aperture_sizes = 7,
  549. .needs_scratch_page = true,
  550. .configure = intel_860_configure,
  551. .fetch_size = intel_8xx_fetch_size,
  552. .cleanup = intel_8xx_cleanup,
  553. .tlb_flush = intel_8xx_tlbflush,
  554. .mask_memory = agp_generic_mask_memory,
  555. .masks = intel_generic_masks,
  556. .agp_enable = agp_generic_enable,
  557. .cache_flush = global_cache_flush,
  558. .create_gatt_table = agp_generic_create_gatt_table,
  559. .free_gatt_table = agp_generic_free_gatt_table,
  560. .insert_memory = agp_generic_insert_memory,
  561. .remove_memory = agp_generic_remove_memory,
  562. .alloc_by_type = agp_generic_alloc_by_type,
  563. .free_by_type = agp_generic_free_by_type,
  564. .agp_alloc_page = agp_generic_alloc_page,
  565. .agp_alloc_pages = agp_generic_alloc_pages,
  566. .agp_destroy_page = agp_generic_destroy_page,
  567. .agp_destroy_pages = agp_generic_destroy_pages,
  568. .agp_type_to_mask_type = agp_generic_type_to_mask_type,
  569. };
  570. static const struct agp_bridge_driver intel_7505_driver = {
  571. .owner = THIS_MODULE,
  572. .aperture_sizes = intel_8xx_sizes,
  573. .size_type = U8_APER_SIZE,
  574. .num_aperture_sizes = 7,
  575. .needs_scratch_page = true,
  576. .configure = intel_7505_configure,
  577. .fetch_size = intel_8xx_fetch_size,
  578. .cleanup = intel_8xx_cleanup,
  579. .tlb_flush = intel_8xx_tlbflush,
  580. .mask_memory = agp_generic_mask_memory,
  581. .masks = intel_generic_masks,
  582. .agp_enable = agp_generic_enable,
  583. .cache_flush = global_cache_flush,
  584. .create_gatt_table = agp_generic_create_gatt_table,
  585. .free_gatt_table = agp_generic_free_gatt_table,
  586. .insert_memory = agp_generic_insert_memory,
  587. .remove_memory = agp_generic_remove_memory,
  588. .alloc_by_type = agp_generic_alloc_by_type,
  589. .free_by_type = agp_generic_free_by_type,
  590. .agp_alloc_page = agp_generic_alloc_page,
  591. .agp_alloc_pages = agp_generic_alloc_pages,
  592. .agp_destroy_page = agp_generic_destroy_page,
  593. .agp_destroy_pages = agp_generic_destroy_pages,
  594. .agp_type_to_mask_type = agp_generic_type_to_mask_type,
  595. };
  596. static int find_gmch(u16 device)
  597. {
  598. struct pci_dev *gmch_device;
  599. gmch_device = pci_get_device(PCI_VENDOR_ID_INTEL, device, NULL);
  600. if (gmch_device && PCI_FUNC(gmch_device->devfn) != 0) {
  601. gmch_device = pci_get_device(PCI_VENDOR_ID_INTEL,
  602. device, gmch_device);
  603. }
  604. if (!gmch_device)
  605. return 0;
  606. intel_private.pcidev = gmch_device;
  607. return 1;
  608. }
  609. /* Table to describe Intel GMCH and AGP/PCIE GART drivers. At least one of
  610. * driver and gmch_driver must be non-null, and find_gmch will determine
  611. * which one should be used if a gmch_chip_id is present.
  612. */
  613. static const struct intel_driver_description {
  614. unsigned int chip_id;
  615. unsigned int gmch_chip_id;
  616. char *name;
  617. const struct agp_bridge_driver *driver;
  618. const struct agp_bridge_driver *gmch_driver;
  619. } intel_agp_chipsets[] = {
  620. { PCI_DEVICE_ID_INTEL_82443LX_0, 0, "440LX", &intel_generic_driver, NULL },
  621. { PCI_DEVICE_ID_INTEL_82443BX_0, 0, "440BX", &intel_generic_driver, NULL },
  622. { PCI_DEVICE_ID_INTEL_82443GX_0, 0, "440GX", &intel_generic_driver, NULL },
  623. { PCI_DEVICE_ID_INTEL_82810_MC1, PCI_DEVICE_ID_INTEL_82810_IG1, "i810",
  624. NULL, &intel_810_driver },
  625. { PCI_DEVICE_ID_INTEL_82810_MC3, PCI_DEVICE_ID_INTEL_82810_IG3, "i810",
  626. NULL, &intel_810_driver },
  627. { PCI_DEVICE_ID_INTEL_82810E_MC, PCI_DEVICE_ID_INTEL_82810E_IG, "i810",
  628. NULL, &intel_810_driver },
  629. { PCI_DEVICE_ID_INTEL_82815_MC, PCI_DEVICE_ID_INTEL_82815_CGC, "i815",
  630. &intel_815_driver, &intel_810_driver },
  631. { PCI_DEVICE_ID_INTEL_82820_HB, 0, "i820", &intel_820_driver, NULL },
  632. { PCI_DEVICE_ID_INTEL_82820_UP_HB, 0, "i820", &intel_820_driver, NULL },
  633. { PCI_DEVICE_ID_INTEL_82830_HB, PCI_DEVICE_ID_INTEL_82830_CGC, "830M",
  634. &intel_830mp_driver, &intel_830_driver },
  635. { PCI_DEVICE_ID_INTEL_82840_HB, 0, "i840", &intel_840_driver, NULL },
  636. { PCI_DEVICE_ID_INTEL_82845_HB, 0, "845G", &intel_845_driver, NULL },
  637. { PCI_DEVICE_ID_INTEL_82845G_HB, PCI_DEVICE_ID_INTEL_82845G_IG, "830M",
  638. &intel_845_driver, &intel_830_driver },
  639. { PCI_DEVICE_ID_INTEL_82850_HB, 0, "i850", &intel_850_driver, NULL },
  640. { PCI_DEVICE_ID_INTEL_82854_HB, PCI_DEVICE_ID_INTEL_82854_IG, "854",
  641. &intel_845_driver, &intel_830_driver },
  642. { PCI_DEVICE_ID_INTEL_82855PM_HB, 0, "855PM", &intel_845_driver, NULL },
  643. { PCI_DEVICE_ID_INTEL_82855GM_HB, PCI_DEVICE_ID_INTEL_82855GM_IG, "855GM",
  644. &intel_845_driver, &intel_830_driver },
  645. { PCI_DEVICE_ID_INTEL_82860_HB, 0, "i860", &intel_860_driver, NULL },
  646. { PCI_DEVICE_ID_INTEL_82865_HB, PCI_DEVICE_ID_INTEL_82865_IG, "865",
  647. &intel_845_driver, &intel_830_driver },
  648. { PCI_DEVICE_ID_INTEL_82875_HB, 0, "i875", &intel_845_driver, NULL },
  649. { PCI_DEVICE_ID_INTEL_E7221_HB, PCI_DEVICE_ID_INTEL_E7221_IG, "E7221 (i915)",
  650. NULL, &intel_915_driver },
  651. { PCI_DEVICE_ID_INTEL_82915G_HB, PCI_DEVICE_ID_INTEL_82915G_IG, "915G",
  652. NULL, &intel_915_driver },
  653. { PCI_DEVICE_ID_INTEL_82915GM_HB, PCI_DEVICE_ID_INTEL_82915GM_IG, "915GM",
  654. NULL, &intel_915_driver },
  655. { PCI_DEVICE_ID_INTEL_82945G_HB, PCI_DEVICE_ID_INTEL_82945G_IG, "945G",
  656. NULL, &intel_915_driver },
  657. { PCI_DEVICE_ID_INTEL_82945GM_HB, PCI_DEVICE_ID_INTEL_82945GM_IG, "945GM",
  658. NULL, &intel_915_driver },
  659. { PCI_DEVICE_ID_INTEL_82945GME_HB, PCI_DEVICE_ID_INTEL_82945GME_IG, "945GME",
  660. NULL, &intel_915_driver },
  661. { PCI_DEVICE_ID_INTEL_82946GZ_HB, PCI_DEVICE_ID_INTEL_82946GZ_IG, "946GZ",
  662. NULL, &intel_i965_driver },
  663. { PCI_DEVICE_ID_INTEL_82G35_HB, PCI_DEVICE_ID_INTEL_82G35_IG, "G35",
  664. NULL, &intel_i965_driver },
  665. { PCI_DEVICE_ID_INTEL_82965Q_HB, PCI_DEVICE_ID_INTEL_82965Q_IG, "965Q",
  666. NULL, &intel_i965_driver },
  667. { PCI_DEVICE_ID_INTEL_82965G_HB, PCI_DEVICE_ID_INTEL_82965G_IG, "965G",
  668. NULL, &intel_i965_driver },
  669. { PCI_DEVICE_ID_INTEL_82965GM_HB, PCI_DEVICE_ID_INTEL_82965GM_IG, "965GM",
  670. NULL, &intel_i965_driver },
  671. { PCI_DEVICE_ID_INTEL_82965GME_HB, PCI_DEVICE_ID_INTEL_82965GME_IG, "965GME/GLE",
  672. NULL, &intel_i965_driver },
  673. { PCI_DEVICE_ID_INTEL_7505_0, 0, "E7505", &intel_7505_driver, NULL },
  674. { PCI_DEVICE_ID_INTEL_7205_0, 0, "E7205", &intel_7505_driver, NULL },
  675. { PCI_DEVICE_ID_INTEL_G33_HB, PCI_DEVICE_ID_INTEL_G33_IG, "G33",
  676. NULL, &intel_g33_driver },
  677. { PCI_DEVICE_ID_INTEL_Q35_HB, PCI_DEVICE_ID_INTEL_Q35_IG, "Q35",
  678. NULL, &intel_g33_driver },
  679. { PCI_DEVICE_ID_INTEL_Q33_HB, PCI_DEVICE_ID_INTEL_Q33_IG, "Q33",
  680. NULL, &intel_g33_driver },
  681. { PCI_DEVICE_ID_INTEL_PINEVIEW_M_HB, PCI_DEVICE_ID_INTEL_PINEVIEW_M_IG, "GMA3150",
  682. NULL, &intel_g33_driver },
  683. { PCI_DEVICE_ID_INTEL_PINEVIEW_HB, PCI_DEVICE_ID_INTEL_PINEVIEW_IG, "GMA3150",
  684. NULL, &intel_g33_driver },
  685. { PCI_DEVICE_ID_INTEL_GM45_HB, PCI_DEVICE_ID_INTEL_GM45_IG,
  686. "GM45", NULL, &intel_i965_driver },
  687. { PCI_DEVICE_ID_INTEL_EAGLELAKE_HB, PCI_DEVICE_ID_INTEL_EAGLELAKE_IG,
  688. "Eaglelake", NULL, &intel_i965_driver },
  689. { PCI_DEVICE_ID_INTEL_Q45_HB, PCI_DEVICE_ID_INTEL_Q45_IG,
  690. "Q45/Q43", NULL, &intel_i965_driver },
  691. { PCI_DEVICE_ID_INTEL_G45_HB, PCI_DEVICE_ID_INTEL_G45_IG,
  692. "G45/G43", NULL, &intel_i965_driver },
  693. { PCI_DEVICE_ID_INTEL_B43_HB, PCI_DEVICE_ID_INTEL_B43_IG,
  694. "B43", NULL, &intel_i965_driver },
  695. { PCI_DEVICE_ID_INTEL_B43_1_HB, PCI_DEVICE_ID_INTEL_B43_1_IG,
  696. "B43", NULL, &intel_i965_driver },
  697. { PCI_DEVICE_ID_INTEL_G41_HB, PCI_DEVICE_ID_INTEL_G41_IG,
  698. "G41", NULL, &intel_i965_driver },
  699. { PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_D_IG,
  700. "HD Graphics", NULL, &intel_i965_driver },
  701. { PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG,
  702. "HD Graphics", NULL, &intel_i965_driver },
  703. { PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG,
  704. "HD Graphics", NULL, &intel_i965_driver },
  705. { PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG,
  706. "HD Graphics", NULL, &intel_i965_driver },
  707. { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_GT1_IG,
  708. "Sandybridge", NULL, &intel_gen6_driver },
  709. { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_GT2_IG,
  710. "Sandybridge", NULL, &intel_gen6_driver },
  711. { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_GT2_PLUS_IG,
  712. "Sandybridge", NULL, &intel_gen6_driver },
  713. { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_GT1_IG,
  714. "Sandybridge", NULL, &intel_gen6_driver },
  715. { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_GT2_IG,
  716. "Sandybridge", NULL, &intel_gen6_driver },
  717. { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_GT2_PLUS_IG,
  718. "Sandybridge", NULL, &intel_gen6_driver },
  719. { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_IG,
  720. "Sandybridge", NULL, &intel_gen6_driver },
  721. { 0, 0, NULL, NULL, NULL }
  722. };
  723. static int __devinit intel_gmch_probe(struct pci_dev *pdev,
  724. struct agp_bridge_data *bridge)
  725. {
  726. int i, mask;
  727. bridge->driver = NULL;
  728. for (i = 0; intel_agp_chipsets[i].name != NULL; i++) {
  729. if ((intel_agp_chipsets[i].gmch_chip_id != 0) &&
  730. find_gmch(intel_agp_chipsets[i].gmch_chip_id)) {
  731. bridge->driver =
  732. intel_agp_chipsets[i].gmch_driver;
  733. break;
  734. }
  735. }
  736. if (!bridge->driver)
  737. return 0;
  738. bridge->dev_private_data = &intel_private;
  739. bridge->dev = pdev;
  740. dev_info(&pdev->dev, "Intel %s Chipset\n", intel_agp_chipsets[i].name);
  741. if (bridge->driver->mask_memory == intel_gen6_mask_memory)
  742. mask = 40;
  743. else if (bridge->driver->mask_memory == intel_i965_mask_memory)
  744. mask = 36;
  745. else
  746. mask = 32;
  747. if (pci_set_dma_mask(intel_private.pcidev, DMA_BIT_MASK(mask)))
  748. dev_err(&intel_private.pcidev->dev,
  749. "set gfx device dma mask %d-bit failed!\n", mask);
  750. else
  751. pci_set_consistent_dma_mask(intel_private.pcidev,
  752. DMA_BIT_MASK(mask));
  753. return 1;
  754. }
  755. static int __devinit agp_intel_probe(struct pci_dev *pdev,
  756. const struct pci_device_id *ent)
  757. {
  758. struct agp_bridge_data *bridge;
  759. u8 cap_ptr = 0;
  760. struct resource *r;
  761. int i, err;
  762. cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP);
  763. bridge = agp_alloc_bridge();
  764. if (!bridge)
  765. return -ENOMEM;
  766. bridge->capndx = cap_ptr;
  767. if (intel_gmch_probe(pdev, bridge))
  768. goto found_gmch;
  769. for (i = 0; intel_agp_chipsets[i].name != NULL; i++) {
  770. /* In case that multiple models of gfx chip may
  771. stand on same host bridge type, this can be
  772. sure we detect the right IGD. */
  773. if (pdev->device == intel_agp_chipsets[i].chip_id) {
  774. bridge->driver = intel_agp_chipsets[i].driver;
  775. break;
  776. }
  777. }
  778. if (intel_agp_chipsets[i].name == NULL) {
  779. if (cap_ptr)
  780. dev_warn(&pdev->dev, "unsupported Intel chipset [%04x/%04x]\n",
  781. pdev->vendor, pdev->device);
  782. agp_put_bridge(bridge);
  783. return -ENODEV;
  784. }
  785. if (!bridge->driver) {
  786. if (cap_ptr)
  787. dev_warn(&pdev->dev, "can't find bridge device (chip_id: %04x)\n",
  788. intel_agp_chipsets[i].gmch_chip_id);
  789. agp_put_bridge(bridge);
  790. return -ENODEV;
  791. }
  792. bridge->dev = pdev;
  793. bridge->dev_private_data = NULL;
  794. dev_info(&pdev->dev, "Intel %s Chipset\n", intel_agp_chipsets[i].name);
  795. /*
  796. * If the device has not been properly setup, the following will catch
  797. * the problem and should stop the system from crashing.
  798. * 20030610 - hamish@zot.org
  799. */
  800. if (pci_enable_device(pdev)) {
  801. dev_err(&pdev->dev, "can't enable PCI device\n");
  802. agp_put_bridge(bridge);
  803. return -ENODEV;
  804. }
  805. /*
  806. * The following fixes the case where the BIOS has "forgotten" to
  807. * provide an address range for the GART.
  808. * 20030610 - hamish@zot.org
  809. */
  810. r = &pdev->resource[0];
  811. if (!r->start && r->end) {
  812. if (pci_assign_resource(pdev, 0)) {
  813. dev_err(&pdev->dev, "can't assign resource 0\n");
  814. agp_put_bridge(bridge);
  815. return -ENODEV;
  816. }
  817. }
  818. /* Fill in the mode register */
  819. if (cap_ptr) {
  820. pci_read_config_dword(pdev,
  821. bridge->capndx+PCI_AGP_STATUS,
  822. &bridge->mode);
  823. }
  824. found_gmch:
  825. pci_set_drvdata(pdev, bridge);
  826. err = agp_add_bridge(bridge);
  827. if (!err)
  828. intel_agp_enabled = 1;
  829. return err;
  830. }
  831. static void __devexit agp_intel_remove(struct pci_dev *pdev)
  832. {
  833. struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
  834. agp_remove_bridge(bridge);
  835. if (intel_private.pcidev)
  836. pci_dev_put(intel_private.pcidev);
  837. agp_put_bridge(bridge);
  838. }
  839. #ifdef CONFIG_PM
  840. static int agp_intel_resume(struct pci_dev *pdev)
  841. {
  842. struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
  843. int ret_val;
  844. bridge->driver->configure();
  845. ret_val = agp_rebind_memory();
  846. if (ret_val != 0)
  847. return ret_val;
  848. return 0;
  849. }
  850. #endif
  851. static struct pci_device_id agp_intel_pci_table[] = {
  852. #define ID(x) \
  853. { \
  854. .class = (PCI_CLASS_BRIDGE_HOST << 8), \
  855. .class_mask = ~0, \
  856. .vendor = PCI_VENDOR_ID_INTEL, \
  857. .device = x, \
  858. .subvendor = PCI_ANY_ID, \
  859. .subdevice = PCI_ANY_ID, \
  860. }
  861. ID(PCI_DEVICE_ID_INTEL_82443LX_0),
  862. ID(PCI_DEVICE_ID_INTEL_82443BX_0),
  863. ID(PCI_DEVICE_ID_INTEL_82443GX_0),
  864. ID(PCI_DEVICE_ID_INTEL_82810_MC1),
  865. ID(PCI_DEVICE_ID_INTEL_82810_MC3),
  866. ID(PCI_DEVICE_ID_INTEL_82810E_MC),
  867. ID(PCI_DEVICE_ID_INTEL_82815_MC),
  868. ID(PCI_DEVICE_ID_INTEL_82820_HB),
  869. ID(PCI_DEVICE_ID_INTEL_82820_UP_HB),
  870. ID(PCI_DEVICE_ID_INTEL_82830_HB),
  871. ID(PCI_DEVICE_ID_INTEL_82840_HB),
  872. ID(PCI_DEVICE_ID_INTEL_82845_HB),
  873. ID(PCI_DEVICE_ID_INTEL_82845G_HB),
  874. ID(PCI_DEVICE_ID_INTEL_82850_HB),
  875. ID(PCI_DEVICE_ID_INTEL_82854_HB),
  876. ID(PCI_DEVICE_ID_INTEL_82855PM_HB),
  877. ID(PCI_DEVICE_ID_INTEL_82855GM_HB),
  878. ID(PCI_DEVICE_ID_INTEL_82860_HB),
  879. ID(PCI_DEVICE_ID_INTEL_82865_HB),
  880. ID(PCI_DEVICE_ID_INTEL_82875_HB),
  881. ID(PCI_DEVICE_ID_INTEL_7505_0),
  882. ID(PCI_DEVICE_ID_INTEL_7205_0),
  883. ID(PCI_DEVICE_ID_INTEL_E7221_HB),
  884. ID(PCI_DEVICE_ID_INTEL_82915G_HB),
  885. ID(PCI_DEVICE_ID_INTEL_82915GM_HB),
  886. ID(PCI_DEVICE_ID_INTEL_82945G_HB),
  887. ID(PCI_DEVICE_ID_INTEL_82945GM_HB),
  888. ID(PCI_DEVICE_ID_INTEL_82945GME_HB),
  889. ID(PCI_DEVICE_ID_INTEL_PINEVIEW_M_HB),
  890. ID(PCI_DEVICE_ID_INTEL_PINEVIEW_HB),
  891. ID(PCI_DEVICE_ID_INTEL_82946GZ_HB),
  892. ID(PCI_DEVICE_ID_INTEL_82G35_HB),
  893. ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
  894. ID(PCI_DEVICE_ID_INTEL_82965G_HB),
  895. ID(PCI_DEVICE_ID_INTEL_82965GM_HB),
  896. ID(PCI_DEVICE_ID_INTEL_82965GME_HB),
  897. ID(PCI_DEVICE_ID_INTEL_G33_HB),
  898. ID(PCI_DEVICE_ID_INTEL_Q35_HB),
  899. ID(PCI_DEVICE_ID_INTEL_Q33_HB),
  900. ID(PCI_DEVICE_ID_INTEL_GM45_HB),
  901. ID(PCI_DEVICE_ID_INTEL_EAGLELAKE_HB),
  902. ID(PCI_DEVICE_ID_INTEL_Q45_HB),
  903. ID(PCI_DEVICE_ID_INTEL_G45_HB),
  904. ID(PCI_DEVICE_ID_INTEL_G41_HB),
  905. ID(PCI_DEVICE_ID_INTEL_B43_HB),
  906. ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB),
  907. ID(PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB),
  908. ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB),
  909. ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB),
  910. ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB),
  911. ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB),
  912. ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_HB),
  913. { }
  914. };
  915. MODULE_DEVICE_TABLE(pci, agp_intel_pci_table);
  916. static struct pci_driver agp_intel_pci_driver = {
  917. .name = "agpgart-intel",
  918. .id_table = agp_intel_pci_table,
  919. .probe = agp_intel_probe,
  920. .remove = __devexit_p(agp_intel_remove),
  921. #ifdef CONFIG_PM
  922. .resume = agp_intel_resume,
  923. #endif
  924. };
  925. static int __init agp_intel_init(void)
  926. {
  927. if (agp_off)
  928. return -EINVAL;
  929. return pci_register_driver(&agp_intel_pci_driver);
  930. }
  931. static void __exit agp_intel_cleanup(void)
  932. {
  933. pci_unregister_driver(&agp_intel_pci_driver);
  934. }
  935. module_init(agp_intel_init);
  936. module_exit(agp_intel_cleanup);
  937. MODULE_AUTHOR("Dave Jones <davej@redhat.com>");
  938. MODULE_LICENSE("GPL and additional rights");