intel-agp.c 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088
  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_G41_HB, PCI_DEVICE_ID_INTEL_G41_IG,
  696. "G41", NULL, &intel_i965_driver },
  697. { PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_D_IG,
  698. "HD Graphics", NULL, &intel_i965_driver },
  699. { PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG,
  700. "HD Graphics", NULL, &intel_i965_driver },
  701. { PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG,
  702. "HD Graphics", NULL, &intel_i965_driver },
  703. { PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG,
  704. "HD Graphics", NULL, &intel_i965_driver },
  705. { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_GT1_IG,
  706. "Sandybridge", NULL, &intel_gen6_driver },
  707. { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_GT2_IG,
  708. "Sandybridge", NULL, &intel_gen6_driver },
  709. { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_GT2_PLUS_IG,
  710. "Sandybridge", NULL, &intel_gen6_driver },
  711. { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_GT1_IG,
  712. "Sandybridge", NULL, &intel_gen6_driver },
  713. { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_GT2_IG,
  714. "Sandybridge", NULL, &intel_gen6_driver },
  715. { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_GT2_PLUS_IG,
  716. "Sandybridge", NULL, &intel_gen6_driver },
  717. { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_IG,
  718. "Sandybridge", NULL, &intel_gen6_driver },
  719. { 0, 0, NULL, NULL, NULL }
  720. };
  721. static int __devinit intel_gmch_probe(struct pci_dev *pdev,
  722. struct agp_bridge_data *bridge)
  723. {
  724. int i, mask;
  725. bridge->driver = NULL;
  726. for (i = 0; intel_agp_chipsets[i].name != NULL; i++) {
  727. if ((intel_agp_chipsets[i].gmch_chip_id != 0) &&
  728. find_gmch(intel_agp_chipsets[i].gmch_chip_id)) {
  729. bridge->driver =
  730. intel_agp_chipsets[i].gmch_driver;
  731. break;
  732. }
  733. }
  734. if (!bridge->driver)
  735. return 0;
  736. bridge->dev_private_data = &intel_private;
  737. bridge->dev = pdev;
  738. dev_info(&pdev->dev, "Intel %s Chipset\n", intel_agp_chipsets[i].name);
  739. if (bridge->driver->mask_memory == intel_gen6_mask_memory)
  740. mask = 40;
  741. else if (bridge->driver->mask_memory == intel_i965_mask_memory)
  742. mask = 36;
  743. else
  744. mask = 32;
  745. if (pci_set_dma_mask(intel_private.pcidev, DMA_BIT_MASK(mask)))
  746. dev_err(&intel_private.pcidev->dev,
  747. "set gfx device dma mask %d-bit failed!\n", mask);
  748. else
  749. pci_set_consistent_dma_mask(intel_private.pcidev,
  750. DMA_BIT_MASK(mask));
  751. return 1;
  752. }
  753. static int __devinit agp_intel_probe(struct pci_dev *pdev,
  754. const struct pci_device_id *ent)
  755. {
  756. struct agp_bridge_data *bridge;
  757. u8 cap_ptr = 0;
  758. struct resource *r;
  759. int i, err;
  760. cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP);
  761. bridge = agp_alloc_bridge();
  762. if (!bridge)
  763. return -ENOMEM;
  764. bridge->capndx = cap_ptr;
  765. if (intel_gmch_probe(pdev, bridge))
  766. goto found_gmch;
  767. for (i = 0; intel_agp_chipsets[i].name != NULL; i++) {
  768. /* In case that multiple models of gfx chip may
  769. stand on same host bridge type, this can be
  770. sure we detect the right IGD. */
  771. if (pdev->device == intel_agp_chipsets[i].chip_id) {
  772. bridge->driver = intel_agp_chipsets[i].driver;
  773. break;
  774. }
  775. }
  776. if (intel_agp_chipsets[i].name == NULL) {
  777. if (cap_ptr)
  778. dev_warn(&pdev->dev, "unsupported Intel chipset [%04x/%04x]\n",
  779. pdev->vendor, pdev->device);
  780. agp_put_bridge(bridge);
  781. return -ENODEV;
  782. }
  783. if (!bridge->driver) {
  784. if (cap_ptr)
  785. dev_warn(&pdev->dev, "can't find bridge device (chip_id: %04x)\n",
  786. intel_agp_chipsets[i].gmch_chip_id);
  787. agp_put_bridge(bridge);
  788. return -ENODEV;
  789. }
  790. bridge->dev = pdev;
  791. bridge->dev_private_data = NULL;
  792. dev_info(&pdev->dev, "Intel %s Chipset\n", intel_agp_chipsets[i].name);
  793. /*
  794. * If the device has not been properly setup, the following will catch
  795. * the problem and should stop the system from crashing.
  796. * 20030610 - hamish@zot.org
  797. */
  798. if (pci_enable_device(pdev)) {
  799. dev_err(&pdev->dev, "can't enable PCI device\n");
  800. agp_put_bridge(bridge);
  801. return -ENODEV;
  802. }
  803. /*
  804. * The following fixes the case where the BIOS has "forgotten" to
  805. * provide an address range for the GART.
  806. * 20030610 - hamish@zot.org
  807. */
  808. r = &pdev->resource[0];
  809. if (!r->start && r->end) {
  810. if (pci_assign_resource(pdev, 0)) {
  811. dev_err(&pdev->dev, "can't assign resource 0\n");
  812. agp_put_bridge(bridge);
  813. return -ENODEV;
  814. }
  815. }
  816. /* Fill in the mode register */
  817. if (cap_ptr) {
  818. pci_read_config_dword(pdev,
  819. bridge->capndx+PCI_AGP_STATUS,
  820. &bridge->mode);
  821. }
  822. found_gmch:
  823. pci_set_drvdata(pdev, bridge);
  824. err = agp_add_bridge(bridge);
  825. if (!err)
  826. intel_agp_enabled = 1;
  827. return err;
  828. }
  829. static void __devexit agp_intel_remove(struct pci_dev *pdev)
  830. {
  831. struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
  832. agp_remove_bridge(bridge);
  833. if (intel_private.pcidev)
  834. pci_dev_put(intel_private.pcidev);
  835. agp_put_bridge(bridge);
  836. }
  837. #ifdef CONFIG_PM
  838. static int agp_intel_resume(struct pci_dev *pdev)
  839. {
  840. struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
  841. int ret_val;
  842. bridge->driver->configure();
  843. ret_val = agp_rebind_memory();
  844. if (ret_val != 0)
  845. return ret_val;
  846. return 0;
  847. }
  848. #endif
  849. static struct pci_device_id agp_intel_pci_table[] = {
  850. #define ID(x) \
  851. { \
  852. .class = (PCI_CLASS_BRIDGE_HOST << 8), \
  853. .class_mask = ~0, \
  854. .vendor = PCI_VENDOR_ID_INTEL, \
  855. .device = x, \
  856. .subvendor = PCI_ANY_ID, \
  857. .subdevice = PCI_ANY_ID, \
  858. }
  859. ID(PCI_DEVICE_ID_INTEL_82443LX_0),
  860. ID(PCI_DEVICE_ID_INTEL_82443BX_0),
  861. ID(PCI_DEVICE_ID_INTEL_82443GX_0),
  862. ID(PCI_DEVICE_ID_INTEL_82810_MC1),
  863. ID(PCI_DEVICE_ID_INTEL_82810_MC3),
  864. ID(PCI_DEVICE_ID_INTEL_82810E_MC),
  865. ID(PCI_DEVICE_ID_INTEL_82815_MC),
  866. ID(PCI_DEVICE_ID_INTEL_82820_HB),
  867. ID(PCI_DEVICE_ID_INTEL_82820_UP_HB),
  868. ID(PCI_DEVICE_ID_INTEL_82830_HB),
  869. ID(PCI_DEVICE_ID_INTEL_82840_HB),
  870. ID(PCI_DEVICE_ID_INTEL_82845_HB),
  871. ID(PCI_DEVICE_ID_INTEL_82845G_HB),
  872. ID(PCI_DEVICE_ID_INTEL_82850_HB),
  873. ID(PCI_DEVICE_ID_INTEL_82854_HB),
  874. ID(PCI_DEVICE_ID_INTEL_82855PM_HB),
  875. ID(PCI_DEVICE_ID_INTEL_82855GM_HB),
  876. ID(PCI_DEVICE_ID_INTEL_82860_HB),
  877. ID(PCI_DEVICE_ID_INTEL_82865_HB),
  878. ID(PCI_DEVICE_ID_INTEL_82875_HB),
  879. ID(PCI_DEVICE_ID_INTEL_7505_0),
  880. ID(PCI_DEVICE_ID_INTEL_7205_0),
  881. ID(PCI_DEVICE_ID_INTEL_E7221_HB),
  882. ID(PCI_DEVICE_ID_INTEL_82915G_HB),
  883. ID(PCI_DEVICE_ID_INTEL_82915GM_HB),
  884. ID(PCI_DEVICE_ID_INTEL_82945G_HB),
  885. ID(PCI_DEVICE_ID_INTEL_82945GM_HB),
  886. ID(PCI_DEVICE_ID_INTEL_82945GME_HB),
  887. ID(PCI_DEVICE_ID_INTEL_PINEVIEW_M_HB),
  888. ID(PCI_DEVICE_ID_INTEL_PINEVIEW_HB),
  889. ID(PCI_DEVICE_ID_INTEL_82946GZ_HB),
  890. ID(PCI_DEVICE_ID_INTEL_82G35_HB),
  891. ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
  892. ID(PCI_DEVICE_ID_INTEL_82965G_HB),
  893. ID(PCI_DEVICE_ID_INTEL_82965GM_HB),
  894. ID(PCI_DEVICE_ID_INTEL_82965GME_HB),
  895. ID(PCI_DEVICE_ID_INTEL_G33_HB),
  896. ID(PCI_DEVICE_ID_INTEL_Q35_HB),
  897. ID(PCI_DEVICE_ID_INTEL_Q33_HB),
  898. ID(PCI_DEVICE_ID_INTEL_GM45_HB),
  899. ID(PCI_DEVICE_ID_INTEL_EAGLELAKE_HB),
  900. ID(PCI_DEVICE_ID_INTEL_Q45_HB),
  901. ID(PCI_DEVICE_ID_INTEL_G45_HB),
  902. ID(PCI_DEVICE_ID_INTEL_G41_HB),
  903. ID(PCI_DEVICE_ID_INTEL_B43_HB),
  904. ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB),
  905. ID(PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB),
  906. ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB),
  907. ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB),
  908. ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB),
  909. ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB),
  910. ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_HB),
  911. { }
  912. };
  913. MODULE_DEVICE_TABLE(pci, agp_intel_pci_table);
  914. static struct pci_driver agp_intel_pci_driver = {
  915. .name = "agpgart-intel",
  916. .id_table = agp_intel_pci_table,
  917. .probe = agp_intel_probe,
  918. .remove = __devexit_p(agp_intel_remove),
  919. #ifdef CONFIG_PM
  920. .resume = agp_intel_resume,
  921. #endif
  922. };
  923. static int __init agp_intel_init(void)
  924. {
  925. if (agp_off)
  926. return -EINVAL;
  927. return pci_register_driver(&agp_intel_pci_driver);
  928. }
  929. static void __exit agp_intel_cleanup(void)
  930. {
  931. pci_unregister_driver(&agp_intel_pci_driver);
  932. }
  933. module_init(agp_intel_init);
  934. module_exit(agp_intel_cleanup);
  935. MODULE_AUTHOR("Dave Jones <davej@redhat.com>");
  936. MODULE_LICENSE("GPL and additional rights");