blob: 5cd2221ab472a629da3429bea0aeb08f1f217382 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * Intel AGPGART routines.
3 */
4
Linus Torvalds1da177e2005-04-16 15:20:36 -07005#include <linux/module.h>
6#include <linux/pci.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +09007#include <linux/slab.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -07008#include <linux/init.h>
Ahmed S. Darwish1eaf1222007-02-06 18:08:28 +02009#include <linux/kernel.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070010#include <linux/pagemap.h>
11#include <linux/agp_backend.h>
Borislav Petkov48a719c2010-01-22 16:01:04 +010012#include <asm/smp.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070013#include "agp.h"
Daniel Vetterff7cdd62010-04-14 00:29:51 +020014#include "intel-agp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070015
Zhenyu Wang1f7a6e32010-02-23 14:05:24 +080016int intel_agp_enabled;
17EXPORT_SYMBOL(intel_agp_enabled);
18
Linus Torvalds1da177e2005-04-16 15:20:36 -070019static int intel_fetch_size(void)
20{
21 int i;
22 u16 temp;
23 struct aper_size_info_16 *values;
24
25 pci_read_config_word(agp_bridge->dev, INTEL_APSIZE, &temp);
26 values = A_SIZE_16(agp_bridge->driver->aperture_sizes);
27
28 for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) {
29 if (temp == values[i].size_value) {
30 agp_bridge->previous_size = agp_bridge->current_size = (void *) (values + i);
31 agp_bridge->aperture_size_idx = i;
32 return values[i].size;
33 }
34 }
35
36 return 0;
37}
38
39static int __intel_8xx_fetch_size(u8 temp)
40{
41 int i;
42 struct aper_size_info_8 *values;
43
44 values = A_SIZE_8(agp_bridge->driver->aperture_sizes);
45
46 for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) {
47 if (temp == values[i].size_value) {
48 agp_bridge->previous_size =
49 agp_bridge->current_size = (void *) (values + i);
50 agp_bridge->aperture_size_idx = i;
51 return values[i].size;
52 }
53 }
54 return 0;
55}
56
57static int intel_8xx_fetch_size(void)
58{
59 u8 temp;
60
61 pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp);
62 return __intel_8xx_fetch_size(temp);
63}
64
65static int intel_815_fetch_size(void)
66{
67 u8 temp;
68
69 /* Intel 815 chipsets have a _weird_ APSIZE register with only
70 * one non-reserved bit, so mask the others out ... */
71 pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp);
72 temp &= (1 << 3);
73
74 return __intel_8xx_fetch_size(temp);
75}
76
77static void intel_tlbflush(struct agp_memory *mem)
78{
79 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2200);
80 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280);
81}
82
83
84static void intel_8xx_tlbflush(struct agp_memory *mem)
85{
86 u32 temp;
87 pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp);
88 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp & ~(1 << 7));
89 pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp);
90 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp | (1 << 7));
91}
92
93
94static void intel_cleanup(void)
95{
96 u16 temp;
97 struct aper_size_info_16 *previous_size;
98
99 previous_size = A_SIZE_16(agp_bridge->previous_size);
100 pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp);
101 pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9));
102 pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value);
103}
104
105
106static void intel_8xx_cleanup(void)
107{
108 u16 temp;
109 struct aper_size_info_8 *previous_size;
110
111 previous_size = A_SIZE_8(agp_bridge->previous_size);
112 pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp);
113 pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9));
114 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value);
115}
116
117
118static int intel_configure(void)
119{
120 u32 temp;
121 u16 temp2;
122 struct aper_size_info_16 *current_size;
123
124 current_size = A_SIZE_16(agp_bridge->current_size);
125
126 /* aperture size */
127 pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
128
129 /* address to map to */
130 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
131 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
132
133 /* attbase - aperture base */
134 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
135
136 /* agpctrl */
137 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280);
138
139 /* paccfg/nbxcfg */
140 pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2);
141 pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG,
142 (temp2 & ~(1 << 10)) | (1 << 9));
143 /* clear any possible error conditions */
144 pci_write_config_byte(agp_bridge->dev, INTEL_ERRSTS + 1, 7);
145 return 0;
146}
147
148static int intel_815_configure(void)
149{
150 u32 temp, addr;
151 u8 temp2;
152 struct aper_size_info_8 *current_size;
153
154 /* attbase - aperture base */
155 /* the Intel 815 chipset spec. says that bits 29-31 in the
156 * ATTBASE register are reserved -> try not to write them */
157 if (agp_bridge->gatt_bus_addr & INTEL_815_ATTBASE_MASK) {
Bjorn Helgaase3cf6952008-07-30 12:26:51 -0700158 dev_emerg(&agp_bridge->dev->dev, "gatt bus addr too high");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700159 return -EINVAL;
160 }
161
162 current_size = A_SIZE_8(agp_bridge->current_size);
163
164 /* aperture size */
165 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE,
166 current_size->size_value);
167
168 /* address to map to */
169 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
170 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
171
172 pci_read_config_dword(agp_bridge->dev, INTEL_ATTBASE, &addr);
173 addr &= INTEL_815_ATTBASE_MASK;
174 addr |= agp_bridge->gatt_bus_addr;
175 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, addr);
176
177 /* agpctrl */
178 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
179
180 /* apcont */
181 pci_read_config_byte(agp_bridge->dev, INTEL_815_APCONT, &temp2);
182 pci_write_config_byte(agp_bridge->dev, INTEL_815_APCONT, temp2 | (1 << 1));
183
184 /* clear any possible error conditions */
185 /* Oddness : this chipset seems to have no ERRSTS register ! */
186 return 0;
187}
188
189static void intel_820_tlbflush(struct agp_memory *mem)
190{
191 return;
192}
193
194static void intel_820_cleanup(void)
195{
196 u8 temp;
197 struct aper_size_info_8 *previous_size;
198
199 previous_size = A_SIZE_8(agp_bridge->previous_size);
200 pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp);
201 pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR,
202 temp & ~(1 << 1));
203 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE,
204 previous_size->size_value);
205}
206
207
208static int intel_820_configure(void)
209{
210 u32 temp;
211 u8 temp2;
212 struct aper_size_info_8 *current_size;
213
214 current_size = A_SIZE_8(agp_bridge->current_size);
215
216 /* aperture size */
217 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
218
219 /* address to map to */
220 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
221 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
222
223 /* attbase - aperture base */
224 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
225
226 /* agpctrl */
227 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
228
229 /* global enable aperture access */
230 /* This flag is not accessed through MCHCFG register as in */
231 /* i850 chipset. */
232 pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp2);
233 pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR, temp2 | (1 << 1));
234 /* clear any possible AGP-related error conditions */
235 pci_write_config_word(agp_bridge->dev, INTEL_I820_ERRSTS, 0x001c);
236 return 0;
237}
238
239static int intel_840_configure(void)
240{
241 u32 temp;
242 u16 temp2;
243 struct aper_size_info_8 *current_size;
244
245 current_size = A_SIZE_8(agp_bridge->current_size);
246
247 /* aperture size */
248 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
249
250 /* address to map to */
251 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
252 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
253
254 /* attbase - aperture base */
255 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
256
257 /* agpctrl */
258 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
259
260 /* mcgcfg */
261 pci_read_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, &temp2);
262 pci_write_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, temp2 | (1 << 9));
263 /* clear any possible error conditions */
264 pci_write_config_word(agp_bridge->dev, INTEL_I840_ERRSTS, 0xc000);
265 return 0;
266}
267
268static int intel_845_configure(void)
269{
270 u32 temp;
271 u8 temp2;
272 struct aper_size_info_8 *current_size;
273
274 current_size = A_SIZE_8(agp_bridge->current_size);
275
276 /* aperture size */
277 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
278
Matthew Garrettb0825482005-07-29 14:03:39 -0700279 if (agp_bridge->apbase_config != 0) {
280 pci_write_config_dword(agp_bridge->dev, AGP_APBASE,
281 agp_bridge->apbase_config);
282 } else {
283 /* address to map to */
284 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
285 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
286 agp_bridge->apbase_config = temp;
287 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700288
289 /* attbase - aperture base */
290 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
291
292 /* agpctrl */
293 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
294
295 /* agpm */
296 pci_read_config_byte(agp_bridge->dev, INTEL_I845_AGPM, &temp2);
297 pci_write_config_byte(agp_bridge->dev, INTEL_I845_AGPM, temp2 | (1 << 1));
298 /* clear any possible error conditions */
299 pci_write_config_word(agp_bridge->dev, INTEL_I845_ERRSTS, 0x001c);
300 return 0;
301}
302
303static int intel_850_configure(void)
304{
305 u32 temp;
306 u16 temp2;
307 struct aper_size_info_8 *current_size;
308
309 current_size = A_SIZE_8(agp_bridge->current_size);
310
311 /* aperture size */
312 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
313
314 /* address to map to */
315 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
316 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
317
318 /* attbase - aperture base */
319 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
320
321 /* agpctrl */
322 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
323
324 /* mcgcfg */
325 pci_read_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, &temp2);
326 pci_write_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, temp2 | (1 << 9));
327 /* clear any possible AGP-related error conditions */
328 pci_write_config_word(agp_bridge->dev, INTEL_I850_ERRSTS, 0x001c);
329 return 0;
330}
331
332static int intel_860_configure(void)
333{
334 u32 temp;
335 u16 temp2;
336 struct aper_size_info_8 *current_size;
337
338 current_size = A_SIZE_8(agp_bridge->current_size);
339
340 /* aperture size */
341 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
342
343 /* address to map to */
344 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
345 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
346
347 /* attbase - aperture base */
348 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
349
350 /* agpctrl */
351 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
352
353 /* mcgcfg */
354 pci_read_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, &temp2);
355 pci_write_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, temp2 | (1 << 9));
356 /* clear any possible AGP-related error conditions */
357 pci_write_config_word(agp_bridge->dev, INTEL_I860_ERRSTS, 0xf700);
358 return 0;
359}
360
361static int intel_830mp_configure(void)
362{
363 u32 temp;
364 u16 temp2;
365 struct aper_size_info_8 *current_size;
366
367 current_size = A_SIZE_8(agp_bridge->current_size);
368
369 /* aperture size */
370 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
371
372 /* address to map to */
373 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
374 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
375
376 /* attbase - aperture base */
377 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
378
379 /* agpctrl */
380 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
381
382 /* gmch */
383 pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2);
384 pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp2 | (1 << 9));
385 /* clear any possible AGP-related error conditions */
386 pci_write_config_word(agp_bridge->dev, INTEL_I830_ERRSTS, 0x1c);
387 return 0;
388}
389
390static int intel_7505_configure(void)
391{
392 u32 temp;
393 u16 temp2;
394 struct aper_size_info_8 *current_size;
395
396 current_size = A_SIZE_8(agp_bridge->current_size);
397
398 /* aperture size */
399 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
400
401 /* address to map to */
402 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
403 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
404
405 /* attbase - aperture base */
406 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
407
408 /* agpctrl */
409 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
410
411 /* mchcfg */
412 pci_read_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, &temp2);
413 pci_write_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, temp2 | (1 << 9));
414
415 return 0;
416}
417
418/* Setup function */
Dave Jonese5524f32007-02-22 18:41:28 -0500419static const struct gatt_mask intel_generic_masks[] =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700420{
421 {.mask = 0x00000017, .type = 0}
422};
423
Dave Jonese5524f32007-02-22 18:41:28 -0500424static const struct aper_size_info_8 intel_815_sizes[2] =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700425{
426 {64, 16384, 4, 0},
427 {32, 8192, 3, 8},
428};
429
Dave Jonese5524f32007-02-22 18:41:28 -0500430static const struct aper_size_info_8 intel_8xx_sizes[7] =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700431{
432 {256, 65536, 6, 0},
433 {128, 32768, 5, 32},
434 {64, 16384, 4, 48},
435 {32, 8192, 3, 56},
436 {16, 4096, 2, 60},
437 {8, 2048, 1, 62},
438 {4, 1024, 0, 63}
439};
440
Dave Jonese5524f32007-02-22 18:41:28 -0500441static const struct aper_size_info_16 intel_generic_sizes[7] =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700442{
443 {256, 65536, 6, 0},
444 {128, 32768, 5, 32},
445 {64, 16384, 4, 48},
446 {32, 8192, 3, 56},
447 {16, 4096, 2, 60},
448 {8, 2048, 1, 62},
449 {4, 1024, 0, 63}
450};
451
Dave Jonese5524f32007-02-22 18:41:28 -0500452static const struct aper_size_info_8 intel_830mp_sizes[4] =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700453{
454 {256, 65536, 6, 0},
455 {128, 32768, 5, 32},
456 {64, 16384, 4, 48},
457 {32, 8192, 3, 56}
458};
459
Dave Jonese5524f32007-02-22 18:41:28 -0500460static const struct agp_bridge_driver intel_generic_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700461 .owner = THIS_MODULE,
462 .aperture_sizes = intel_generic_sizes,
463 .size_type = U16_APER_SIZE,
464 .num_aperture_sizes = 7,
Jerome Glisse61cf0592010-04-20 17:43:34 +0200465 .needs_scratch_page = true,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700466 .configure = intel_configure,
467 .fetch_size = intel_fetch_size,
468 .cleanup = intel_cleanup,
469 .tlb_flush = intel_tlbflush,
470 .mask_memory = agp_generic_mask_memory,
471 .masks = intel_generic_masks,
472 .agp_enable = agp_generic_enable,
473 .cache_flush = global_cache_flush,
474 .create_gatt_table = agp_generic_create_gatt_table,
475 .free_gatt_table = agp_generic_free_gatt_table,
476 .insert_memory = agp_generic_insert_memory,
477 .remove_memory = agp_generic_remove_memory,
478 .alloc_by_type = agp_generic_alloc_by_type,
479 .free_by_type = agp_generic_free_by_type,
480 .agp_alloc_page = agp_generic_alloc_page,
Shaohua Li37acee12008-08-21 10:46:11 +0800481 .agp_alloc_pages = agp_generic_alloc_pages,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700482 .agp_destroy_page = agp_generic_destroy_page,
Shaohua Libd079282008-08-21 10:46:17 +0800483 .agp_destroy_pages = agp_generic_destroy_pages,
Thomas Hellstroma030ce42007-01-23 10:33:43 +0100484 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700485};
486
Dave Jonese5524f32007-02-22 18:41:28 -0500487static const struct agp_bridge_driver intel_815_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700488 .owner = THIS_MODULE,
489 .aperture_sizes = intel_815_sizes,
490 .size_type = U8_APER_SIZE,
491 .num_aperture_sizes = 2,
Jerome Glisse61cf0592010-04-20 17:43:34 +0200492 .needs_scratch_page = true,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700493 .configure = intel_815_configure,
494 .fetch_size = intel_815_fetch_size,
495 .cleanup = intel_8xx_cleanup,
496 .tlb_flush = intel_8xx_tlbflush,
497 .mask_memory = agp_generic_mask_memory,
498 .masks = intel_generic_masks,
499 .agp_enable = agp_generic_enable,
500 .cache_flush = global_cache_flush,
501 .create_gatt_table = agp_generic_create_gatt_table,
502 .free_gatt_table = agp_generic_free_gatt_table,
503 .insert_memory = agp_generic_insert_memory,
504 .remove_memory = agp_generic_remove_memory,
505 .alloc_by_type = agp_generic_alloc_by_type,
506 .free_by_type = agp_generic_free_by_type,
507 .agp_alloc_page = agp_generic_alloc_page,
Shaohua Li37acee12008-08-21 10:46:11 +0800508 .agp_alloc_pages = agp_generic_alloc_pages,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700509 .agp_destroy_page = agp_generic_destroy_page,
Shaohua Libd079282008-08-21 10:46:17 +0800510 .agp_destroy_pages = agp_generic_destroy_pages,
Dave Airlie62c96b92008-06-19 14:27:53 +1000511 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700512};
513
Dave Jonese5524f32007-02-22 18:41:28 -0500514static const struct agp_bridge_driver intel_820_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700515 .owner = THIS_MODULE,
516 .aperture_sizes = intel_8xx_sizes,
517 .size_type = U8_APER_SIZE,
518 .num_aperture_sizes = 7,
Jerome Glisse61cf0592010-04-20 17:43:34 +0200519 .needs_scratch_page = true,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700520 .configure = intel_820_configure,
521 .fetch_size = intel_8xx_fetch_size,
522 .cleanup = intel_820_cleanup,
523 .tlb_flush = intel_820_tlbflush,
524 .mask_memory = agp_generic_mask_memory,
525 .masks = intel_generic_masks,
526 .agp_enable = agp_generic_enable,
527 .cache_flush = global_cache_flush,
528 .create_gatt_table = agp_generic_create_gatt_table,
529 .free_gatt_table = agp_generic_free_gatt_table,
530 .insert_memory = agp_generic_insert_memory,
531 .remove_memory = agp_generic_remove_memory,
532 .alloc_by_type = agp_generic_alloc_by_type,
533 .free_by_type = agp_generic_free_by_type,
534 .agp_alloc_page = agp_generic_alloc_page,
Shaohua Li37acee12008-08-21 10:46:11 +0800535 .agp_alloc_pages = agp_generic_alloc_pages,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700536 .agp_destroy_page = agp_generic_destroy_page,
Shaohua Libd079282008-08-21 10:46:17 +0800537 .agp_destroy_pages = agp_generic_destroy_pages,
Thomas Hellstroma030ce42007-01-23 10:33:43 +0100538 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539};
540
Dave Jonese5524f32007-02-22 18:41:28 -0500541static const struct agp_bridge_driver intel_830mp_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700542 .owner = THIS_MODULE,
543 .aperture_sizes = intel_830mp_sizes,
544 .size_type = U8_APER_SIZE,
545 .num_aperture_sizes = 4,
Jerome Glisse61cf0592010-04-20 17:43:34 +0200546 .needs_scratch_page = true,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547 .configure = intel_830mp_configure,
548 .fetch_size = intel_8xx_fetch_size,
549 .cleanup = intel_8xx_cleanup,
550 .tlb_flush = intel_8xx_tlbflush,
551 .mask_memory = agp_generic_mask_memory,
552 .masks = intel_generic_masks,
553 .agp_enable = agp_generic_enable,
554 .cache_flush = global_cache_flush,
555 .create_gatt_table = agp_generic_create_gatt_table,
556 .free_gatt_table = agp_generic_free_gatt_table,
557 .insert_memory = agp_generic_insert_memory,
558 .remove_memory = agp_generic_remove_memory,
559 .alloc_by_type = agp_generic_alloc_by_type,
560 .free_by_type = agp_generic_free_by_type,
561 .agp_alloc_page = agp_generic_alloc_page,
Shaohua Li37acee12008-08-21 10:46:11 +0800562 .agp_alloc_pages = agp_generic_alloc_pages,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700563 .agp_destroy_page = agp_generic_destroy_page,
Shaohua Libd079282008-08-21 10:46:17 +0800564 .agp_destroy_pages = agp_generic_destroy_pages,
Thomas Hellstroma030ce42007-01-23 10:33:43 +0100565 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700566};
567
Dave Jonese5524f32007-02-22 18:41:28 -0500568static const struct agp_bridge_driver intel_840_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700569 .owner = THIS_MODULE,
570 .aperture_sizes = intel_8xx_sizes,
571 .size_type = U8_APER_SIZE,
572 .num_aperture_sizes = 7,
Jerome Glisse61cf0592010-04-20 17:43:34 +0200573 .needs_scratch_page = true,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700574 .configure = intel_840_configure,
575 .fetch_size = intel_8xx_fetch_size,
576 .cleanup = intel_8xx_cleanup,
577 .tlb_flush = intel_8xx_tlbflush,
578 .mask_memory = agp_generic_mask_memory,
579 .masks = intel_generic_masks,
580 .agp_enable = agp_generic_enable,
581 .cache_flush = global_cache_flush,
582 .create_gatt_table = agp_generic_create_gatt_table,
583 .free_gatt_table = agp_generic_free_gatt_table,
584 .insert_memory = agp_generic_insert_memory,
585 .remove_memory = agp_generic_remove_memory,
586 .alloc_by_type = agp_generic_alloc_by_type,
587 .free_by_type = agp_generic_free_by_type,
588 .agp_alloc_page = agp_generic_alloc_page,
Shaohua Li37acee12008-08-21 10:46:11 +0800589 .agp_alloc_pages = agp_generic_alloc_pages,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700590 .agp_destroy_page = agp_generic_destroy_page,
Shaohua Libd079282008-08-21 10:46:17 +0800591 .agp_destroy_pages = agp_generic_destroy_pages,
Thomas Hellstroma030ce42007-01-23 10:33:43 +0100592 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700593};
594
Dave Jonese5524f32007-02-22 18:41:28 -0500595static const struct agp_bridge_driver intel_845_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700596 .owner = THIS_MODULE,
597 .aperture_sizes = intel_8xx_sizes,
598 .size_type = U8_APER_SIZE,
599 .num_aperture_sizes = 7,
Jerome Glisse61cf0592010-04-20 17:43:34 +0200600 .needs_scratch_page = true,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700601 .configure = intel_845_configure,
602 .fetch_size = intel_8xx_fetch_size,
603 .cleanup = intel_8xx_cleanup,
604 .tlb_flush = intel_8xx_tlbflush,
605 .mask_memory = agp_generic_mask_memory,
606 .masks = intel_generic_masks,
607 .agp_enable = agp_generic_enable,
608 .cache_flush = global_cache_flush,
609 .create_gatt_table = agp_generic_create_gatt_table,
610 .free_gatt_table = agp_generic_free_gatt_table,
611 .insert_memory = agp_generic_insert_memory,
612 .remove_memory = agp_generic_remove_memory,
613 .alloc_by_type = agp_generic_alloc_by_type,
614 .free_by_type = agp_generic_free_by_type,
615 .agp_alloc_page = agp_generic_alloc_page,
Shaohua Li37acee12008-08-21 10:46:11 +0800616 .agp_alloc_pages = agp_generic_alloc_pages,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700617 .agp_destroy_page = agp_generic_destroy_page,
Shaohua Libd079282008-08-21 10:46:17 +0800618 .agp_destroy_pages = agp_generic_destroy_pages,
Thomas Hellstroma030ce42007-01-23 10:33:43 +0100619 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700620};
621
Dave Jonese5524f32007-02-22 18:41:28 -0500622static const struct agp_bridge_driver intel_850_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700623 .owner = THIS_MODULE,
624 .aperture_sizes = intel_8xx_sizes,
625 .size_type = U8_APER_SIZE,
626 .num_aperture_sizes = 7,
Jerome Glisse61cf0592010-04-20 17:43:34 +0200627 .needs_scratch_page = true,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700628 .configure = intel_850_configure,
629 .fetch_size = intel_8xx_fetch_size,
630 .cleanup = intel_8xx_cleanup,
631 .tlb_flush = intel_8xx_tlbflush,
632 .mask_memory = agp_generic_mask_memory,
633 .masks = intel_generic_masks,
634 .agp_enable = agp_generic_enable,
635 .cache_flush = global_cache_flush,
636 .create_gatt_table = agp_generic_create_gatt_table,
637 .free_gatt_table = agp_generic_free_gatt_table,
638 .insert_memory = agp_generic_insert_memory,
639 .remove_memory = agp_generic_remove_memory,
640 .alloc_by_type = agp_generic_alloc_by_type,
641 .free_by_type = agp_generic_free_by_type,
642 .agp_alloc_page = agp_generic_alloc_page,
Shaohua Li37acee12008-08-21 10:46:11 +0800643 .agp_alloc_pages = agp_generic_alloc_pages,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700644 .agp_destroy_page = agp_generic_destroy_page,
Shaohua Libd079282008-08-21 10:46:17 +0800645 .agp_destroy_pages = agp_generic_destroy_pages,
Thomas Hellstroma030ce42007-01-23 10:33:43 +0100646 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700647};
648
Dave Jonese5524f32007-02-22 18:41:28 -0500649static const struct agp_bridge_driver intel_860_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700650 .owner = THIS_MODULE,
651 .aperture_sizes = intel_8xx_sizes,
652 .size_type = U8_APER_SIZE,
653 .num_aperture_sizes = 7,
Jerome Glisse61cf0592010-04-20 17:43:34 +0200654 .needs_scratch_page = true,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700655 .configure = intel_860_configure,
656 .fetch_size = intel_8xx_fetch_size,
657 .cleanup = intel_8xx_cleanup,
658 .tlb_flush = intel_8xx_tlbflush,
659 .mask_memory = agp_generic_mask_memory,
660 .masks = intel_generic_masks,
661 .agp_enable = agp_generic_enable,
662 .cache_flush = global_cache_flush,
663 .create_gatt_table = agp_generic_create_gatt_table,
664 .free_gatt_table = agp_generic_free_gatt_table,
665 .insert_memory = agp_generic_insert_memory,
666 .remove_memory = agp_generic_remove_memory,
667 .alloc_by_type = agp_generic_alloc_by_type,
668 .free_by_type = agp_generic_free_by_type,
669 .agp_alloc_page = agp_generic_alloc_page,
Shaohua Li37acee12008-08-21 10:46:11 +0800670 .agp_alloc_pages = agp_generic_alloc_pages,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700671 .agp_destroy_page = agp_generic_destroy_page,
Shaohua Libd079282008-08-21 10:46:17 +0800672 .agp_destroy_pages = agp_generic_destroy_pages,
Thomas Hellstroma030ce42007-01-23 10:33:43 +0100673 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700674};
675
Dave Jonese5524f32007-02-22 18:41:28 -0500676static const struct agp_bridge_driver intel_7505_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700677 .owner = THIS_MODULE,
678 .aperture_sizes = intel_8xx_sizes,
679 .size_type = U8_APER_SIZE,
680 .num_aperture_sizes = 7,
Jerome Glisse61cf0592010-04-20 17:43:34 +0200681 .needs_scratch_page = true,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700682 .configure = intel_7505_configure,
683 .fetch_size = intel_8xx_fetch_size,
684 .cleanup = intel_8xx_cleanup,
685 .tlb_flush = intel_8xx_tlbflush,
686 .mask_memory = agp_generic_mask_memory,
687 .masks = intel_generic_masks,
688 .agp_enable = agp_generic_enable,
689 .cache_flush = global_cache_flush,
690 .create_gatt_table = agp_generic_create_gatt_table,
691 .free_gatt_table = agp_generic_free_gatt_table,
692 .insert_memory = agp_generic_insert_memory,
693 .remove_memory = agp_generic_remove_memory,
694 .alloc_by_type = agp_generic_alloc_by_type,
695 .free_by_type = agp_generic_free_by_type,
696 .agp_alloc_page = agp_generic_alloc_page,
Shaohua Li37acee12008-08-21 10:46:11 +0800697 .agp_alloc_pages = agp_generic_alloc_pages,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700698 .agp_destroy_page = agp_generic_destroy_page,
Shaohua Libd079282008-08-21 10:46:17 +0800699 .agp_destroy_pages = agp_generic_destroy_pages,
Thomas Hellstroma030ce42007-01-23 10:33:43 +0100700 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700701};
702
Wang Zhenyu9614ece2007-05-30 09:45:58 +0800703/* Table to describe Intel GMCH and AGP/PCIE GART drivers. At least one of
704 * driver and gmch_driver must be non-null, and find_gmch will determine
705 * which one should be used if a gmch_chip_id is present.
706 */
Daniel Vetter02c026c2010-08-24 19:39:48 +0200707static const struct intel_agp_driver_description {
Wang Zhenyu9614ece2007-05-30 09:45:58 +0800708 unsigned int chip_id;
Wang Zhenyu9614ece2007-05-30 09:45:58 +0800709 char *name;
710 const struct agp_bridge_driver *driver;
Wang Zhenyu9614ece2007-05-30 09:45:58 +0800711} intel_agp_chipsets[] = {
Daniel Vetter02c026c2010-08-24 19:39:48 +0200712 { PCI_DEVICE_ID_INTEL_82443LX_0, "440LX", &intel_generic_driver },
713 { PCI_DEVICE_ID_INTEL_82443BX_0, "440BX", &intel_generic_driver },
714 { PCI_DEVICE_ID_INTEL_82443GX_0, "440GX", &intel_generic_driver },
715 { PCI_DEVICE_ID_INTEL_82815_MC, "i815", &intel_815_driver },
716 { PCI_DEVICE_ID_INTEL_82820_HB, "i820", &intel_820_driver },
717 { PCI_DEVICE_ID_INTEL_82820_UP_HB, "i820", &intel_820_driver },
718 { PCI_DEVICE_ID_INTEL_82830_HB, "830M", &intel_830mp_driver },
719 { PCI_DEVICE_ID_INTEL_82840_HB, "i840", &intel_840_driver },
720 { PCI_DEVICE_ID_INTEL_82845_HB, "845G", &intel_845_driver },
721 { PCI_DEVICE_ID_INTEL_82845G_HB, "830M", &intel_845_driver },
722 { PCI_DEVICE_ID_INTEL_82850_HB, "i850", &intel_850_driver },
723 { PCI_DEVICE_ID_INTEL_82854_HB, "854", &intel_845_driver },
724 { PCI_DEVICE_ID_INTEL_82855PM_HB, "855PM", &intel_845_driver },
725 { PCI_DEVICE_ID_INTEL_82855GM_HB, "855GM", &intel_845_driver },
726 { PCI_DEVICE_ID_INTEL_82860_HB, "i860", &intel_860_driver },
727 { PCI_DEVICE_ID_INTEL_82865_HB, "865", &intel_845_driver },
728 { PCI_DEVICE_ID_INTEL_82875_HB, "i875", &intel_845_driver },
729 { PCI_DEVICE_ID_INTEL_7505_0, "E7505", &intel_7505_driver },
730 { PCI_DEVICE_ID_INTEL_7205_0, "E7205", &intel_7505_driver },
731 { 0, NULL, NULL }
Wang Zhenyu9614ece2007-05-30 09:45:58 +0800732};
733
Linus Torvalds1da177e2005-04-16 15:20:36 -0700734static int __devinit agp_intel_probe(struct pci_dev *pdev,
735 const struct pci_device_id *ent)
736{
737 struct agp_bridge_data *bridge;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700738 u8 cap_ptr = 0;
739 struct resource *r;
Zhenyu Wang1f7a6e32010-02-23 14:05:24 +0800740 int i, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700741
742 cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP);
743
744 bridge = agp_alloc_bridge();
745 if (!bridge)
746 return -ENOMEM;
747
Daniel Vetter22dd82a2010-04-14 00:29:55 +0200748 bridge->capndx = cap_ptr;
749
750 if (intel_gmch_probe(pdev, bridge))
751 goto found_gmch;
752
Wang Zhenyu9614ece2007-05-30 09:45:58 +0800753 for (i = 0; intel_agp_chipsets[i].name != NULL; i++) {
754 /* In case that multiple models of gfx chip may
755 stand on same host bridge type, this can be
756 sure we detect the right IGD. */
Wang Zhenyu88889852007-06-14 10:01:04 +0800757 if (pdev->device == intel_agp_chipsets[i].chip_id) {
Daniel Vetter22dd82a2010-04-14 00:29:55 +0200758 bridge->driver = intel_agp_chipsets[i].driver;
759 break;
Wang Zhenyu88889852007-06-14 10:01:04 +0800760 }
Wang Zhenyu9614ece2007-05-30 09:45:58 +0800761 }
762
Daniel Vetter02c026c2010-08-24 19:39:48 +0200763 if (!bridge->driver) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700764 if (cap_ptr)
Bjorn Helgaase3cf6952008-07-30 12:26:51 -0700765 dev_warn(&pdev->dev, "unsupported Intel chipset [%04x/%04x]\n",
766 pdev->vendor, pdev->device);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700767 agp_put_bridge(bridge);
768 return -ENODEV;
Wang Zhenyu9614ece2007-05-30 09:45:58 +0800769 }
770
Linus Torvalds1da177e2005-04-16 15:20:36 -0700771 bridge->dev = pdev;
Daniel Vetter22dd82a2010-04-14 00:29:55 +0200772 bridge->dev_private_data = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700773
Bjorn Helgaase3cf6952008-07-30 12:26:51 -0700774 dev_info(&pdev->dev, "Intel %s Chipset\n", intel_agp_chipsets[i].name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775
776 /*
Kulikov Vasiliy96576a92010-08-03 19:42:34 +0400777 * If the device has not been properly setup, the following will catch
778 * the problem and should stop the system from crashing.
779 * 20030610 - hamish@zot.org
780 */
781 if (pci_enable_device(pdev)) {
782 dev_err(&pdev->dev, "can't enable PCI device\n");
783 agp_put_bridge(bridge);
784 return -ENODEV;
785 }
786
787 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788 * The following fixes the case where the BIOS has "forgotten" to
789 * provide an address range for the GART.
790 * 20030610 - hamish@zot.org
791 */
792 r = &pdev->resource[0];
793 if (!r->start && r->end) {
Dave Jones6a92a4e2006-02-28 00:54:25 -0500794 if (pci_assign_resource(pdev, 0)) {
Bjorn Helgaase3cf6952008-07-30 12:26:51 -0700795 dev_err(&pdev->dev, "can't assign resource 0\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700796 agp_put_bridge(bridge);
797 return -ENODEV;
798 }
799 }
800
Linus Torvalds1da177e2005-04-16 15:20:36 -0700801 /* Fill in the mode register */
802 if (cap_ptr) {
803 pci_read_config_dword(pdev,
804 bridge->capndx+PCI_AGP_STATUS,
805 &bridge->mode);
806 }
807
Daniel Vetter22dd82a2010-04-14 00:29:55 +0200808found_gmch:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700809 pci_set_drvdata(pdev, bridge);
Zhenyu Wang1f7a6e32010-02-23 14:05:24 +0800810 err = agp_add_bridge(bridge);
811 if (!err)
812 intel_agp_enabled = 1;
813 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700814}
815
816static void __devexit agp_intel_remove(struct pci_dev *pdev)
817{
818 struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
819
820 agp_remove_bridge(bridge);
821
Daniel Vetter02c026c2010-08-24 19:39:48 +0200822 intel_gmch_remove(pdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700823
824 agp_put_bridge(bridge);
825}
826
Alexey Dobriyan85be7d62006-08-12 02:02:02 +0400827#ifdef CONFIG_PM
Linus Torvalds1da177e2005-04-16 15:20:36 -0700828static int agp_intel_resume(struct pci_dev *pdev)
829{
830 struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
Keith Packarda8c84df2008-07-31 15:48:07 +1000831 int ret_val;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700832
Daniel Vettere5a04d52010-04-14 00:29:53 +0200833 bridge->driver->configure();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700834
Keith Packarda8c84df2008-07-31 15:48:07 +1000835 ret_val = agp_rebind_memory();
836 if (ret_val != 0)
837 return ret_val;
838
Linus Torvalds1da177e2005-04-16 15:20:36 -0700839 return 0;
840}
Alexey Dobriyan85be7d62006-08-12 02:02:02 +0400841#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700842
843static struct pci_device_id agp_intel_pci_table[] = {
844#define ID(x) \
845 { \
846 .class = (PCI_CLASS_BRIDGE_HOST << 8), \
847 .class_mask = ~0, \
848 .vendor = PCI_VENDOR_ID_INTEL, \
849 .device = x, \
850 .subvendor = PCI_ANY_ID, \
851 .subdevice = PCI_ANY_ID, \
852 }
853 ID(PCI_DEVICE_ID_INTEL_82443LX_0),
854 ID(PCI_DEVICE_ID_INTEL_82443BX_0),
855 ID(PCI_DEVICE_ID_INTEL_82443GX_0),
856 ID(PCI_DEVICE_ID_INTEL_82810_MC1),
857 ID(PCI_DEVICE_ID_INTEL_82810_MC3),
858 ID(PCI_DEVICE_ID_INTEL_82810E_MC),
859 ID(PCI_DEVICE_ID_INTEL_82815_MC),
860 ID(PCI_DEVICE_ID_INTEL_82820_HB),
861 ID(PCI_DEVICE_ID_INTEL_82820_UP_HB),
862 ID(PCI_DEVICE_ID_INTEL_82830_HB),
863 ID(PCI_DEVICE_ID_INTEL_82840_HB),
864 ID(PCI_DEVICE_ID_INTEL_82845_HB),
865 ID(PCI_DEVICE_ID_INTEL_82845G_HB),
866 ID(PCI_DEVICE_ID_INTEL_82850_HB),
Stefan Husemann347486b2009-04-13 14:40:10 -0700867 ID(PCI_DEVICE_ID_INTEL_82854_HB),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700868 ID(PCI_DEVICE_ID_INTEL_82855PM_HB),
869 ID(PCI_DEVICE_ID_INTEL_82855GM_HB),
870 ID(PCI_DEVICE_ID_INTEL_82860_HB),
871 ID(PCI_DEVICE_ID_INTEL_82865_HB),
872 ID(PCI_DEVICE_ID_INTEL_82875_HB),
873 ID(PCI_DEVICE_ID_INTEL_7505_0),
874 ID(PCI_DEVICE_ID_INTEL_7205_0),
Carlos Martíne914a362008-01-24 10:34:09 +1000875 ID(PCI_DEVICE_ID_INTEL_E7221_HB),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700876 ID(PCI_DEVICE_ID_INTEL_82915G_HB),
877 ID(PCI_DEVICE_ID_INTEL_82915GM_HB),
Alan Hourihaned0de98f2005-05-31 19:50:49 +0100878 ID(PCI_DEVICE_ID_INTEL_82945G_HB),
Alan Hourihane3b0e8ea2006-01-19 14:08:40 +0000879 ID(PCI_DEVICE_ID_INTEL_82945GM_HB),
Zhenyu Wangdde47872007-07-26 09:18:09 +0800880 ID(PCI_DEVICE_ID_INTEL_82945GME_HB),
Adam Jackson107f5172009-12-03 17:14:41 -0500881 ID(PCI_DEVICE_ID_INTEL_PINEVIEW_M_HB),
882 ID(PCI_DEVICE_ID_INTEL_PINEVIEW_HB),
Eric Anholt65c25aa2006-09-06 11:57:18 -0400883 ID(PCI_DEVICE_ID_INTEL_82946GZ_HB),
Zhenyu Wang9119f852008-01-23 15:49:26 +1000884 ID(PCI_DEVICE_ID_INTEL_82G35_HB),
Eric Anholt65c25aa2006-09-06 11:57:18 -0400885 ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
886 ID(PCI_DEVICE_ID_INTEL_82965G_HB),
Wang Zhenyu4598af32007-04-09 08:51:36 +0800887 ID(PCI_DEVICE_ID_INTEL_82965GM_HB),
Zhenyu Wangdde47872007-07-26 09:18:09 +0800888 ID(PCI_DEVICE_ID_INTEL_82965GME_HB),
Wang Zhenyu874808c62007-06-06 11:16:25 +0800889 ID(PCI_DEVICE_ID_INTEL_G33_HB),
890 ID(PCI_DEVICE_ID_INTEL_Q35_HB),
891 ID(PCI_DEVICE_ID_INTEL_Q33_HB),
Zhenyu Wang99d32bd2008-07-30 12:26:50 -0700892 ID(PCI_DEVICE_ID_INTEL_GM45_HB),
Adam Jackson107f5172009-12-03 17:14:41 -0500893 ID(PCI_DEVICE_ID_INTEL_EAGLELAKE_HB),
Zhenyu Wang25ce77a2008-06-19 14:17:58 +1000894 ID(PCI_DEVICE_ID_INTEL_Q45_HB),
895 ID(PCI_DEVICE_ID_INTEL_G45_HB),
Zhenyu Wanga50ccc62008-11-17 14:39:00 +0800896 ID(PCI_DEVICE_ID_INTEL_G41_HB),
Fabian Henze38d8a952009-09-08 00:59:58 +0800897 ID(PCI_DEVICE_ID_INTEL_B43_HB),
Adam Jackson107f5172009-12-03 17:14:41 -0500898 ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB),
899 ID(PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB),
900 ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB),
Dave Airlie3ff99162009-12-08 14:03:47 +1000901 ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB),
Eric Anholt1089e302009-10-22 16:10:52 -0700902 ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB),
Eric Anholt954bce52010-01-07 16:21:46 -0800903 ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB),
Zhenyu Wang85540482010-09-07 13:45:32 +0800904 ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_HB),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700905 { }
906};
907
908MODULE_DEVICE_TABLE(pci, agp_intel_pci_table);
909
910static struct pci_driver agp_intel_pci_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700911 .name = "agpgart-intel",
912 .id_table = agp_intel_pci_table,
913 .probe = agp_intel_probe,
914 .remove = __devexit_p(agp_intel_remove),
Alexey Dobriyan85be7d62006-08-12 02:02:02 +0400915#ifdef CONFIG_PM
Linus Torvalds1da177e2005-04-16 15:20:36 -0700916 .resume = agp_intel_resume,
Alexey Dobriyan85be7d62006-08-12 02:02:02 +0400917#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700918};
919
920static int __init agp_intel_init(void)
921{
922 if (agp_off)
923 return -EINVAL;
924 return pci_register_driver(&agp_intel_pci_driver);
925}
926
927static void __exit agp_intel_cleanup(void)
928{
929 pci_unregister_driver(&agp_intel_pci_driver);
930}
931
932module_init(agp_intel_init);
933module_exit(agp_intel_cleanup);
934
Dave Jonesf4432c52008-10-20 13:31:45 -0400935MODULE_AUTHOR("Dave Jones <davej@redhat.com>");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700936MODULE_LICENSE("GPL and additional rights");