xref: /linux/drivers/char/agp/intel-agp.c (revision 9ce7677cfd7cd871adb457c80bea3b581b839641)
1 /*
2  * Intel AGPGART routines.
3  */
4 
5 /*
6  * Intel(R) 855GM/852GM and 865G support added by David Dawes
7  * <dawes@tungstengraphics.com>.
8  *
9  * Intel(R) 915G/915GM support added by Alan Hourihane
10  * <alanh@tungstengraphics.com>.
11  */
12 
13 #include <linux/module.h>
14 #include <linux/pci.h>
15 #include <linux/init.h>
16 #include <linux/pagemap.h>
17 #include <linux/agp_backend.h>
18 #include "agp.h"
19 
20 /* Intel 815 register */
21 #define INTEL_815_APCONT	0x51
22 #define INTEL_815_ATTBASE_MASK	~0x1FFFFFFF
23 
24 /* Intel i820 registers */
25 #define INTEL_I820_RDCR		0x51
26 #define INTEL_I820_ERRSTS	0xc8
27 
28 /* Intel i840 registers */
29 #define INTEL_I840_MCHCFG	0x50
30 #define INTEL_I840_ERRSTS	0xc8
31 
32 /* Intel i850 registers */
33 #define INTEL_I850_MCHCFG	0x50
34 #define INTEL_I850_ERRSTS	0xc8
35 
36 /* intel 915G registers */
37 #define I915_GMADDR	0x18
38 #define I915_MMADDR	0x10
39 #define I915_PTEADDR	0x1C
40 #define I915_GMCH_GMS_STOLEN_48M	(0x6 << 4)
41 #define I915_GMCH_GMS_STOLEN_64M	(0x7 << 4)
42 
43 
44 /* Intel 7505 registers */
45 #define INTEL_I7505_APSIZE	0x74
46 #define INTEL_I7505_NCAPID	0x60
47 #define INTEL_I7505_NISTAT	0x6c
48 #define INTEL_I7505_ATTBASE	0x78
49 #define INTEL_I7505_ERRSTS	0x42
50 #define INTEL_I7505_AGPCTRL	0x70
51 #define INTEL_I7505_MCHCFG	0x50
52 
53 static struct aper_size_info_fixed intel_i810_sizes[] =
54 {
55 	{64, 16384, 4},
56 	/* The 32M mode still requires a 64k gatt */
57 	{32, 8192, 4}
58 };
59 
60 #define AGP_DCACHE_MEMORY	1
61 #define AGP_PHYS_MEMORY		2
62 
63 static struct gatt_mask intel_i810_masks[] =
64 {
65 	{.mask = I810_PTE_VALID, .type = 0},
66 	{.mask = (I810_PTE_VALID | I810_PTE_LOCAL), .type = AGP_DCACHE_MEMORY},
67 	{.mask = I810_PTE_VALID, .type = 0}
68 };
69 
70 static struct _intel_i810_private {
71 	struct pci_dev *i810_dev;	/* device one */
72 	volatile u8 __iomem *registers;
73 	int num_dcache_entries;
74 } intel_i810_private;
75 
76 static int intel_i810_fetch_size(void)
77 {
78 	u32 smram_miscc;
79 	struct aper_size_info_fixed *values;
80 
81 	pci_read_config_dword(agp_bridge->dev, I810_SMRAM_MISCC, &smram_miscc);
82 	values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes);
83 
84 	if ((smram_miscc & I810_GMS) == I810_GMS_DISABLE) {
85 		printk(KERN_WARNING PFX "i810 is disabled\n");
86 		return 0;
87 	}
88 	if ((smram_miscc & I810_GFX_MEM_WIN_SIZE) == I810_GFX_MEM_WIN_32M) {
89 		agp_bridge->previous_size =
90 			agp_bridge->current_size = (void *) (values + 1);
91 		agp_bridge->aperture_size_idx = 1;
92 		return values[1].size;
93 	} else {
94 		agp_bridge->previous_size =
95 			agp_bridge->current_size = (void *) (values);
96 		agp_bridge->aperture_size_idx = 0;
97 		return values[0].size;
98 	}
99 
100 	return 0;
101 }
102 
103 static int intel_i810_configure(void)
104 {
105 	struct aper_size_info_fixed *current_size;
106 	u32 temp;
107 	int i;
108 
109 	current_size = A_SIZE_FIX(agp_bridge->current_size);
110 
111 	pci_read_config_dword(intel_i810_private.i810_dev, I810_MMADDR, &temp);
112 	temp &= 0xfff80000;
113 
114 	intel_i810_private.registers = ioremap(temp, 128 * 4096);
115 	if (!intel_i810_private.registers) {
116 		printk(KERN_ERR PFX "Unable to remap memory.\n");
117 		return -ENOMEM;
118 	}
119 
120 	if ((readl(intel_i810_private.registers+I810_DRAM_CTL)
121 		& I810_DRAM_ROW_0) == I810_DRAM_ROW_0_SDRAM) {
122 		/* This will need to be dynamically assigned */
123 		printk(KERN_INFO PFX "detected 4MB dedicated video ram.\n");
124 		intel_i810_private.num_dcache_entries = 1024;
125 	}
126 	pci_read_config_dword(intel_i810_private.i810_dev, I810_GMADDR, &temp);
127 	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
128 	writel(agp_bridge->gatt_bus_addr | I810_PGETBL_ENABLED, intel_i810_private.registers+I810_PGETBL_CTL);
129 	readl(intel_i810_private.registers+I810_PGETBL_CTL);	/* PCI Posting. */
130 
131 	if (agp_bridge->driver->needs_scratch_page) {
132 		for (i = 0; i < current_size->num_entries; i++) {
133 			writel(agp_bridge->scratch_page, intel_i810_private.registers+I810_PTE_BASE+(i*4));
134 			readl(intel_i810_private.registers+I810_PTE_BASE+(i*4));	/* PCI posting. */
135 		}
136 	}
137 	global_cache_flush();
138 	return 0;
139 }
140 
141 static void intel_i810_cleanup(void)
142 {
143 	writel(0, intel_i810_private.registers+I810_PGETBL_CTL);
144 	readl(intel_i810_private.registers);	/* PCI Posting. */
145 	iounmap(intel_i810_private.registers);
146 }
147 
148 static void intel_i810_tlbflush(struct agp_memory *mem)
149 {
150 	return;
151 }
152 
153 static void intel_i810_agp_enable(struct agp_bridge_data *bridge, u32 mode)
154 {
155 	return;
156 }
157 
158 /* Exists to support ARGB cursors */
159 static void *i8xx_alloc_pages(void)
160 {
161 	struct page * page;
162 
163 	page = alloc_pages(GFP_KERNEL, 2);
164 	if (page == NULL)
165 		return NULL;
166 
167 	if (change_page_attr(page, 4, PAGE_KERNEL_NOCACHE) < 0) {
168 		global_flush_tlb();
169 		__free_page(page);
170 		return NULL;
171 	}
172 	global_flush_tlb();
173 	get_page(page);
174 	SetPageLocked(page);
175 	atomic_inc(&agp_bridge->current_memory_agp);
176 	return page_address(page);
177 }
178 
179 static void i8xx_destroy_pages(void *addr)
180 {
181 	struct page *page;
182 
183 	if (addr == NULL)
184 		return;
185 
186 	page = virt_to_page(addr);
187 	change_page_attr(page, 4, PAGE_KERNEL);
188 	global_flush_tlb();
189 	put_page(page);
190 	unlock_page(page);
191 	free_pages((unsigned long)addr, 2);
192 	atomic_dec(&agp_bridge->current_memory_agp);
193 }
194 
195 static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start,
196 				int type)
197 {
198 	int i, j, num_entries;
199 	void *temp;
200 
201 	temp = agp_bridge->current_size;
202 	num_entries = A_SIZE_FIX(temp)->num_entries;
203 
204 	if ((pg_start + mem->page_count) > num_entries) {
205 		return -EINVAL;
206 	}
207 	for (j = pg_start; j < (pg_start + mem->page_count); j++) {
208 		if (!PGE_EMPTY(agp_bridge, readl(agp_bridge->gatt_table+j)))
209 			return -EBUSY;
210 	}
211 
212 	if (type != 0 || mem->type != 0) {
213 		if ((type == AGP_DCACHE_MEMORY) && (mem->type == AGP_DCACHE_MEMORY)) {
214 			/* special insert */
215 			global_cache_flush();
216 			for (i = pg_start; i < (pg_start + mem->page_count); i++) {
217 				writel((i*4096)|I810_PTE_LOCAL|I810_PTE_VALID, intel_i810_private.registers+I810_PTE_BASE+(i*4));
218 				readl(intel_i810_private.registers+I810_PTE_BASE+(i*4));	/* PCI Posting. */
219 			}
220 			global_cache_flush();
221 			agp_bridge->driver->tlb_flush(mem);
222 			return 0;
223 		}
224 		if((type == AGP_PHYS_MEMORY) && (mem->type == AGP_PHYS_MEMORY))
225 			goto insert;
226 		return -EINVAL;
227 	}
228 
229 insert:
230 	global_cache_flush();
231 	for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
232 		writel(agp_bridge->driver->mask_memory(agp_bridge,
233 			mem->memory[i], mem->type),
234 			intel_i810_private.registers+I810_PTE_BASE+(j*4));
235 		readl(intel_i810_private.registers+I810_PTE_BASE+(j*4));	/* PCI Posting. */
236 	}
237 	global_cache_flush();
238 
239 	agp_bridge->driver->tlb_flush(mem);
240 	return 0;
241 }
242 
243 static int intel_i810_remove_entries(struct agp_memory *mem, off_t pg_start,
244 				int type)
245 {
246 	int i;
247 
248 	for (i = pg_start; i < (mem->page_count + pg_start); i++) {
249 		writel(agp_bridge->scratch_page, intel_i810_private.registers+I810_PTE_BASE+(i*4));
250 		readl(intel_i810_private.registers+I810_PTE_BASE+(i*4));	/* PCI Posting. */
251 	}
252 
253 	global_cache_flush();
254 	agp_bridge->driver->tlb_flush(mem);
255 	return 0;
256 }
257 
258 /*
259  * The i810/i830 requires a physical address to program its mouse
260  * pointer into hardware.
261  * However the Xserver still writes to it through the agp aperture.
262  */
263 static struct agp_memory *alloc_agpphysmem_i8xx(size_t pg_count, int type)
264 {
265 	struct agp_memory *new;
266 	void *addr;
267 
268 	if (pg_count != 1 && pg_count != 4)
269 		return NULL;
270 
271 	switch (pg_count) {
272 	case 1: addr = agp_bridge->driver->agp_alloc_page(agp_bridge);
273 		global_flush_tlb();
274 		break;
275 	case 4:
276 		/* kludge to get 4 physical pages for ARGB cursor */
277 		addr = i8xx_alloc_pages();
278 		break;
279 	default:
280 		return NULL;
281 	}
282 
283 	if (addr == NULL)
284 		return NULL;
285 
286 	new = agp_create_memory(pg_count);
287 	if (new == NULL)
288 		return NULL;
289 
290 	new->memory[0] = virt_to_gart(addr);
291 	if (pg_count == 4) {
292 		/* kludge to get 4 physical pages for ARGB cursor */
293 		new->memory[1] = new->memory[0] + PAGE_SIZE;
294 		new->memory[2] = new->memory[1] + PAGE_SIZE;
295 		new->memory[3] = new->memory[2] + PAGE_SIZE;
296 	}
297 	new->page_count = pg_count;
298 	new->num_scratch_pages = pg_count;
299 	new->type = AGP_PHYS_MEMORY;
300 	new->physical = new->memory[0];
301 	return new;
302 }
303 
304 static struct agp_memory *intel_i810_alloc_by_type(size_t pg_count, int type)
305 {
306 	struct agp_memory *new;
307 
308 	if (type == AGP_DCACHE_MEMORY) {
309 		if (pg_count != intel_i810_private.num_dcache_entries)
310 			return NULL;
311 
312 		new = agp_create_memory(1);
313 		if (new == NULL)
314 			return NULL;
315 
316 		new->type = AGP_DCACHE_MEMORY;
317 		new->page_count = pg_count;
318 		new->num_scratch_pages = 0;
319 		vfree(new->memory);
320 		return new;
321 	}
322 	if (type == AGP_PHYS_MEMORY)
323 		return alloc_agpphysmem_i8xx(pg_count, type);
324 
325 	return NULL;
326 }
327 
328 static void intel_i810_free_by_type(struct agp_memory *curr)
329 {
330 	agp_free_key(curr->key);
331 	if(curr->type == AGP_PHYS_MEMORY) {
332 		if (curr->page_count == 4)
333 			i8xx_destroy_pages(gart_to_virt(curr->memory[0]));
334 		else {
335 			agp_bridge->driver->agp_destroy_page(
336 				 gart_to_virt(curr->memory[0]));
337 			global_flush_tlb();
338 		}
339 		vfree(curr->memory);
340 	}
341 	kfree(curr);
342 }
343 
344 static unsigned long intel_i810_mask_memory(struct agp_bridge_data *bridge,
345 	unsigned long addr, int type)
346 {
347 	/* Type checking must be done elsewhere */
348 	return addr | bridge->driver->masks[type].mask;
349 }
350 
351 static struct aper_size_info_fixed intel_i830_sizes[] =
352 {
353 	{128, 32768, 5},
354 	/* The 64M mode still requires a 128k gatt */
355 	{64, 16384, 5},
356 	{256, 65536, 6},
357 };
358 
359 static struct _intel_i830_private {
360 	struct pci_dev *i830_dev;		/* device one */
361 	volatile u8 __iomem *registers;
362 	volatile u32 __iomem *gtt;		/* I915G */
363 	int gtt_entries;
364 } intel_i830_private;
365 
366 static void intel_i830_init_gtt_entries(void)
367 {
368 	u16 gmch_ctrl;
369 	int gtt_entries;
370 	u8 rdct;
371 	int local = 0;
372 	static const int ddt[4] = { 0, 16, 32, 64 };
373 	int size;
374 
375 	pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl);
376 
377 	/* We obtain the size of the GTT, which is also stored (for some
378 	 * reason) at the top of stolen memory. Then we add 4KB to that
379 	 * for the video BIOS popup, which is also stored in there. */
380 	size = agp_bridge->driver->fetch_size() + 4;
381 
382 	if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82830_HB ||
383 	    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) {
384 		switch (gmch_ctrl & I830_GMCH_GMS_MASK) {
385 		case I830_GMCH_GMS_STOLEN_512:
386 			gtt_entries = KB(512) - KB(size);
387 			break;
388 		case I830_GMCH_GMS_STOLEN_1024:
389 			gtt_entries = MB(1) - KB(size);
390 			break;
391 		case I830_GMCH_GMS_STOLEN_8192:
392 			gtt_entries = MB(8) - KB(size);
393 			break;
394 		case I830_GMCH_GMS_LOCAL:
395 			rdct = readb(intel_i830_private.registers+I830_RDRAM_CHANNEL_TYPE);
396 			gtt_entries = (I830_RDRAM_ND(rdct) + 1) *
397 					MB(ddt[I830_RDRAM_DDT(rdct)]);
398 			local = 1;
399 			break;
400 		default:
401 			gtt_entries = 0;
402 			break;
403 		}
404 	} else {
405 		switch (gmch_ctrl & I830_GMCH_GMS_MASK) {
406 		case I855_GMCH_GMS_STOLEN_1M:
407 			gtt_entries = MB(1) - KB(size);
408 			break;
409 		case I855_GMCH_GMS_STOLEN_4M:
410 			gtt_entries = MB(4) - KB(size);
411 			break;
412 		case I855_GMCH_GMS_STOLEN_8M:
413 			gtt_entries = MB(8) - KB(size);
414 			break;
415 		case I855_GMCH_GMS_STOLEN_16M:
416 			gtt_entries = MB(16) - KB(size);
417 			break;
418 		case I855_GMCH_GMS_STOLEN_32M:
419 			gtt_entries = MB(32) - KB(size);
420 			break;
421 		case I915_GMCH_GMS_STOLEN_48M:
422 			/* Check it's really I915G */
423 			if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915G_HB ||
424 			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB ||
425 			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB)
426 				gtt_entries = MB(48) - KB(size);
427 			else
428 				gtt_entries = 0;
429 			break;
430 		case I915_GMCH_GMS_STOLEN_64M:
431 			/* Check it's really I915G */
432 			if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915G_HB ||
433 			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB ||
434 			    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB)
435 				gtt_entries = MB(64) - KB(size);
436 			else
437 				gtt_entries = 0;
438 		default:
439 			gtt_entries = 0;
440 			break;
441 		}
442 	}
443 	if (gtt_entries > 0)
444 		printk(KERN_INFO PFX "Detected %dK %s memory.\n",
445 		       gtt_entries / KB(1), local ? "local" : "stolen");
446 	else
447 		printk(KERN_INFO PFX
448 		       "No pre-allocated video memory detected.\n");
449 	gtt_entries /= KB(4);
450 
451 	intel_i830_private.gtt_entries = gtt_entries;
452 }
453 
454 /* The intel i830 automatically initializes the agp aperture during POST.
455  * Use the memory already set aside for in the GTT.
456  */
457 static int intel_i830_create_gatt_table(struct agp_bridge_data *bridge)
458 {
459 	int page_order;
460 	struct aper_size_info_fixed *size;
461 	int num_entries;
462 	u32 temp;
463 
464 	size = agp_bridge->current_size;
465 	page_order = size->page_order;
466 	num_entries = size->num_entries;
467 	agp_bridge->gatt_table_real = NULL;
468 
469 	pci_read_config_dword(intel_i830_private.i830_dev,I810_MMADDR,&temp);
470 	temp &= 0xfff80000;
471 
472 	intel_i830_private.registers = ioremap(temp,128 * 4096);
473 	if (!intel_i830_private.registers)
474 		return -ENOMEM;
475 
476 	temp = readl(intel_i830_private.registers+I810_PGETBL_CTL) & 0xfffff000;
477 	global_cache_flush();	/* FIXME: ?? */
478 
479 	/* we have to call this as early as possible after the MMIO base address is known */
480 	intel_i830_init_gtt_entries();
481 
482 	agp_bridge->gatt_table = NULL;
483 
484 	agp_bridge->gatt_bus_addr = temp;
485 
486 	return 0;
487 }
488 
489 /* Return the gatt table to a sane state. Use the top of stolen
490  * memory for the GTT.
491  */
492 static int intel_i830_free_gatt_table(struct agp_bridge_data *bridge)
493 {
494 	return 0;
495 }
496 
497 static int intel_i830_fetch_size(void)
498 {
499 	u16 gmch_ctrl;
500 	struct aper_size_info_fixed *values;
501 
502 	values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes);
503 
504 	if (agp_bridge->dev->device != PCI_DEVICE_ID_INTEL_82830_HB &&
505 	    agp_bridge->dev->device != PCI_DEVICE_ID_INTEL_82845G_HB) {
506 		/* 855GM/852GM/865G has 128MB aperture size */
507 		agp_bridge->previous_size = agp_bridge->current_size = (void *) values;
508 		agp_bridge->aperture_size_idx = 0;
509 		return values[0].size;
510 	}
511 
512 	pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl);
513 
514 	if ((gmch_ctrl & I830_GMCH_MEM_MASK) == I830_GMCH_MEM_128M) {
515 		agp_bridge->previous_size = agp_bridge->current_size = (void *) values;
516 		agp_bridge->aperture_size_idx = 0;
517 		return values[0].size;
518 	} else {
519 		agp_bridge->previous_size = agp_bridge->current_size = (void *) (values + 1);
520 		agp_bridge->aperture_size_idx = 1;
521 		return values[1].size;
522 	}
523 
524 	return 0;
525 }
526 
527 static int intel_i830_configure(void)
528 {
529 	struct aper_size_info_fixed *current_size;
530 	u32 temp;
531 	u16 gmch_ctrl;
532 	int i;
533 
534 	current_size = A_SIZE_FIX(agp_bridge->current_size);
535 
536 	pci_read_config_dword(intel_i830_private.i830_dev,I810_GMADDR,&temp);
537 	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
538 
539 	pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl);
540 	gmch_ctrl |= I830_GMCH_ENABLED;
541 	pci_write_config_word(agp_bridge->dev,I830_GMCH_CTRL,gmch_ctrl);
542 
543 	writel(agp_bridge->gatt_bus_addr|I810_PGETBL_ENABLED, intel_i830_private.registers+I810_PGETBL_CTL);
544 	readl(intel_i830_private.registers+I810_PGETBL_CTL);	/* PCI Posting. */
545 
546 	if (agp_bridge->driver->needs_scratch_page) {
547 		for (i = intel_i830_private.gtt_entries; i < current_size->num_entries; i++) {
548 			writel(agp_bridge->scratch_page, intel_i830_private.registers+I810_PTE_BASE+(i*4));
549 			readl(intel_i830_private.registers+I810_PTE_BASE+(i*4));	/* PCI Posting. */
550 		}
551 	}
552 
553 	global_cache_flush();
554 	return 0;
555 }
556 
557 static void intel_i830_cleanup(void)
558 {
559 	iounmap(intel_i830_private.registers);
560 }
561 
562 static int intel_i830_insert_entries(struct agp_memory *mem,off_t pg_start, int type)
563 {
564 	int i,j,num_entries;
565 	void *temp;
566 
567 	temp = agp_bridge->current_size;
568 	num_entries = A_SIZE_FIX(temp)->num_entries;
569 
570 	if (pg_start < intel_i830_private.gtt_entries) {
571 		printk (KERN_DEBUG PFX "pg_start == 0x%.8lx,intel_i830_private.gtt_entries == 0x%.8x\n",
572 				pg_start,intel_i830_private.gtt_entries);
573 
574 		printk (KERN_INFO PFX "Trying to insert into local/stolen memory\n");
575 		return -EINVAL;
576 	}
577 
578 	if ((pg_start + mem->page_count) > num_entries)
579 		return -EINVAL;
580 
581 	/* The i830 can't check the GTT for entries since its read only,
582 	 * depend on the caller to make the correct offset decisions.
583 	 */
584 
585 	if ((type != 0 && type != AGP_PHYS_MEMORY) ||
586 		(mem->type != 0 && mem->type != AGP_PHYS_MEMORY))
587 		return -EINVAL;
588 
589 	global_cache_flush();	/* FIXME: Necessary ?*/
590 
591 	for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
592 		writel(agp_bridge->driver->mask_memory(agp_bridge,
593 			mem->memory[i], mem->type),
594 			intel_i830_private.registers+I810_PTE_BASE+(j*4));
595 		readl(intel_i830_private.registers+I810_PTE_BASE+(j*4));	/* PCI Posting. */
596 	}
597 
598 	global_cache_flush();
599 	agp_bridge->driver->tlb_flush(mem);
600 	return 0;
601 }
602 
603 static int intel_i830_remove_entries(struct agp_memory *mem,off_t pg_start,
604 				int type)
605 {
606 	int i;
607 
608 	global_cache_flush();
609 
610 	if (pg_start < intel_i830_private.gtt_entries) {
611 		printk (KERN_INFO PFX "Trying to disable local/stolen memory\n");
612 		return -EINVAL;
613 	}
614 
615 	for (i = pg_start; i < (mem->page_count + pg_start); i++) {
616 		writel(agp_bridge->scratch_page, intel_i830_private.registers+I810_PTE_BASE+(i*4));
617 		readl(intel_i830_private.registers+I810_PTE_BASE+(i*4));	/* PCI Posting. */
618 	}
619 
620 	global_cache_flush();
621 	agp_bridge->driver->tlb_flush(mem);
622 	return 0;
623 }
624 
625 static struct agp_memory *intel_i830_alloc_by_type(size_t pg_count,int type)
626 {
627 	if (type == AGP_PHYS_MEMORY)
628 		return alloc_agpphysmem_i8xx(pg_count, type);
629 
630 	/* always return NULL for other allocation types for now */
631 	return NULL;
632 }
633 
634 static int intel_i915_configure(void)
635 {
636 	struct aper_size_info_fixed *current_size;
637 	u32 temp;
638 	u16 gmch_ctrl;
639 	int i;
640 
641 	current_size = A_SIZE_FIX(agp_bridge->current_size);
642 
643 	pci_read_config_dword(intel_i830_private.i830_dev, I915_GMADDR, &temp);
644 
645 	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
646 
647 	pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl);
648 	gmch_ctrl |= I830_GMCH_ENABLED;
649 	pci_write_config_word(agp_bridge->dev,I830_GMCH_CTRL,gmch_ctrl);
650 
651 	writel(agp_bridge->gatt_bus_addr|I810_PGETBL_ENABLED, intel_i830_private.registers+I810_PGETBL_CTL);
652 	readl(intel_i830_private.registers+I810_PGETBL_CTL);	/* PCI Posting. */
653 
654 	if (agp_bridge->driver->needs_scratch_page) {
655 		for (i = intel_i830_private.gtt_entries; i < current_size->num_entries; i++) {
656 			writel(agp_bridge->scratch_page, intel_i830_private.gtt+i);
657 			readl(intel_i830_private.gtt+i);	/* PCI Posting. */
658 		}
659 	}
660 
661 	global_cache_flush();
662 	return 0;
663 }
664 
665 static void intel_i915_cleanup(void)
666 {
667 	iounmap(intel_i830_private.gtt);
668 	iounmap(intel_i830_private.registers);
669 }
670 
671 static int intel_i915_insert_entries(struct agp_memory *mem,off_t pg_start,
672 				int type)
673 {
674 	int i,j,num_entries;
675 	void *temp;
676 
677 	temp = agp_bridge->current_size;
678 	num_entries = A_SIZE_FIX(temp)->num_entries;
679 
680 	if (pg_start < intel_i830_private.gtt_entries) {
681 		printk (KERN_DEBUG PFX "pg_start == 0x%.8lx,intel_i830_private.gtt_entries == 0x%.8x\n",
682 				pg_start,intel_i830_private.gtt_entries);
683 
684 		printk (KERN_INFO PFX "Trying to insert into local/stolen memory\n");
685 		return -EINVAL;
686 	}
687 
688 	if ((pg_start + mem->page_count) > num_entries)
689 		return -EINVAL;
690 
691 	/* The i830 can't check the GTT for entries since its read only,
692 	 * depend on the caller to make the correct offset decisions.
693 	 */
694 
695 	if ((type != 0 && type != AGP_PHYS_MEMORY) ||
696 		(mem->type != 0 && mem->type != AGP_PHYS_MEMORY))
697 		return -EINVAL;
698 
699 	global_cache_flush();
700 
701 	for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
702 		writel(agp_bridge->driver->mask_memory(agp_bridge,
703 			mem->memory[i], mem->type), intel_i830_private.gtt+j);
704 		readl(intel_i830_private.gtt+j);	/* PCI Posting. */
705 	}
706 
707 	global_cache_flush();
708 	agp_bridge->driver->tlb_flush(mem);
709 	return 0;
710 }
711 
712 static int intel_i915_remove_entries(struct agp_memory *mem,off_t pg_start,
713 				int type)
714 {
715 	int i;
716 
717 	global_cache_flush();
718 
719 	if (pg_start < intel_i830_private.gtt_entries) {
720 		printk (KERN_INFO PFX "Trying to disable local/stolen memory\n");
721 		return -EINVAL;
722 	}
723 
724 	for (i = pg_start; i < (mem->page_count + pg_start); i++) {
725 		writel(agp_bridge->scratch_page, intel_i830_private.gtt+i);
726 		readl(intel_i830_private.gtt+i);
727 	}
728 
729 	global_cache_flush();
730 	agp_bridge->driver->tlb_flush(mem);
731 	return 0;
732 }
733 
734 static int intel_i915_fetch_size(void)
735 {
736 	struct aper_size_info_fixed *values;
737 	u32 temp, offset = 0;
738 
739 #define I915_256MB_ADDRESS_MASK (1<<27)
740 
741 	values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes);
742 
743 	pci_read_config_dword(intel_i830_private.i830_dev, I915_GMADDR, &temp);
744 	if (temp & I915_256MB_ADDRESS_MASK)
745 		offset = 0;	/* 128MB aperture */
746 	else
747 		offset = 2;	/* 256MB aperture */
748 	agp_bridge->previous_size = agp_bridge->current_size = (void *)(values + offset);
749 	return values[offset].size;
750 }
751 
752 /* The intel i915 automatically initializes the agp aperture during POST.
753  * Use the memory already set aside for in the GTT.
754  */
755 static int intel_i915_create_gatt_table(struct agp_bridge_data *bridge)
756 {
757 	int page_order;
758 	struct aper_size_info_fixed *size;
759 	int num_entries;
760 	u32 temp, temp2;
761 
762 	size = agp_bridge->current_size;
763 	page_order = size->page_order;
764 	num_entries = size->num_entries;
765 	agp_bridge->gatt_table_real = NULL;
766 
767 	pci_read_config_dword(intel_i830_private.i830_dev, I915_MMADDR, &temp);
768 	pci_read_config_dword(intel_i830_private.i830_dev, I915_PTEADDR,&temp2);
769 
770 	intel_i830_private.gtt = ioremap(temp2, 256 * 1024);
771 	if (!intel_i830_private.gtt)
772 		return -ENOMEM;
773 
774 	temp &= 0xfff80000;
775 
776 	intel_i830_private.registers = ioremap(temp,128 * 4096);
777 	if (!intel_i830_private.registers)
778 		return -ENOMEM;
779 
780 	temp = readl(intel_i830_private.registers+I810_PGETBL_CTL) & 0xfffff000;
781 	global_cache_flush();	/* FIXME: ? */
782 
783 	/* we have to call this as early as possible after the MMIO base address is known */
784 	intel_i830_init_gtt_entries();
785 
786 	agp_bridge->gatt_table = NULL;
787 
788 	agp_bridge->gatt_bus_addr = temp;
789 
790 	return 0;
791 }
792 
793 static int intel_fetch_size(void)
794 {
795 	int i;
796 	u16 temp;
797 	struct aper_size_info_16 *values;
798 
799 	pci_read_config_word(agp_bridge->dev, INTEL_APSIZE, &temp);
800 	values = A_SIZE_16(agp_bridge->driver->aperture_sizes);
801 
802 	for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) {
803 		if (temp == values[i].size_value) {
804 			agp_bridge->previous_size = agp_bridge->current_size = (void *) (values + i);
805 			agp_bridge->aperture_size_idx = i;
806 			return values[i].size;
807 		}
808 	}
809 
810 	return 0;
811 }
812 
813 static int __intel_8xx_fetch_size(u8 temp)
814 {
815 	int i;
816 	struct aper_size_info_8 *values;
817 
818 	values = A_SIZE_8(agp_bridge->driver->aperture_sizes);
819 
820 	for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) {
821 		if (temp == values[i].size_value) {
822 			agp_bridge->previous_size =
823 				agp_bridge->current_size = (void *) (values + i);
824 			agp_bridge->aperture_size_idx = i;
825 			return values[i].size;
826 		}
827 	}
828 	return 0;
829 }
830 
831 static int intel_8xx_fetch_size(void)
832 {
833 	u8 temp;
834 
835 	pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp);
836 	return __intel_8xx_fetch_size(temp);
837 }
838 
839 static int intel_815_fetch_size(void)
840 {
841 	u8 temp;
842 
843 	/* Intel 815 chipsets have a _weird_ APSIZE register with only
844 	 * one non-reserved bit, so mask the others out ... */
845 	pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp);
846 	temp &= (1 << 3);
847 
848 	return __intel_8xx_fetch_size(temp);
849 }
850 
851 static void intel_tlbflush(struct agp_memory *mem)
852 {
853 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2200);
854 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280);
855 }
856 
857 
858 static void intel_8xx_tlbflush(struct agp_memory *mem)
859 {
860 	u32 temp;
861 	pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp);
862 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp & ~(1 << 7));
863 	pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp);
864 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp | (1 << 7));
865 }
866 
867 
868 static void intel_cleanup(void)
869 {
870 	u16 temp;
871 	struct aper_size_info_16 *previous_size;
872 
873 	previous_size = A_SIZE_16(agp_bridge->previous_size);
874 	pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp);
875 	pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9));
876 	pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value);
877 }
878 
879 
880 static void intel_8xx_cleanup(void)
881 {
882 	u16 temp;
883 	struct aper_size_info_8 *previous_size;
884 
885 	previous_size = A_SIZE_8(agp_bridge->previous_size);
886 	pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp);
887 	pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9));
888 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value);
889 }
890 
891 
892 static int intel_configure(void)
893 {
894 	u32 temp;
895 	u16 temp2;
896 	struct aper_size_info_16 *current_size;
897 
898 	current_size = A_SIZE_16(agp_bridge->current_size);
899 
900 	/* aperture size */
901 	pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
902 
903 	/* address to map to */
904 	pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
905 	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
906 
907 	/* attbase - aperture base */
908 	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
909 
910 	/* agpctrl */
911 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280);
912 
913 	/* paccfg/nbxcfg */
914 	pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2);
915 	pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG,
916 			(temp2 & ~(1 << 10)) | (1 << 9));
917 	/* clear any possible error conditions */
918 	pci_write_config_byte(agp_bridge->dev, INTEL_ERRSTS + 1, 7);
919 	return 0;
920 }
921 
922 static int intel_815_configure(void)
923 {
924 	u32 temp, addr;
925 	u8 temp2;
926 	struct aper_size_info_8 *current_size;
927 
928 	/* attbase - aperture base */
929 	/* the Intel 815 chipset spec. says that bits 29-31 in the
930 	* ATTBASE register are reserved -> try not to write them */
931 	if (agp_bridge->gatt_bus_addr & INTEL_815_ATTBASE_MASK) {
932 		printk (KERN_EMERG PFX "gatt bus addr too high");
933 		return -EINVAL;
934 	}
935 
936 	current_size = A_SIZE_8(agp_bridge->current_size);
937 
938 	/* aperture size */
939 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE,
940 			current_size->size_value);
941 
942 	/* address to map to */
943 	pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
944 	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
945 
946 	pci_read_config_dword(agp_bridge->dev, INTEL_ATTBASE, &addr);
947 	addr &= INTEL_815_ATTBASE_MASK;
948 	addr |= agp_bridge->gatt_bus_addr;
949 	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, addr);
950 
951 	/* agpctrl */
952 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
953 
954 	/* apcont */
955 	pci_read_config_byte(agp_bridge->dev, INTEL_815_APCONT, &temp2);
956 	pci_write_config_byte(agp_bridge->dev, INTEL_815_APCONT, temp2 | (1 << 1));
957 
958 	/* clear any possible error conditions */
959 	/* Oddness : this chipset seems to have no ERRSTS register ! */
960 	return 0;
961 }
962 
963 static void intel_820_tlbflush(struct agp_memory *mem)
964 {
965 	return;
966 }
967 
968 static void intel_820_cleanup(void)
969 {
970 	u8 temp;
971 	struct aper_size_info_8 *previous_size;
972 
973 	previous_size = A_SIZE_8(agp_bridge->previous_size);
974 	pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp);
975 	pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR,
976 			temp & ~(1 << 1));
977 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE,
978 			previous_size->size_value);
979 }
980 
981 
982 static int intel_820_configure(void)
983 {
984 	u32 temp;
985 	u8 temp2;
986 	struct aper_size_info_8 *current_size;
987 
988 	current_size = A_SIZE_8(agp_bridge->current_size);
989 
990 	/* aperture size */
991 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
992 
993 	/* address to map to */
994 	pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
995 	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
996 
997 	/* attbase - aperture base */
998 	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
999 
1000 	/* agpctrl */
1001 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
1002 
1003 	/* global enable aperture access */
1004 	/* This flag is not accessed through MCHCFG register as in */
1005 	/* i850 chipset. */
1006 	pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp2);
1007 	pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR, temp2 | (1 << 1));
1008 	/* clear any possible AGP-related error conditions */
1009 	pci_write_config_word(agp_bridge->dev, INTEL_I820_ERRSTS, 0x001c);
1010 	return 0;
1011 }
1012 
1013 static int intel_840_configure(void)
1014 {
1015 	u32 temp;
1016 	u16 temp2;
1017 	struct aper_size_info_8 *current_size;
1018 
1019 	current_size = A_SIZE_8(agp_bridge->current_size);
1020 
1021 	/* aperture size */
1022 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
1023 
1024 	/* address to map to */
1025 	pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
1026 	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
1027 
1028 	/* attbase - aperture base */
1029 	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
1030 
1031 	/* agpctrl */
1032 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
1033 
1034 	/* mcgcfg */
1035 	pci_read_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, &temp2);
1036 	pci_write_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, temp2 | (1 << 9));
1037 	/* clear any possible error conditions */
1038 	pci_write_config_word(agp_bridge->dev, INTEL_I840_ERRSTS, 0xc000);
1039 	return 0;
1040 }
1041 
1042 static int intel_845_configure(void)
1043 {
1044 	u32 temp;
1045 	u8 temp2;
1046 	struct aper_size_info_8 *current_size;
1047 
1048 	current_size = A_SIZE_8(agp_bridge->current_size);
1049 
1050 	/* aperture size */
1051 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
1052 
1053 	if (agp_bridge->apbase_config != 0) {
1054 		pci_write_config_dword(agp_bridge->dev, AGP_APBASE,
1055 				       agp_bridge->apbase_config);
1056 	} else {
1057 		/* address to map to */
1058 		pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
1059 		agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
1060 		agp_bridge->apbase_config = temp;
1061 	}
1062 
1063 	/* attbase - aperture base */
1064 	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
1065 
1066 	/* agpctrl */
1067 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
1068 
1069 	/* agpm */
1070 	pci_read_config_byte(agp_bridge->dev, INTEL_I845_AGPM, &temp2);
1071 	pci_write_config_byte(agp_bridge->dev, INTEL_I845_AGPM, temp2 | (1 << 1));
1072 	/* clear any possible error conditions */
1073 	pci_write_config_word(agp_bridge->dev, INTEL_I845_ERRSTS, 0x001c);
1074 	return 0;
1075 }
1076 
1077 static int intel_850_configure(void)
1078 {
1079 	u32 temp;
1080 	u16 temp2;
1081 	struct aper_size_info_8 *current_size;
1082 
1083 	current_size = A_SIZE_8(agp_bridge->current_size);
1084 
1085 	/* aperture size */
1086 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
1087 
1088 	/* address to map to */
1089 	pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
1090 	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
1091 
1092 	/* attbase - aperture base */
1093 	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
1094 
1095 	/* agpctrl */
1096 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
1097 
1098 	/* mcgcfg */
1099 	pci_read_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, &temp2);
1100 	pci_write_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, temp2 | (1 << 9));
1101 	/* clear any possible AGP-related error conditions */
1102 	pci_write_config_word(agp_bridge->dev, INTEL_I850_ERRSTS, 0x001c);
1103 	return 0;
1104 }
1105 
1106 static int intel_860_configure(void)
1107 {
1108 	u32 temp;
1109 	u16 temp2;
1110 	struct aper_size_info_8 *current_size;
1111 
1112 	current_size = A_SIZE_8(agp_bridge->current_size);
1113 
1114 	/* aperture size */
1115 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
1116 
1117 	/* address to map to */
1118 	pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
1119 	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
1120 
1121 	/* attbase - aperture base */
1122 	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
1123 
1124 	/* agpctrl */
1125 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
1126 
1127 	/* mcgcfg */
1128 	pci_read_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, &temp2);
1129 	pci_write_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, temp2 | (1 << 9));
1130 	/* clear any possible AGP-related error conditions */
1131 	pci_write_config_word(agp_bridge->dev, INTEL_I860_ERRSTS, 0xf700);
1132 	return 0;
1133 }
1134 
1135 static int intel_830mp_configure(void)
1136 {
1137 	u32 temp;
1138 	u16 temp2;
1139 	struct aper_size_info_8 *current_size;
1140 
1141 	current_size = A_SIZE_8(agp_bridge->current_size);
1142 
1143 	/* aperture size */
1144 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
1145 
1146 	/* address to map to */
1147 	pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
1148 	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
1149 
1150 	/* attbase - aperture base */
1151 	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
1152 
1153 	/* agpctrl */
1154 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
1155 
1156 	/* gmch */
1157 	pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2);
1158 	pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp2 | (1 << 9));
1159 	/* clear any possible AGP-related error conditions */
1160 	pci_write_config_word(agp_bridge->dev, INTEL_I830_ERRSTS, 0x1c);
1161 	return 0;
1162 }
1163 
1164 static int intel_7505_configure(void)
1165 {
1166 	u32 temp;
1167 	u16 temp2;
1168 	struct aper_size_info_8 *current_size;
1169 
1170 	current_size = A_SIZE_8(agp_bridge->current_size);
1171 
1172 	/* aperture size */
1173 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
1174 
1175 	/* address to map to */
1176 	pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
1177 	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
1178 
1179 	/* attbase - aperture base */
1180 	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
1181 
1182 	/* agpctrl */
1183 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
1184 
1185 	/* mchcfg */
1186 	pci_read_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, &temp2);
1187 	pci_write_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, temp2 | (1 << 9));
1188 
1189 	return 0;
1190 }
1191 
1192 /* Setup function */
1193 static struct gatt_mask intel_generic_masks[] =
1194 {
1195 	{.mask = 0x00000017, .type = 0}
1196 };
1197 
1198 static struct aper_size_info_8 intel_815_sizes[2] =
1199 {
1200 	{64, 16384, 4, 0},
1201 	{32, 8192, 3, 8},
1202 };
1203 
1204 static struct aper_size_info_8 intel_8xx_sizes[7] =
1205 {
1206 	{256, 65536, 6, 0},
1207 	{128, 32768, 5, 32},
1208 	{64, 16384, 4, 48},
1209 	{32, 8192, 3, 56},
1210 	{16, 4096, 2, 60},
1211 	{8, 2048, 1, 62},
1212 	{4, 1024, 0, 63}
1213 };
1214 
1215 static struct aper_size_info_16 intel_generic_sizes[7] =
1216 {
1217 	{256, 65536, 6, 0},
1218 	{128, 32768, 5, 32},
1219 	{64, 16384, 4, 48},
1220 	{32, 8192, 3, 56},
1221 	{16, 4096, 2, 60},
1222 	{8, 2048, 1, 62},
1223 	{4, 1024, 0, 63}
1224 };
1225 
1226 static struct aper_size_info_8 intel_830mp_sizes[4] =
1227 {
1228 	{256, 65536, 6, 0},
1229 	{128, 32768, 5, 32},
1230 	{64, 16384, 4, 48},
1231 	{32, 8192, 3, 56}
1232 };
1233 
1234 static struct agp_bridge_driver intel_generic_driver = {
1235 	.owner			= THIS_MODULE,
1236 	.aperture_sizes		= intel_generic_sizes,
1237 	.size_type		= U16_APER_SIZE,
1238 	.num_aperture_sizes	= 7,
1239 	.configure		= intel_configure,
1240 	.fetch_size		= intel_fetch_size,
1241 	.cleanup		= intel_cleanup,
1242 	.tlb_flush		= intel_tlbflush,
1243 	.mask_memory		= agp_generic_mask_memory,
1244 	.masks			= intel_generic_masks,
1245 	.agp_enable		= agp_generic_enable,
1246 	.cache_flush		= global_cache_flush,
1247 	.create_gatt_table	= agp_generic_create_gatt_table,
1248 	.free_gatt_table	= agp_generic_free_gatt_table,
1249 	.insert_memory		= agp_generic_insert_memory,
1250 	.remove_memory		= agp_generic_remove_memory,
1251 	.alloc_by_type		= agp_generic_alloc_by_type,
1252 	.free_by_type		= agp_generic_free_by_type,
1253 	.agp_alloc_page		= agp_generic_alloc_page,
1254 	.agp_destroy_page	= agp_generic_destroy_page,
1255 };
1256 
1257 static struct agp_bridge_driver intel_810_driver = {
1258 	.owner			= THIS_MODULE,
1259 	.aperture_sizes		= intel_i810_sizes,
1260 	.size_type		= FIXED_APER_SIZE,
1261 	.num_aperture_sizes	= 2,
1262 	.needs_scratch_page	= TRUE,
1263 	.configure		= intel_i810_configure,
1264 	.fetch_size		= intel_i810_fetch_size,
1265 	.cleanup		= intel_i810_cleanup,
1266 	.tlb_flush		= intel_i810_tlbflush,
1267 	.mask_memory		= intel_i810_mask_memory,
1268 	.masks			= intel_i810_masks,
1269 	.agp_enable		= intel_i810_agp_enable,
1270 	.cache_flush		= global_cache_flush,
1271 	.create_gatt_table	= agp_generic_create_gatt_table,
1272 	.free_gatt_table	= agp_generic_free_gatt_table,
1273 	.insert_memory		= intel_i810_insert_entries,
1274 	.remove_memory		= intel_i810_remove_entries,
1275 	.alloc_by_type		= intel_i810_alloc_by_type,
1276 	.free_by_type		= intel_i810_free_by_type,
1277 	.agp_alloc_page		= agp_generic_alloc_page,
1278 	.agp_destroy_page	= agp_generic_destroy_page,
1279 };
1280 
1281 static struct agp_bridge_driver intel_815_driver = {
1282 	.owner			= THIS_MODULE,
1283 	.aperture_sizes		= intel_815_sizes,
1284 	.size_type		= U8_APER_SIZE,
1285 	.num_aperture_sizes	= 2,
1286 	.configure		= intel_815_configure,
1287 	.fetch_size		= intel_815_fetch_size,
1288 	.cleanup		= intel_8xx_cleanup,
1289 	.tlb_flush		= intel_8xx_tlbflush,
1290 	.mask_memory		= agp_generic_mask_memory,
1291 	.masks			= intel_generic_masks,
1292 	.agp_enable		= agp_generic_enable,
1293 	.cache_flush		= global_cache_flush,
1294 	.create_gatt_table	= agp_generic_create_gatt_table,
1295 	.free_gatt_table	= agp_generic_free_gatt_table,
1296 	.insert_memory		= agp_generic_insert_memory,
1297 	.remove_memory		= agp_generic_remove_memory,
1298 	.alloc_by_type		= agp_generic_alloc_by_type,
1299 	.free_by_type		= agp_generic_free_by_type,
1300 	.agp_alloc_page		= agp_generic_alloc_page,
1301 	.agp_destroy_page	= agp_generic_destroy_page,
1302 };
1303 
1304 static struct agp_bridge_driver intel_830_driver = {
1305 	.owner			= THIS_MODULE,
1306 	.aperture_sizes		= intel_i830_sizes,
1307 	.size_type		= FIXED_APER_SIZE,
1308 	.num_aperture_sizes	= 3,
1309 	.needs_scratch_page	= TRUE,
1310 	.configure		= intel_i830_configure,
1311 	.fetch_size		= intel_i830_fetch_size,
1312 	.cleanup		= intel_i830_cleanup,
1313 	.tlb_flush		= intel_i810_tlbflush,
1314 	.mask_memory		= intel_i810_mask_memory,
1315 	.masks			= intel_i810_masks,
1316 	.agp_enable		= intel_i810_agp_enable,
1317 	.cache_flush		= global_cache_flush,
1318 	.create_gatt_table	= intel_i830_create_gatt_table,
1319 	.free_gatt_table	= intel_i830_free_gatt_table,
1320 	.insert_memory		= intel_i830_insert_entries,
1321 	.remove_memory		= intel_i830_remove_entries,
1322 	.alloc_by_type		= intel_i830_alloc_by_type,
1323 	.free_by_type		= intel_i810_free_by_type,
1324 	.agp_alloc_page		= agp_generic_alloc_page,
1325 	.agp_destroy_page	= agp_generic_destroy_page,
1326 };
1327 
1328 static struct agp_bridge_driver intel_820_driver = {
1329 	.owner			= THIS_MODULE,
1330 	.aperture_sizes		= intel_8xx_sizes,
1331 	.size_type		= U8_APER_SIZE,
1332 	.num_aperture_sizes	= 7,
1333 	.configure		= intel_820_configure,
1334 	.fetch_size		= intel_8xx_fetch_size,
1335 	.cleanup		= intel_820_cleanup,
1336 	.tlb_flush		= intel_820_tlbflush,
1337 	.mask_memory		= agp_generic_mask_memory,
1338 	.masks			= intel_generic_masks,
1339 	.agp_enable		= agp_generic_enable,
1340 	.cache_flush		= global_cache_flush,
1341 	.create_gatt_table	= agp_generic_create_gatt_table,
1342 	.free_gatt_table	= agp_generic_free_gatt_table,
1343 	.insert_memory		= agp_generic_insert_memory,
1344 	.remove_memory		= agp_generic_remove_memory,
1345 	.alloc_by_type		= agp_generic_alloc_by_type,
1346 	.free_by_type		= agp_generic_free_by_type,
1347 	.agp_alloc_page		= agp_generic_alloc_page,
1348 	.agp_destroy_page	= agp_generic_destroy_page,
1349 };
1350 
1351 static struct agp_bridge_driver intel_830mp_driver = {
1352 	.owner			= THIS_MODULE,
1353 	.aperture_sizes		= intel_830mp_sizes,
1354 	.size_type		= U8_APER_SIZE,
1355 	.num_aperture_sizes	= 4,
1356 	.configure		= intel_830mp_configure,
1357 	.fetch_size		= intel_8xx_fetch_size,
1358 	.cleanup		= intel_8xx_cleanup,
1359 	.tlb_flush		= intel_8xx_tlbflush,
1360 	.mask_memory		= agp_generic_mask_memory,
1361 	.masks			= intel_generic_masks,
1362 	.agp_enable		= agp_generic_enable,
1363 	.cache_flush		= global_cache_flush,
1364 	.create_gatt_table	= agp_generic_create_gatt_table,
1365 	.free_gatt_table	= agp_generic_free_gatt_table,
1366 	.insert_memory		= agp_generic_insert_memory,
1367 	.remove_memory		= agp_generic_remove_memory,
1368 	.alloc_by_type		= agp_generic_alloc_by_type,
1369 	.free_by_type		= agp_generic_free_by_type,
1370 	.agp_alloc_page		= agp_generic_alloc_page,
1371 	.agp_destroy_page	= agp_generic_destroy_page,
1372 };
1373 
1374 static struct agp_bridge_driver intel_840_driver = {
1375 	.owner			= THIS_MODULE,
1376 	.aperture_sizes		= intel_8xx_sizes,
1377 	.size_type		= U8_APER_SIZE,
1378 	.num_aperture_sizes	= 7,
1379 	.configure		= intel_840_configure,
1380 	.fetch_size		= intel_8xx_fetch_size,
1381 	.cleanup		= intel_8xx_cleanup,
1382 	.tlb_flush		= intel_8xx_tlbflush,
1383 	.mask_memory		= agp_generic_mask_memory,
1384 	.masks			= intel_generic_masks,
1385 	.agp_enable		= agp_generic_enable,
1386 	.cache_flush		= global_cache_flush,
1387 	.create_gatt_table	= agp_generic_create_gatt_table,
1388 	.free_gatt_table	= agp_generic_free_gatt_table,
1389 	.insert_memory		= agp_generic_insert_memory,
1390 	.remove_memory		= agp_generic_remove_memory,
1391 	.alloc_by_type		= agp_generic_alloc_by_type,
1392 	.free_by_type		= agp_generic_free_by_type,
1393 	.agp_alloc_page		= agp_generic_alloc_page,
1394 	.agp_destroy_page	= agp_generic_destroy_page,
1395 };
1396 
1397 static struct agp_bridge_driver intel_845_driver = {
1398 	.owner			= THIS_MODULE,
1399 	.aperture_sizes		= intel_8xx_sizes,
1400 	.size_type		= U8_APER_SIZE,
1401 	.num_aperture_sizes	= 7,
1402 	.configure		= intel_845_configure,
1403 	.fetch_size		= intel_8xx_fetch_size,
1404 	.cleanup		= intel_8xx_cleanup,
1405 	.tlb_flush		= intel_8xx_tlbflush,
1406 	.mask_memory		= agp_generic_mask_memory,
1407 	.masks			= intel_generic_masks,
1408 	.agp_enable		= agp_generic_enable,
1409 	.cache_flush		= global_cache_flush,
1410 	.create_gatt_table	= agp_generic_create_gatt_table,
1411 	.free_gatt_table	= agp_generic_free_gatt_table,
1412 	.insert_memory		= agp_generic_insert_memory,
1413 	.remove_memory		= agp_generic_remove_memory,
1414 	.alloc_by_type		= agp_generic_alloc_by_type,
1415 	.free_by_type		= agp_generic_free_by_type,
1416 	.agp_alloc_page		= agp_generic_alloc_page,
1417 	.agp_destroy_page	= agp_generic_destroy_page,
1418 };
1419 
1420 static struct agp_bridge_driver intel_850_driver = {
1421 	.owner			= THIS_MODULE,
1422 	.aperture_sizes		= intel_8xx_sizes,
1423 	.size_type		= U8_APER_SIZE,
1424 	.num_aperture_sizes	= 7,
1425 	.configure		= intel_850_configure,
1426 	.fetch_size		= intel_8xx_fetch_size,
1427 	.cleanup		= intel_8xx_cleanup,
1428 	.tlb_flush		= intel_8xx_tlbflush,
1429 	.mask_memory		= agp_generic_mask_memory,
1430 	.masks			= intel_generic_masks,
1431 	.agp_enable		= agp_generic_enable,
1432 	.cache_flush		= global_cache_flush,
1433 	.create_gatt_table	= agp_generic_create_gatt_table,
1434 	.free_gatt_table	= agp_generic_free_gatt_table,
1435 	.insert_memory		= agp_generic_insert_memory,
1436 	.remove_memory		= agp_generic_remove_memory,
1437 	.alloc_by_type		= agp_generic_alloc_by_type,
1438 	.free_by_type		= agp_generic_free_by_type,
1439 	.agp_alloc_page		= agp_generic_alloc_page,
1440 	.agp_destroy_page	= agp_generic_destroy_page,
1441 };
1442 
1443 static struct agp_bridge_driver intel_860_driver = {
1444 	.owner			= THIS_MODULE,
1445 	.aperture_sizes		= intel_8xx_sizes,
1446 	.size_type		= U8_APER_SIZE,
1447 	.num_aperture_sizes	= 7,
1448 	.configure		= intel_860_configure,
1449 	.fetch_size		= intel_8xx_fetch_size,
1450 	.cleanup		= intel_8xx_cleanup,
1451 	.tlb_flush		= intel_8xx_tlbflush,
1452 	.mask_memory		= agp_generic_mask_memory,
1453 	.masks			= intel_generic_masks,
1454 	.agp_enable		= agp_generic_enable,
1455 	.cache_flush		= global_cache_flush,
1456 	.create_gatt_table	= agp_generic_create_gatt_table,
1457 	.free_gatt_table	= agp_generic_free_gatt_table,
1458 	.insert_memory		= agp_generic_insert_memory,
1459 	.remove_memory		= agp_generic_remove_memory,
1460 	.alloc_by_type		= agp_generic_alloc_by_type,
1461 	.free_by_type		= agp_generic_free_by_type,
1462 	.agp_alloc_page		= agp_generic_alloc_page,
1463 	.agp_destroy_page	= agp_generic_destroy_page,
1464 };
1465 
1466 static struct agp_bridge_driver intel_915_driver = {
1467 	.owner			= THIS_MODULE,
1468 	.aperture_sizes		= intel_i830_sizes,
1469 	.size_type		= FIXED_APER_SIZE,
1470 	.num_aperture_sizes	= 3,
1471 	.needs_scratch_page	= TRUE,
1472 	.configure		= intel_i915_configure,
1473 	.fetch_size		= intel_i915_fetch_size,
1474 	.cleanup		= intel_i915_cleanup,
1475 	.tlb_flush		= intel_i810_tlbflush,
1476 	.mask_memory		= intel_i810_mask_memory,
1477 	.masks			= intel_i810_masks,
1478 	.agp_enable		= intel_i810_agp_enable,
1479 	.cache_flush		= global_cache_flush,
1480 	.create_gatt_table	= intel_i915_create_gatt_table,
1481 	.free_gatt_table	= intel_i830_free_gatt_table,
1482 	.insert_memory		= intel_i915_insert_entries,
1483 	.remove_memory		= intel_i915_remove_entries,
1484 	.alloc_by_type		= intel_i830_alloc_by_type,
1485 	.free_by_type		= intel_i810_free_by_type,
1486 	.agp_alloc_page		= agp_generic_alloc_page,
1487 	.agp_destroy_page	= agp_generic_destroy_page,
1488 };
1489 
1490 
1491 static struct agp_bridge_driver intel_7505_driver = {
1492 	.owner			= THIS_MODULE,
1493 	.aperture_sizes		= intel_8xx_sizes,
1494 	.size_type		= U8_APER_SIZE,
1495 	.num_aperture_sizes	= 7,
1496 	.configure		= intel_7505_configure,
1497 	.fetch_size		= intel_8xx_fetch_size,
1498 	.cleanup		= intel_8xx_cleanup,
1499 	.tlb_flush		= intel_8xx_tlbflush,
1500 	.mask_memory		= agp_generic_mask_memory,
1501 	.masks			= intel_generic_masks,
1502 	.agp_enable		= agp_generic_enable,
1503 	.cache_flush		= global_cache_flush,
1504 	.create_gatt_table	= agp_generic_create_gatt_table,
1505 	.free_gatt_table	= agp_generic_free_gatt_table,
1506 	.insert_memory		= agp_generic_insert_memory,
1507 	.remove_memory		= agp_generic_remove_memory,
1508 	.alloc_by_type		= agp_generic_alloc_by_type,
1509 	.free_by_type		= agp_generic_free_by_type,
1510 	.agp_alloc_page		= agp_generic_alloc_page,
1511 	.agp_destroy_page	= agp_generic_destroy_page,
1512 };
1513 
1514 static int find_i810(u16 device)
1515 {
1516 	struct pci_dev *i810_dev;
1517 
1518 	i810_dev = pci_get_device(PCI_VENDOR_ID_INTEL, device, NULL);
1519 	if (!i810_dev)
1520 		return 0;
1521 	intel_i810_private.i810_dev = i810_dev;
1522 	return 1;
1523 }
1524 
1525 static int find_i830(u16 device)
1526 {
1527 	struct pci_dev *i830_dev;
1528 
1529 	i830_dev = pci_get_device(PCI_VENDOR_ID_INTEL, device, NULL);
1530 	if (i830_dev && PCI_FUNC(i830_dev->devfn) != 0) {
1531 		i830_dev = pci_get_device(PCI_VENDOR_ID_INTEL,
1532 				device, i830_dev);
1533 	}
1534 
1535 	if (!i830_dev)
1536 		return 0;
1537 
1538 	intel_i830_private.i830_dev = i830_dev;
1539 	return 1;
1540 }
1541 
1542 static int __devinit agp_intel_probe(struct pci_dev *pdev,
1543 				     const struct pci_device_id *ent)
1544 {
1545 	struct agp_bridge_data *bridge;
1546 	char *name = "(unknown)";
1547 	u8 cap_ptr = 0;
1548 	struct resource *r;
1549 
1550 	cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP);
1551 
1552 	bridge = agp_alloc_bridge();
1553 	if (!bridge)
1554 		return -ENOMEM;
1555 
1556 	switch (pdev->device) {
1557 	case PCI_DEVICE_ID_INTEL_82443LX_0:
1558 		bridge->driver = &intel_generic_driver;
1559 		name = "440LX";
1560 		break;
1561 	case PCI_DEVICE_ID_INTEL_82443BX_0:
1562 		bridge->driver = &intel_generic_driver;
1563 		name = "440BX";
1564 		break;
1565 	case PCI_DEVICE_ID_INTEL_82443GX_0:
1566 		bridge->driver = &intel_generic_driver;
1567 		name = "440GX";
1568 		break;
1569 	case PCI_DEVICE_ID_INTEL_82810_MC1:
1570 		name = "i810";
1571 		if (!find_i810(PCI_DEVICE_ID_INTEL_82810_IG1))
1572 			goto fail;
1573 		bridge->driver = &intel_810_driver;
1574 		break;
1575 	case PCI_DEVICE_ID_INTEL_82810_MC3:
1576 		name = "i810 DC100";
1577 		if (!find_i810(PCI_DEVICE_ID_INTEL_82810_IG3))
1578 			goto fail;
1579 		bridge->driver = &intel_810_driver;
1580 		break;
1581 	case PCI_DEVICE_ID_INTEL_82810E_MC:
1582 		name = "i810 E";
1583 		if (!find_i810(PCI_DEVICE_ID_INTEL_82810E_IG))
1584 			goto fail;
1585 		bridge->driver = &intel_810_driver;
1586 		break;
1587 	 case PCI_DEVICE_ID_INTEL_82815_MC:
1588 		/*
1589 		 * The i815 can operate either as an i810 style
1590 		 * integrated device, or as an AGP4X motherboard.
1591 		 */
1592 		if (find_i810(PCI_DEVICE_ID_INTEL_82815_CGC))
1593 			bridge->driver = &intel_810_driver;
1594 		else
1595 			bridge->driver = &intel_815_driver;
1596 		name = "i815";
1597 		break;
1598 	case PCI_DEVICE_ID_INTEL_82820_HB:
1599 	case PCI_DEVICE_ID_INTEL_82820_UP_HB:
1600 		bridge->driver = &intel_820_driver;
1601 		name = "i820";
1602 		break;
1603 	case PCI_DEVICE_ID_INTEL_82830_HB:
1604 		if (find_i830(PCI_DEVICE_ID_INTEL_82830_CGC)) {
1605 			bridge->driver = &intel_830_driver;
1606 		} else {
1607 			bridge->driver = &intel_830mp_driver;
1608 		}
1609 		name = "830M";
1610 		break;
1611 	case PCI_DEVICE_ID_INTEL_82840_HB:
1612 		bridge->driver = &intel_840_driver;
1613 		name = "i840";
1614 		break;
1615 	case PCI_DEVICE_ID_INTEL_82845_HB:
1616 		bridge->driver = &intel_845_driver;
1617 		name = "i845";
1618 		break;
1619 	case PCI_DEVICE_ID_INTEL_82845G_HB:
1620 		if (find_i830(PCI_DEVICE_ID_INTEL_82845G_IG)) {
1621 			bridge->driver = &intel_830_driver;
1622 		} else {
1623 			bridge->driver = &intel_845_driver;
1624 		}
1625 		name = "845G";
1626 		break;
1627 	case PCI_DEVICE_ID_INTEL_82850_HB:
1628 		bridge->driver = &intel_850_driver;
1629 		name = "i850";
1630 		break;
1631 	case PCI_DEVICE_ID_INTEL_82855PM_HB:
1632 		bridge->driver = &intel_845_driver;
1633 		name = "855PM";
1634 		break;
1635 	case PCI_DEVICE_ID_INTEL_82855GM_HB:
1636 		if (find_i830(PCI_DEVICE_ID_INTEL_82855GM_IG)) {
1637 			bridge->driver = &intel_830_driver;
1638 			name = "855";
1639 		} else {
1640 			bridge->driver = &intel_845_driver;
1641 			name = "855GM";
1642 		}
1643 		break;
1644 	case PCI_DEVICE_ID_INTEL_82860_HB:
1645 		bridge->driver = &intel_860_driver;
1646 		name = "i860";
1647 		break;
1648 	case PCI_DEVICE_ID_INTEL_82865_HB:
1649 		if (find_i830(PCI_DEVICE_ID_INTEL_82865_IG)) {
1650 			bridge->driver = &intel_830_driver;
1651 		} else {
1652 			bridge->driver = &intel_845_driver;
1653 		}
1654 		name = "865";
1655 		break;
1656 	case PCI_DEVICE_ID_INTEL_82875_HB:
1657 		bridge->driver = &intel_845_driver;
1658 		name = "i875";
1659 		break;
1660 	case PCI_DEVICE_ID_INTEL_82915G_HB:
1661 		if (find_i830(PCI_DEVICE_ID_INTEL_82915G_IG)) {
1662 			bridge->driver = &intel_915_driver;
1663 		} else {
1664 			bridge->driver = &intel_845_driver;
1665 		}
1666 		name = "915G";
1667 		break;
1668 	case PCI_DEVICE_ID_INTEL_82915GM_HB:
1669 		if (find_i830(PCI_DEVICE_ID_INTEL_82915GM_IG)) {
1670 			bridge->driver = &intel_915_driver;
1671 		} else {
1672 			bridge->driver = &intel_845_driver;
1673 		}
1674 		name = "915GM";
1675 		break;
1676 	case PCI_DEVICE_ID_INTEL_82945G_HB:
1677 		if (find_i830(PCI_DEVICE_ID_INTEL_82945G_IG)) {
1678 			bridge->driver = &intel_915_driver;
1679 		} else {
1680 			bridge->driver = &intel_845_driver;
1681 		}
1682 		name = "945G";
1683 		break;
1684 	case PCI_DEVICE_ID_INTEL_7505_0:
1685 		bridge->driver = &intel_7505_driver;
1686 		name = "E7505";
1687 		break;
1688 	case PCI_DEVICE_ID_INTEL_7205_0:
1689 		bridge->driver = &intel_7505_driver;
1690 		name = "E7205";
1691 		break;
1692 	default:
1693 		if (cap_ptr)
1694 			printk(KERN_WARNING PFX "Unsupported Intel chipset (device id: %04x)\n",
1695 			    pdev->device);
1696 		agp_put_bridge(bridge);
1697 		return -ENODEV;
1698 	};
1699 
1700 	bridge->dev = pdev;
1701 	bridge->capndx = cap_ptr;
1702 
1703 	if (bridge->driver == &intel_810_driver)
1704 		bridge->dev_private_data = &intel_i810_private;
1705 	else if (bridge->driver == &intel_830_driver)
1706 		bridge->dev_private_data = &intel_i830_private;
1707 
1708 	printk(KERN_INFO PFX "Detected an Intel %s Chipset.\n", name);
1709 
1710 	/*
1711 	* The following fixes the case where the BIOS has "forgotten" to
1712 	* provide an address range for the GART.
1713 	* 20030610 - hamish@zot.org
1714 	*/
1715 	r = &pdev->resource[0];
1716 	if (!r->start && r->end) {
1717 		if(pci_assign_resource(pdev, 0)) {
1718 			printk(KERN_ERR PFX "could not assign resource 0\n");
1719 			agp_put_bridge(bridge);
1720 			return -ENODEV;
1721 		}
1722 	}
1723 
1724 	/*
1725 	* If the device has not been properly setup, the following will catch
1726 	* the problem and should stop the system from crashing.
1727 	* 20030610 - hamish@zot.org
1728 	*/
1729 	if (pci_enable_device(pdev)) {
1730 		printk(KERN_ERR PFX "Unable to Enable PCI device\n");
1731 		agp_put_bridge(bridge);
1732 		return -ENODEV;
1733 	}
1734 
1735 	/* Fill in the mode register */
1736 	if (cap_ptr) {
1737 		pci_read_config_dword(pdev,
1738 				bridge->capndx+PCI_AGP_STATUS,
1739 				&bridge->mode);
1740 	}
1741 
1742 	pci_set_drvdata(pdev, bridge);
1743 	return agp_add_bridge(bridge);
1744 
1745 fail:
1746 	printk(KERN_ERR PFX "Detected an Intel %s chipset, "
1747 		"but could not find the secondary device.\n", name);
1748 	agp_put_bridge(bridge);
1749 	return -ENODEV;
1750 }
1751 
1752 static void __devexit agp_intel_remove(struct pci_dev *pdev)
1753 {
1754 	struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
1755 
1756 	agp_remove_bridge(bridge);
1757 
1758 	if (intel_i810_private.i810_dev)
1759 		pci_dev_put(intel_i810_private.i810_dev);
1760 	if (intel_i830_private.i830_dev)
1761 		pci_dev_put(intel_i830_private.i830_dev);
1762 
1763 	agp_put_bridge(bridge);
1764 }
1765 
1766 static int agp_intel_resume(struct pci_dev *pdev)
1767 {
1768 	struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
1769 
1770 	pci_restore_state(pdev);
1771 
1772 	if (bridge->driver == &intel_generic_driver)
1773 		intel_configure();
1774 	else if (bridge->driver == &intel_850_driver)
1775 		intel_850_configure();
1776 	else if (bridge->driver == &intel_845_driver)
1777 		intel_845_configure();
1778 	else if (bridge->driver == &intel_830mp_driver)
1779 		intel_830mp_configure();
1780 	else if (bridge->driver == &intel_915_driver)
1781 		intel_i915_configure();
1782 	else if (bridge->driver == &intel_830_driver)
1783 		intel_i830_configure();
1784 	else if (bridge->driver == &intel_810_driver)
1785 		intel_i810_configure();
1786 
1787 	return 0;
1788 }
1789 
1790 static struct pci_device_id agp_intel_pci_table[] = {
1791 #define ID(x)						\
1792 	{						\
1793 	.class		= (PCI_CLASS_BRIDGE_HOST << 8),	\
1794 	.class_mask	= ~0,				\
1795 	.vendor		= PCI_VENDOR_ID_INTEL,		\
1796 	.device		= x,				\
1797 	.subvendor	= PCI_ANY_ID,			\
1798 	.subdevice	= PCI_ANY_ID,			\
1799 	}
1800 	ID(PCI_DEVICE_ID_INTEL_82443LX_0),
1801 	ID(PCI_DEVICE_ID_INTEL_82443BX_0),
1802 	ID(PCI_DEVICE_ID_INTEL_82443GX_0),
1803 	ID(PCI_DEVICE_ID_INTEL_82810_MC1),
1804 	ID(PCI_DEVICE_ID_INTEL_82810_MC3),
1805 	ID(PCI_DEVICE_ID_INTEL_82810E_MC),
1806 	ID(PCI_DEVICE_ID_INTEL_82815_MC),
1807 	ID(PCI_DEVICE_ID_INTEL_82820_HB),
1808 	ID(PCI_DEVICE_ID_INTEL_82820_UP_HB),
1809 	ID(PCI_DEVICE_ID_INTEL_82830_HB),
1810 	ID(PCI_DEVICE_ID_INTEL_82840_HB),
1811 	ID(PCI_DEVICE_ID_INTEL_82845_HB),
1812 	ID(PCI_DEVICE_ID_INTEL_82845G_HB),
1813 	ID(PCI_DEVICE_ID_INTEL_82850_HB),
1814 	ID(PCI_DEVICE_ID_INTEL_82855PM_HB),
1815 	ID(PCI_DEVICE_ID_INTEL_82855GM_HB),
1816 	ID(PCI_DEVICE_ID_INTEL_82860_HB),
1817 	ID(PCI_DEVICE_ID_INTEL_82865_HB),
1818 	ID(PCI_DEVICE_ID_INTEL_82875_HB),
1819 	ID(PCI_DEVICE_ID_INTEL_7505_0),
1820 	ID(PCI_DEVICE_ID_INTEL_7205_0),
1821 	ID(PCI_DEVICE_ID_INTEL_82915G_HB),
1822 	ID(PCI_DEVICE_ID_INTEL_82915GM_HB),
1823 	ID(PCI_DEVICE_ID_INTEL_82945G_HB),
1824 	{ }
1825 };
1826 
1827 MODULE_DEVICE_TABLE(pci, agp_intel_pci_table);
1828 
1829 static struct pci_driver agp_intel_pci_driver = {
1830 	.name		= "agpgart-intel",
1831 	.id_table	= agp_intel_pci_table,
1832 	.probe		= agp_intel_probe,
1833 	.remove		= __devexit_p(agp_intel_remove),
1834 	.resume		= agp_intel_resume,
1835 };
1836 
1837 static int __init agp_intel_init(void)
1838 {
1839 	if (agp_off)
1840 		return -EINVAL;
1841 	return pci_register_driver(&agp_intel_pci_driver);
1842 }
1843 
1844 static void __exit agp_intel_cleanup(void)
1845 {
1846 	pci_unregister_driver(&agp_intel_pci_driver);
1847 }
1848 
1849 module_init(agp_intel_init);
1850 module_exit(agp_intel_cleanup);
1851 
1852 MODULE_AUTHOR("Dave Jones <davej@codemonkey.org.uk>");
1853 MODULE_LICENSE("GPL and additional rights");
1854