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