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