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