xref: /openbmc/linux/drivers/char/agp/intel-agp.c (revision 4800cd83)
1 /*
2  * Intel AGPGART routines.
3  */
4 
5 #include <linux/module.h>
6 #include <linux/pci.h>
7 #include <linux/slab.h>
8 #include <linux/init.h>
9 #include <linux/kernel.h>
10 #include <linux/pagemap.h>
11 #include <linux/agp_backend.h>
12 #include <asm/smp.h>
13 #include "agp.h"
14 #include "intel-agp.h"
15 
16 int intel_agp_enabled;
17 EXPORT_SYMBOL(intel_agp_enabled);
18 
19 static 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 
39 static 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 
57 static 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 
65 static 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 
77 static 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 
84 static 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 
94 static 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 
106 static 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 
118 static 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 
148 static 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) {
158 		dev_emerg(&agp_bridge->dev->dev, "gatt bus addr too high");
159 		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 
189 static void intel_820_tlbflush(struct agp_memory *mem)
190 {
191 	return;
192 }
193 
194 static 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 
208 static 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 
239 static 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 
268 static 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 
279 	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 	}
288 
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 
303 static 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 
332 static 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 
361 static 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 
390 static 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 */
419 static const struct gatt_mask intel_generic_masks[] =
420 {
421 	{.mask = 0x00000017, .type = 0}
422 };
423 
424 static const struct aper_size_info_8 intel_815_sizes[2] =
425 {
426 	{64, 16384, 4, 0},
427 	{32, 8192, 3, 8},
428 };
429 
430 static const struct aper_size_info_8 intel_8xx_sizes[7] =
431 {
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 
441 static const struct aper_size_info_16 intel_generic_sizes[7] =
442 {
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 
452 static const struct aper_size_info_8 intel_830mp_sizes[4] =
453 {
454 	{256, 65536, 6, 0},
455 	{128, 32768, 5, 32},
456 	{64, 16384, 4, 48},
457 	{32, 8192, 3, 56}
458 };
459 
460 static const struct agp_bridge_driver intel_generic_driver = {
461 	.owner			= THIS_MODULE,
462 	.aperture_sizes		= intel_generic_sizes,
463 	.size_type		= U16_APER_SIZE,
464 	.num_aperture_sizes	= 7,
465 	.needs_scratch_page	= true,
466 	.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,
481 	.agp_alloc_pages        = agp_generic_alloc_pages,
482 	.agp_destroy_page	= agp_generic_destroy_page,
483 	.agp_destroy_pages      = agp_generic_destroy_pages,
484 	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
485 };
486 
487 static const struct agp_bridge_driver intel_815_driver = {
488 	.owner			= THIS_MODULE,
489 	.aperture_sizes		= intel_815_sizes,
490 	.size_type		= U8_APER_SIZE,
491 	.num_aperture_sizes	= 2,
492 	.needs_scratch_page	= true,
493 	.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,
508 	.agp_alloc_pages        = agp_generic_alloc_pages,
509 	.agp_destroy_page	= agp_generic_destroy_page,
510 	.agp_destroy_pages      = agp_generic_destroy_pages,
511 	.agp_type_to_mask_type	= agp_generic_type_to_mask_type,
512 };
513 
514 static const struct agp_bridge_driver intel_820_driver = {
515 	.owner			= THIS_MODULE,
516 	.aperture_sizes		= intel_8xx_sizes,
517 	.size_type		= U8_APER_SIZE,
518 	.num_aperture_sizes	= 7,
519 	.needs_scratch_page	= true,
520 	.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,
535 	.agp_alloc_pages        = agp_generic_alloc_pages,
536 	.agp_destroy_page	= agp_generic_destroy_page,
537 	.agp_destroy_pages      = agp_generic_destroy_pages,
538 	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
539 };
540 
541 static const struct agp_bridge_driver intel_830mp_driver = {
542 	.owner			= THIS_MODULE,
543 	.aperture_sizes		= intel_830mp_sizes,
544 	.size_type		= U8_APER_SIZE,
545 	.num_aperture_sizes	= 4,
546 	.needs_scratch_page	= true,
547 	.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,
562 	.agp_alloc_pages        = agp_generic_alloc_pages,
563 	.agp_destroy_page	= agp_generic_destroy_page,
564 	.agp_destroy_pages      = agp_generic_destroy_pages,
565 	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
566 };
567 
568 static const struct agp_bridge_driver intel_840_driver = {
569 	.owner			= THIS_MODULE,
570 	.aperture_sizes		= intel_8xx_sizes,
571 	.size_type		= U8_APER_SIZE,
572 	.num_aperture_sizes	= 7,
573 	.needs_scratch_page	= true,
574 	.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,
589 	.agp_alloc_pages        = agp_generic_alloc_pages,
590 	.agp_destroy_page	= agp_generic_destroy_page,
591 	.agp_destroy_pages      = agp_generic_destroy_pages,
592 	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
593 };
594 
595 static const struct agp_bridge_driver intel_845_driver = {
596 	.owner			= THIS_MODULE,
597 	.aperture_sizes		= intel_8xx_sizes,
598 	.size_type		= U8_APER_SIZE,
599 	.num_aperture_sizes	= 7,
600 	.needs_scratch_page	= true,
601 	.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,
616 	.agp_alloc_pages        = agp_generic_alloc_pages,
617 	.agp_destroy_page	= agp_generic_destroy_page,
618 	.agp_destroy_pages      = agp_generic_destroy_pages,
619 	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
620 };
621 
622 static const struct agp_bridge_driver intel_850_driver = {
623 	.owner			= THIS_MODULE,
624 	.aperture_sizes		= intel_8xx_sizes,
625 	.size_type		= U8_APER_SIZE,
626 	.num_aperture_sizes	= 7,
627 	.needs_scratch_page	= true,
628 	.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,
643 	.agp_alloc_pages        = agp_generic_alloc_pages,
644 	.agp_destroy_page	= agp_generic_destroy_page,
645 	.agp_destroy_pages      = agp_generic_destroy_pages,
646 	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
647 };
648 
649 static const struct agp_bridge_driver intel_860_driver = {
650 	.owner			= THIS_MODULE,
651 	.aperture_sizes		= intel_8xx_sizes,
652 	.size_type		= U8_APER_SIZE,
653 	.num_aperture_sizes	= 7,
654 	.needs_scratch_page	= true,
655 	.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,
670 	.agp_alloc_pages        = agp_generic_alloc_pages,
671 	.agp_destroy_page	= agp_generic_destroy_page,
672 	.agp_destroy_pages      = agp_generic_destroy_pages,
673 	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
674 };
675 
676 static const struct agp_bridge_driver intel_7505_driver = {
677 	.owner			= THIS_MODULE,
678 	.aperture_sizes		= intel_8xx_sizes,
679 	.size_type		= U8_APER_SIZE,
680 	.num_aperture_sizes	= 7,
681 	.needs_scratch_page	= true,
682 	.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,
697 	.agp_alloc_pages        = agp_generic_alloc_pages,
698 	.agp_destroy_page	= agp_generic_destroy_page,
699 	.agp_destroy_pages      = agp_generic_destroy_pages,
700 	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
701 };
702 
703 /* 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  */
707 static const struct intel_agp_driver_description {
708 	unsigned int chip_id;
709 	char *name;
710 	const struct agp_bridge_driver *driver;
711 } intel_agp_chipsets[] = {
712 	{ 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, "i845", &intel_845_driver },
721 	{ PCI_DEVICE_ID_INTEL_82845G_HB, "845G", &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 }
732 };
733 
734 static int __devinit agp_intel_probe(struct pci_dev *pdev,
735 				     const struct pci_device_id *ent)
736 {
737 	struct agp_bridge_data *bridge;
738 	u8 cap_ptr = 0;
739 	struct resource *r;
740 	int i, err;
741 
742 	cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP);
743 
744 	bridge = agp_alloc_bridge();
745 	if (!bridge)
746 		return -ENOMEM;
747 
748 	bridge->capndx = cap_ptr;
749 
750 	if (intel_gmch_probe(pdev, bridge))
751 		goto found_gmch;
752 
753 	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. */
757 		if (pdev->device == intel_agp_chipsets[i].chip_id) {
758 			bridge->driver = intel_agp_chipsets[i].driver;
759 			break;
760 		}
761 	}
762 
763 	if (!bridge->driver) {
764 		if (cap_ptr)
765 			dev_warn(&pdev->dev, "unsupported Intel chipset [%04x/%04x]\n",
766 				 pdev->vendor, pdev->device);
767 		agp_put_bridge(bridge);
768 		return -ENODEV;
769 	}
770 
771 	bridge->dev = pdev;
772 	bridge->dev_private_data = NULL;
773 
774 	dev_info(&pdev->dev, "Intel %s Chipset\n", intel_agp_chipsets[i].name);
775 
776 	/*
777 	* The following fixes the case where the BIOS has "forgotten" to
778 	* provide an address range for the GART.
779 	* 20030610 - hamish@zot.org
780 	* This happens before pci_enable_device() intentionally;
781 	* calling pci_enable_device() before assigning the resource
782 	* will result in the GART being disabled on machines with such
783 	* BIOSs (the GART ends up with a BAR starting at 0, which
784 	* conflicts a lot of other devices).
785 	*/
786 	r = &pdev->resource[0];
787 	if (!r->start && r->end) {
788 		if (pci_assign_resource(pdev, 0)) {
789 			dev_err(&pdev->dev, "can't assign resource 0\n");
790 			agp_put_bridge(bridge);
791 			return -ENODEV;
792 		}
793 	}
794 
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 	/* Fill in the mode register */
807 	if (cap_ptr) {
808 		pci_read_config_dword(pdev,
809 				bridge->capndx+PCI_AGP_STATUS,
810 				&bridge->mode);
811 	}
812 
813 found_gmch:
814 	pci_set_drvdata(pdev, bridge);
815 	err = agp_add_bridge(bridge);
816 	if (!err)
817 		intel_agp_enabled = 1;
818 	return err;
819 }
820 
821 static void __devexit agp_intel_remove(struct pci_dev *pdev)
822 {
823 	struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
824 
825 	agp_remove_bridge(bridge);
826 
827 	intel_gmch_remove(pdev);
828 
829 	agp_put_bridge(bridge);
830 }
831 
832 #ifdef CONFIG_PM
833 static int agp_intel_resume(struct pci_dev *pdev)
834 {
835 	struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
836 
837 	bridge->driver->configure();
838 
839 	return 0;
840 }
841 #endif
842 
843 static 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),
867 	ID(PCI_DEVICE_ID_INTEL_82854_HB),
868 	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),
875 	ID(PCI_DEVICE_ID_INTEL_E7221_HB),
876 	ID(PCI_DEVICE_ID_INTEL_82915G_HB),
877 	ID(PCI_DEVICE_ID_INTEL_82915GM_HB),
878 	ID(PCI_DEVICE_ID_INTEL_82945G_HB),
879 	ID(PCI_DEVICE_ID_INTEL_82945GM_HB),
880 	ID(PCI_DEVICE_ID_INTEL_82945GME_HB),
881 	ID(PCI_DEVICE_ID_INTEL_PINEVIEW_M_HB),
882 	ID(PCI_DEVICE_ID_INTEL_PINEVIEW_HB),
883 	ID(PCI_DEVICE_ID_INTEL_82946GZ_HB),
884 	ID(PCI_DEVICE_ID_INTEL_82G35_HB),
885 	ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
886 	ID(PCI_DEVICE_ID_INTEL_82965G_HB),
887 	ID(PCI_DEVICE_ID_INTEL_82965GM_HB),
888 	ID(PCI_DEVICE_ID_INTEL_82965GME_HB),
889 	ID(PCI_DEVICE_ID_INTEL_G33_HB),
890 	ID(PCI_DEVICE_ID_INTEL_Q35_HB),
891 	ID(PCI_DEVICE_ID_INTEL_Q33_HB),
892 	ID(PCI_DEVICE_ID_INTEL_GM45_HB),
893 	ID(PCI_DEVICE_ID_INTEL_EAGLELAKE_HB),
894 	ID(PCI_DEVICE_ID_INTEL_Q45_HB),
895 	ID(PCI_DEVICE_ID_INTEL_G45_HB),
896 	ID(PCI_DEVICE_ID_INTEL_G41_HB),
897 	ID(PCI_DEVICE_ID_INTEL_B43_HB),
898 	ID(PCI_DEVICE_ID_INTEL_B43_1_HB),
899 	ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB),
900 	ID(PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB),
901 	ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB),
902 	ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB),
903 	ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB),
904 	ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB),
905 	ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_HB),
906 	{ }
907 };
908 
909 MODULE_DEVICE_TABLE(pci, agp_intel_pci_table);
910 
911 static struct pci_driver agp_intel_pci_driver = {
912 	.name		= "agpgart-intel",
913 	.id_table	= agp_intel_pci_table,
914 	.probe		= agp_intel_probe,
915 	.remove		= __devexit_p(agp_intel_remove),
916 #ifdef CONFIG_PM
917 	.resume		= agp_intel_resume,
918 #endif
919 };
920 
921 static int __init agp_intel_init(void)
922 {
923 	if (agp_off)
924 		return -EINVAL;
925 	return pci_register_driver(&agp_intel_pci_driver);
926 }
927 
928 static void __exit agp_intel_cleanup(void)
929 {
930 	pci_unregister_driver(&agp_intel_pci_driver);
931 }
932 
933 module_init(agp_intel_init);
934 module_exit(agp_intel_cleanup);
935 
936 MODULE_AUTHOR("Dave Jones <davej@redhat.com>");
937 MODULE_LICENSE("GPL and additional rights");
938