xref: /linux/drivers/char/agp/intel-agp.c (revision a1ff5a7d78a036d6c2178ee5acd6ba4946243800)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  * Intel AGPGART routines.
31da177e4SLinus Torvalds  */
41da177e4SLinus Torvalds 
51da177e4SLinus Torvalds #include <linux/module.h>
61da177e4SLinus Torvalds #include <linux/pci.h>
75a0e3ad6STejun Heo #include <linux/slab.h>
81da177e4SLinus Torvalds #include <linux/init.h>
91eaf122cSAhmed S. Darwish #include <linux/kernel.h>
101da177e4SLinus Torvalds #include <linux/pagemap.h>
111da177e4SLinus Torvalds #include <linux/agp_backend.h>
1248a719c2SBorislav Petkov #include <asm/smp.h>
131da177e4SLinus Torvalds #include "agp.h"
14ff7cdd69SDaniel Vetter #include "intel-agp.h"
1505255ccbSJani Nikula #include <drm/intel/intel-gtt.h>
161da177e4SLinus Torvalds 
intel_fetch_size(void)171da177e4SLinus Torvalds static int intel_fetch_size(void)
181da177e4SLinus Torvalds {
191da177e4SLinus Torvalds 	int i;
201da177e4SLinus Torvalds 	u16 temp;
211da177e4SLinus Torvalds 	struct aper_size_info_16 *values;
221da177e4SLinus Torvalds 
231da177e4SLinus Torvalds 	pci_read_config_word(agp_bridge->dev, INTEL_APSIZE, &temp);
241da177e4SLinus Torvalds 	values = A_SIZE_16(agp_bridge->driver->aperture_sizes);
251da177e4SLinus Torvalds 
261da177e4SLinus Torvalds 	for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) {
271da177e4SLinus Torvalds 		if (temp == values[i].size_value) {
281da177e4SLinus Torvalds 			agp_bridge->previous_size = agp_bridge->current_size = (void *) (values + i);
291da177e4SLinus Torvalds 			agp_bridge->aperture_size_idx = i;
301da177e4SLinus Torvalds 			return values[i].size;
311da177e4SLinus Torvalds 		}
321da177e4SLinus Torvalds 	}
331da177e4SLinus Torvalds 
341da177e4SLinus Torvalds 	return 0;
351da177e4SLinus Torvalds }
361da177e4SLinus Torvalds 
__intel_8xx_fetch_size(u8 temp)371da177e4SLinus Torvalds static int __intel_8xx_fetch_size(u8 temp)
381da177e4SLinus Torvalds {
391da177e4SLinus Torvalds 	int i;
401da177e4SLinus Torvalds 	struct aper_size_info_8 *values;
411da177e4SLinus Torvalds 
421da177e4SLinus Torvalds 	values = A_SIZE_8(agp_bridge->driver->aperture_sizes);
431da177e4SLinus Torvalds 
441da177e4SLinus Torvalds 	for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) {
451da177e4SLinus Torvalds 		if (temp == values[i].size_value) {
461da177e4SLinus Torvalds 			agp_bridge->previous_size =
471da177e4SLinus Torvalds 				agp_bridge->current_size = (void *) (values + i);
481da177e4SLinus Torvalds 			agp_bridge->aperture_size_idx = i;
491da177e4SLinus Torvalds 			return values[i].size;
501da177e4SLinus Torvalds 		}
511da177e4SLinus Torvalds 	}
521da177e4SLinus Torvalds 	return 0;
531da177e4SLinus Torvalds }
541da177e4SLinus Torvalds 
intel_8xx_fetch_size(void)551da177e4SLinus Torvalds static int intel_8xx_fetch_size(void)
561da177e4SLinus Torvalds {
571da177e4SLinus Torvalds 	u8 temp;
581da177e4SLinus Torvalds 
591da177e4SLinus Torvalds 	pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp);
601da177e4SLinus Torvalds 	return __intel_8xx_fetch_size(temp);
611da177e4SLinus Torvalds }
621da177e4SLinus Torvalds 
intel_815_fetch_size(void)631da177e4SLinus Torvalds static int intel_815_fetch_size(void)
641da177e4SLinus Torvalds {
651da177e4SLinus Torvalds 	u8 temp;
661da177e4SLinus Torvalds 
671da177e4SLinus Torvalds 	/* Intel 815 chipsets have a _weird_ APSIZE register with only
681da177e4SLinus Torvalds 	 * one non-reserved bit, so mask the others out ... */
691da177e4SLinus Torvalds 	pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp);
701da177e4SLinus Torvalds 	temp &= (1 << 3);
711da177e4SLinus Torvalds 
721da177e4SLinus Torvalds 	return __intel_8xx_fetch_size(temp);
731da177e4SLinus Torvalds }
741da177e4SLinus Torvalds 
intel_tlbflush(struct agp_memory * mem)751da177e4SLinus Torvalds static void intel_tlbflush(struct agp_memory *mem)
761da177e4SLinus Torvalds {
771da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2200);
781da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280);
791da177e4SLinus Torvalds }
801da177e4SLinus Torvalds 
811da177e4SLinus Torvalds 
intel_8xx_tlbflush(struct agp_memory * mem)821da177e4SLinus Torvalds static void intel_8xx_tlbflush(struct agp_memory *mem)
831da177e4SLinus Torvalds {
841da177e4SLinus Torvalds 	u32 temp;
851da177e4SLinus Torvalds 	pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp);
861da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp & ~(1 << 7));
871da177e4SLinus Torvalds 	pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp);
881da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp | (1 << 7));
891da177e4SLinus Torvalds }
901da177e4SLinus Torvalds 
911da177e4SLinus Torvalds 
intel_cleanup(void)921da177e4SLinus Torvalds static void intel_cleanup(void)
931da177e4SLinus Torvalds {
941da177e4SLinus Torvalds 	u16 temp;
951da177e4SLinus Torvalds 	struct aper_size_info_16 *previous_size;
961da177e4SLinus Torvalds 
971da177e4SLinus Torvalds 	previous_size = A_SIZE_16(agp_bridge->previous_size);
981da177e4SLinus Torvalds 	pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp);
991da177e4SLinus Torvalds 	pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9));
1001da177e4SLinus Torvalds 	pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value);
1011da177e4SLinus Torvalds }
1021da177e4SLinus Torvalds 
1031da177e4SLinus Torvalds 
intel_8xx_cleanup(void)1041da177e4SLinus Torvalds static void intel_8xx_cleanup(void)
1051da177e4SLinus Torvalds {
1061da177e4SLinus Torvalds 	u16 temp;
1071da177e4SLinus Torvalds 	struct aper_size_info_8 *previous_size;
1081da177e4SLinus Torvalds 
1091da177e4SLinus Torvalds 	previous_size = A_SIZE_8(agp_bridge->previous_size);
1101da177e4SLinus Torvalds 	pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp);
1111da177e4SLinus Torvalds 	pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9));
1121da177e4SLinus Torvalds 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value);
1131da177e4SLinus Torvalds }
1141da177e4SLinus Torvalds 
1151da177e4SLinus Torvalds 
intel_configure(void)1161da177e4SLinus Torvalds static int intel_configure(void)
1171da177e4SLinus Torvalds {
1181da177e4SLinus Torvalds 	u16 temp2;
1191da177e4SLinus Torvalds 	struct aper_size_info_16 *current_size;
1201da177e4SLinus Torvalds 
1211da177e4SLinus Torvalds 	current_size = A_SIZE_16(agp_bridge->current_size);
1221da177e4SLinus Torvalds 
1231da177e4SLinus Torvalds 	/* aperture size */
1241da177e4SLinus Torvalds 	pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
1251da177e4SLinus Torvalds 
1261da177e4SLinus Torvalds 	/* address to map to */
127e501b3d8SBjorn Helgaas 	agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
128e501b3d8SBjorn Helgaas 						    AGP_APERTURE_BAR);
1291da177e4SLinus Torvalds 
1301da177e4SLinus Torvalds 	/* attbase - aperture base */
1311da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
1321da177e4SLinus Torvalds 
1331da177e4SLinus Torvalds 	/* agpctrl */
1341da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280);
1351da177e4SLinus Torvalds 
1361da177e4SLinus Torvalds 	/* paccfg/nbxcfg */
1371da177e4SLinus Torvalds 	pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2);
1381da177e4SLinus Torvalds 	pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG,
1391da177e4SLinus Torvalds 			(temp2 & ~(1 << 10)) | (1 << 9));
1401da177e4SLinus Torvalds 	/* clear any possible error conditions */
1411da177e4SLinus Torvalds 	pci_write_config_byte(agp_bridge->dev, INTEL_ERRSTS + 1, 7);
1421da177e4SLinus Torvalds 	return 0;
1431da177e4SLinus Torvalds }
1441da177e4SLinus Torvalds 
intel_815_configure(void)1451da177e4SLinus Torvalds static int intel_815_configure(void)
1461da177e4SLinus Torvalds {
147e501b3d8SBjorn Helgaas 	u32 addr;
1481da177e4SLinus Torvalds 	u8 temp2;
1491da177e4SLinus Torvalds 	struct aper_size_info_8 *current_size;
1501da177e4SLinus Torvalds 
1511da177e4SLinus Torvalds 	/* attbase - aperture base */
1521da177e4SLinus Torvalds 	/* the Intel 815 chipset spec. says that bits 29-31 in the
1531da177e4SLinus Torvalds 	* ATTBASE register are reserved -> try not to write them */
1541da177e4SLinus Torvalds 	if (agp_bridge->gatt_bus_addr & INTEL_815_ATTBASE_MASK) {
155e3cf6951SBjorn Helgaas 		dev_emerg(&agp_bridge->dev->dev, "gatt bus addr too high");
1561da177e4SLinus Torvalds 		return -EINVAL;
1571da177e4SLinus Torvalds 	}
1581da177e4SLinus Torvalds 
1591da177e4SLinus Torvalds 	current_size = A_SIZE_8(agp_bridge->current_size);
1601da177e4SLinus Torvalds 
1611da177e4SLinus Torvalds 	/* aperture size */
1621da177e4SLinus Torvalds 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE,
1631da177e4SLinus Torvalds 			current_size->size_value);
1641da177e4SLinus Torvalds 
1651da177e4SLinus Torvalds 	/* address to map to */
166e501b3d8SBjorn Helgaas 	agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
167e501b3d8SBjorn Helgaas 						    AGP_APERTURE_BAR);
1681da177e4SLinus Torvalds 
1691da177e4SLinus Torvalds 	pci_read_config_dword(agp_bridge->dev, INTEL_ATTBASE, &addr);
1701da177e4SLinus Torvalds 	addr &= INTEL_815_ATTBASE_MASK;
1711da177e4SLinus Torvalds 	addr |= agp_bridge->gatt_bus_addr;
1721da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, addr);
1731da177e4SLinus Torvalds 
1741da177e4SLinus Torvalds 	/* agpctrl */
1751da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
1761da177e4SLinus Torvalds 
1771da177e4SLinus Torvalds 	/* apcont */
1781da177e4SLinus Torvalds 	pci_read_config_byte(agp_bridge->dev, INTEL_815_APCONT, &temp2);
1791da177e4SLinus Torvalds 	pci_write_config_byte(agp_bridge->dev, INTEL_815_APCONT, temp2 | (1 << 1));
1801da177e4SLinus Torvalds 
1811da177e4SLinus Torvalds 	/* clear any possible error conditions */
1821da177e4SLinus Torvalds 	/* Oddness : this chipset seems to have no ERRSTS register ! */
1831da177e4SLinus Torvalds 	return 0;
1841da177e4SLinus Torvalds }
1851da177e4SLinus Torvalds 
intel_820_tlbflush(struct agp_memory * mem)1861da177e4SLinus Torvalds static void intel_820_tlbflush(struct agp_memory *mem)
1871da177e4SLinus Torvalds {
1881da177e4SLinus Torvalds 	return;
1891da177e4SLinus Torvalds }
1901da177e4SLinus Torvalds 
intel_820_cleanup(void)1911da177e4SLinus Torvalds static void intel_820_cleanup(void)
1921da177e4SLinus Torvalds {
1931da177e4SLinus Torvalds 	u8 temp;
1941da177e4SLinus Torvalds 	struct aper_size_info_8 *previous_size;
1951da177e4SLinus Torvalds 
1961da177e4SLinus Torvalds 	previous_size = A_SIZE_8(agp_bridge->previous_size);
1971da177e4SLinus Torvalds 	pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp);
1981da177e4SLinus Torvalds 	pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR,
1991da177e4SLinus Torvalds 			temp & ~(1 << 1));
2001da177e4SLinus Torvalds 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE,
2011da177e4SLinus Torvalds 			previous_size->size_value);
2021da177e4SLinus Torvalds }
2031da177e4SLinus Torvalds 
2041da177e4SLinus Torvalds 
intel_820_configure(void)2051da177e4SLinus Torvalds static int intel_820_configure(void)
2061da177e4SLinus Torvalds {
2071da177e4SLinus Torvalds 	u8 temp2;
2081da177e4SLinus Torvalds 	struct aper_size_info_8 *current_size;
2091da177e4SLinus Torvalds 
2101da177e4SLinus Torvalds 	current_size = A_SIZE_8(agp_bridge->current_size);
2111da177e4SLinus Torvalds 
2121da177e4SLinus Torvalds 	/* aperture size */
2131da177e4SLinus Torvalds 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
2141da177e4SLinus Torvalds 
2151da177e4SLinus Torvalds 	/* address to map to */
216e501b3d8SBjorn Helgaas 	agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
217e501b3d8SBjorn Helgaas 						    AGP_APERTURE_BAR);
2181da177e4SLinus Torvalds 
2191da177e4SLinus Torvalds 	/* attbase - aperture base */
2201da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
2211da177e4SLinus Torvalds 
2221da177e4SLinus Torvalds 	/* agpctrl */
2231da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
2241da177e4SLinus Torvalds 
2251da177e4SLinus Torvalds 	/* global enable aperture access */
2261da177e4SLinus Torvalds 	/* This flag is not accessed through MCHCFG register as in */
2271da177e4SLinus Torvalds 	/* i850 chipset. */
2281da177e4SLinus Torvalds 	pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp2);
2291da177e4SLinus Torvalds 	pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR, temp2 | (1 << 1));
2301da177e4SLinus Torvalds 	/* clear any possible AGP-related error conditions */
2311da177e4SLinus Torvalds 	pci_write_config_word(agp_bridge->dev, INTEL_I820_ERRSTS, 0x001c);
2321da177e4SLinus Torvalds 	return 0;
2331da177e4SLinus Torvalds }
2341da177e4SLinus Torvalds 
intel_840_configure(void)2351da177e4SLinus Torvalds static int intel_840_configure(void)
2361da177e4SLinus Torvalds {
2371da177e4SLinus Torvalds 	u16 temp2;
2381da177e4SLinus Torvalds 	struct aper_size_info_8 *current_size;
2391da177e4SLinus Torvalds 
2401da177e4SLinus Torvalds 	current_size = A_SIZE_8(agp_bridge->current_size);
2411da177e4SLinus Torvalds 
2421da177e4SLinus Torvalds 	/* aperture size */
2431da177e4SLinus Torvalds 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
2441da177e4SLinus Torvalds 
2451da177e4SLinus Torvalds 	/* address to map to */
246e501b3d8SBjorn Helgaas 	agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
247e501b3d8SBjorn Helgaas 						    AGP_APERTURE_BAR);
2481da177e4SLinus Torvalds 
2491da177e4SLinus Torvalds 	/* attbase - aperture base */
2501da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
2511da177e4SLinus Torvalds 
2521da177e4SLinus Torvalds 	/* agpctrl */
2531da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
2541da177e4SLinus Torvalds 
2551da177e4SLinus Torvalds 	/* mcgcfg */
2561da177e4SLinus Torvalds 	pci_read_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, &temp2);
2571da177e4SLinus Torvalds 	pci_write_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, temp2 | (1 << 9));
2581da177e4SLinus Torvalds 	/* clear any possible error conditions */
2591da177e4SLinus Torvalds 	pci_write_config_word(agp_bridge->dev, INTEL_I840_ERRSTS, 0xc000);
2601da177e4SLinus Torvalds 	return 0;
2611da177e4SLinus Torvalds }
2621da177e4SLinus Torvalds 
intel_845_configure(void)2631da177e4SLinus Torvalds static int intel_845_configure(void)
2641da177e4SLinus Torvalds {
2651da177e4SLinus Torvalds 	u8 temp2;
2661da177e4SLinus Torvalds 	struct aper_size_info_8 *current_size;
2671da177e4SLinus Torvalds 
2681da177e4SLinus Torvalds 	current_size = A_SIZE_8(agp_bridge->current_size);
2691da177e4SLinus Torvalds 
2701da177e4SLinus Torvalds 	/* aperture size */
2711da177e4SLinus Torvalds 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
2721da177e4SLinus Torvalds 
273b0825488SMatthew Garrett 	if (agp_bridge->apbase_config != 0) {
274b0825488SMatthew Garrett 		pci_write_config_dword(agp_bridge->dev, AGP_APBASE,
275b0825488SMatthew Garrett 				       agp_bridge->apbase_config);
276b0825488SMatthew Garrett 	} else {
2771da177e4SLinus Torvalds 		/* address to map to */
278e501b3d8SBjorn Helgaas 		agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
279e501b3d8SBjorn Helgaas 							    AGP_APERTURE_BAR);
280e501b3d8SBjorn Helgaas 		agp_bridge->apbase_config = agp_bridge->gart_bus_addr;
281b0825488SMatthew Garrett 	}
2821da177e4SLinus Torvalds 
2831da177e4SLinus Torvalds 	/* attbase - aperture base */
2841da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
2851da177e4SLinus Torvalds 
2861da177e4SLinus Torvalds 	/* agpctrl */
2871da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
2881da177e4SLinus Torvalds 
2891da177e4SLinus Torvalds 	/* agpm */
2901da177e4SLinus Torvalds 	pci_read_config_byte(agp_bridge->dev, INTEL_I845_AGPM, &temp2);
2911da177e4SLinus Torvalds 	pci_write_config_byte(agp_bridge->dev, INTEL_I845_AGPM, temp2 | (1 << 1));
2921da177e4SLinus Torvalds 	/* clear any possible error conditions */
2931da177e4SLinus Torvalds 	pci_write_config_word(agp_bridge->dev, INTEL_I845_ERRSTS, 0x001c);
2941da177e4SLinus Torvalds 	return 0;
2951da177e4SLinus Torvalds }
2961da177e4SLinus Torvalds 
intel_850_configure(void)2971da177e4SLinus Torvalds static int intel_850_configure(void)
2981da177e4SLinus Torvalds {
2991da177e4SLinus Torvalds 	u16 temp2;
3001da177e4SLinus Torvalds 	struct aper_size_info_8 *current_size;
3011da177e4SLinus Torvalds 
3021da177e4SLinus Torvalds 	current_size = A_SIZE_8(agp_bridge->current_size);
3031da177e4SLinus Torvalds 
3041da177e4SLinus Torvalds 	/* aperture size */
3051da177e4SLinus Torvalds 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
3061da177e4SLinus Torvalds 
3071da177e4SLinus Torvalds 	/* address to map to */
308e501b3d8SBjorn Helgaas 	agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
309e501b3d8SBjorn Helgaas 						    AGP_APERTURE_BAR);
3101da177e4SLinus Torvalds 
3111da177e4SLinus Torvalds 	/* attbase - aperture base */
3121da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
3131da177e4SLinus Torvalds 
3141da177e4SLinus Torvalds 	/* agpctrl */
3151da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
3161da177e4SLinus Torvalds 
3171da177e4SLinus Torvalds 	/* mcgcfg */
3181da177e4SLinus Torvalds 	pci_read_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, &temp2);
3191da177e4SLinus Torvalds 	pci_write_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, temp2 | (1 << 9));
3201da177e4SLinus Torvalds 	/* clear any possible AGP-related error conditions */
3211da177e4SLinus Torvalds 	pci_write_config_word(agp_bridge->dev, INTEL_I850_ERRSTS, 0x001c);
3221da177e4SLinus Torvalds 	return 0;
3231da177e4SLinus Torvalds }
3241da177e4SLinus Torvalds 
intel_860_configure(void)3251da177e4SLinus Torvalds static int intel_860_configure(void)
3261da177e4SLinus Torvalds {
3271da177e4SLinus Torvalds 	u16 temp2;
3281da177e4SLinus Torvalds 	struct aper_size_info_8 *current_size;
3291da177e4SLinus Torvalds 
3301da177e4SLinus Torvalds 	current_size = A_SIZE_8(agp_bridge->current_size);
3311da177e4SLinus Torvalds 
3321da177e4SLinus Torvalds 	/* aperture size */
3331da177e4SLinus Torvalds 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
3341da177e4SLinus Torvalds 
3351da177e4SLinus Torvalds 	/* address to map to */
336e501b3d8SBjorn Helgaas 	agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
337e501b3d8SBjorn Helgaas 						    AGP_APERTURE_BAR);
3381da177e4SLinus Torvalds 
3391da177e4SLinus Torvalds 	/* attbase - aperture base */
3401da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
3411da177e4SLinus Torvalds 
3421da177e4SLinus Torvalds 	/* agpctrl */
3431da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
3441da177e4SLinus Torvalds 
3451da177e4SLinus Torvalds 	/* mcgcfg */
3461da177e4SLinus Torvalds 	pci_read_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, &temp2);
3471da177e4SLinus Torvalds 	pci_write_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, temp2 | (1 << 9));
3481da177e4SLinus Torvalds 	/* clear any possible AGP-related error conditions */
3491da177e4SLinus Torvalds 	pci_write_config_word(agp_bridge->dev, INTEL_I860_ERRSTS, 0xf700);
3501da177e4SLinus Torvalds 	return 0;
3511da177e4SLinus Torvalds }
3521da177e4SLinus Torvalds 
intel_830mp_configure(void)3531da177e4SLinus Torvalds static int intel_830mp_configure(void)
3541da177e4SLinus Torvalds {
3551da177e4SLinus Torvalds 	u16 temp2;
3561da177e4SLinus Torvalds 	struct aper_size_info_8 *current_size;
3571da177e4SLinus Torvalds 
3581da177e4SLinus Torvalds 	current_size = A_SIZE_8(agp_bridge->current_size);
3591da177e4SLinus Torvalds 
3601da177e4SLinus Torvalds 	/* aperture size */
3611da177e4SLinus Torvalds 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
3621da177e4SLinus Torvalds 
3631da177e4SLinus Torvalds 	/* address to map to */
364e501b3d8SBjorn Helgaas 	agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
365e501b3d8SBjorn Helgaas 						    AGP_APERTURE_BAR);
3661da177e4SLinus Torvalds 
3671da177e4SLinus Torvalds 	/* attbase - aperture base */
3681da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
3691da177e4SLinus Torvalds 
3701da177e4SLinus Torvalds 	/* agpctrl */
3711da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
3721da177e4SLinus Torvalds 
3731da177e4SLinus Torvalds 	/* gmch */
3741da177e4SLinus Torvalds 	pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2);
3751da177e4SLinus Torvalds 	pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp2 | (1 << 9));
3761da177e4SLinus Torvalds 	/* clear any possible AGP-related error conditions */
3771da177e4SLinus Torvalds 	pci_write_config_word(agp_bridge->dev, INTEL_I830_ERRSTS, 0x1c);
3781da177e4SLinus Torvalds 	return 0;
3791da177e4SLinus Torvalds }
3801da177e4SLinus Torvalds 
intel_7505_configure(void)3811da177e4SLinus Torvalds static int intel_7505_configure(void)
3821da177e4SLinus Torvalds {
3831da177e4SLinus Torvalds 	u16 temp2;
3841da177e4SLinus Torvalds 	struct aper_size_info_8 *current_size;
3851da177e4SLinus Torvalds 
3861da177e4SLinus Torvalds 	current_size = A_SIZE_8(agp_bridge->current_size);
3871da177e4SLinus Torvalds 
3881da177e4SLinus Torvalds 	/* aperture size */
3891da177e4SLinus Torvalds 	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
3901da177e4SLinus Torvalds 
3911da177e4SLinus Torvalds 	/* address to map to */
392e501b3d8SBjorn Helgaas 	agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
393e501b3d8SBjorn Helgaas 						    AGP_APERTURE_BAR);
3941da177e4SLinus Torvalds 
3951da177e4SLinus Torvalds 	/* attbase - aperture base */
3961da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
3971da177e4SLinus Torvalds 
3981da177e4SLinus Torvalds 	/* agpctrl */
3991da177e4SLinus Torvalds 	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
4001da177e4SLinus Torvalds 
4011da177e4SLinus Torvalds 	/* mchcfg */
4021da177e4SLinus Torvalds 	pci_read_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, &temp2);
4031da177e4SLinus Torvalds 	pci_write_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, temp2 | (1 << 9));
4041da177e4SLinus Torvalds 
4051da177e4SLinus Torvalds 	return 0;
4061da177e4SLinus Torvalds }
4071da177e4SLinus Torvalds 
4081da177e4SLinus Torvalds /* Setup function */
409e5524f35SDave Jones static const struct gatt_mask intel_generic_masks[] =
4101da177e4SLinus Torvalds {
4111da177e4SLinus Torvalds 	{.mask = 0x00000017, .type = 0}
4121da177e4SLinus Torvalds };
4131da177e4SLinus Torvalds 
414e5524f35SDave Jones static const struct aper_size_info_8 intel_815_sizes[2] =
4151da177e4SLinus Torvalds {
4161da177e4SLinus Torvalds 	{64, 16384, 4, 0},
4171da177e4SLinus Torvalds 	{32, 8192, 3, 8},
4181da177e4SLinus Torvalds };
4191da177e4SLinus Torvalds 
420e5524f35SDave Jones static const struct aper_size_info_8 intel_8xx_sizes[7] =
4211da177e4SLinus Torvalds {
4221da177e4SLinus Torvalds 	{256, 65536, 6, 0},
4231da177e4SLinus Torvalds 	{128, 32768, 5, 32},
4241da177e4SLinus Torvalds 	{64, 16384, 4, 48},
4251da177e4SLinus Torvalds 	{32, 8192, 3, 56},
4261da177e4SLinus Torvalds 	{16, 4096, 2, 60},
4271da177e4SLinus Torvalds 	{8, 2048, 1, 62},
4281da177e4SLinus Torvalds 	{4, 1024, 0, 63}
4291da177e4SLinus Torvalds };
4301da177e4SLinus Torvalds 
431e5524f35SDave Jones static const struct aper_size_info_16 intel_generic_sizes[7] =
4321da177e4SLinus Torvalds {
4331da177e4SLinus Torvalds 	{256, 65536, 6, 0},
4341da177e4SLinus Torvalds 	{128, 32768, 5, 32},
4351da177e4SLinus Torvalds 	{64, 16384, 4, 48},
4361da177e4SLinus Torvalds 	{32, 8192, 3, 56},
4371da177e4SLinus Torvalds 	{16, 4096, 2, 60},
4381da177e4SLinus Torvalds 	{8, 2048, 1, 62},
4391da177e4SLinus Torvalds 	{4, 1024, 0, 63}
4401da177e4SLinus Torvalds };
4411da177e4SLinus Torvalds 
442e5524f35SDave Jones static const struct aper_size_info_8 intel_830mp_sizes[4] =
4431da177e4SLinus Torvalds {
4441da177e4SLinus Torvalds 	{256, 65536, 6, 0},
4451da177e4SLinus Torvalds 	{128, 32768, 5, 32},
4461da177e4SLinus Torvalds 	{64, 16384, 4, 48},
4471da177e4SLinus Torvalds 	{32, 8192, 3, 56}
4481da177e4SLinus Torvalds };
4491da177e4SLinus Torvalds 
450e5524f35SDave Jones static const struct agp_bridge_driver intel_generic_driver = {
4511da177e4SLinus Torvalds 	.owner			= THIS_MODULE,
4521da177e4SLinus Torvalds 	.aperture_sizes		= intel_generic_sizes,
4531da177e4SLinus Torvalds 	.size_type		= U16_APER_SIZE,
4541da177e4SLinus Torvalds 	.num_aperture_sizes	= 7,
45561cf0593SJerome Glisse 	.needs_scratch_page	= true,
4561da177e4SLinus Torvalds 	.configure		= intel_configure,
4571da177e4SLinus Torvalds 	.fetch_size		= intel_fetch_size,
4581da177e4SLinus Torvalds 	.cleanup		= intel_cleanup,
4591da177e4SLinus Torvalds 	.tlb_flush		= intel_tlbflush,
4601da177e4SLinus Torvalds 	.mask_memory		= agp_generic_mask_memory,
4611da177e4SLinus Torvalds 	.masks			= intel_generic_masks,
4621da177e4SLinus Torvalds 	.agp_enable		= agp_generic_enable,
4631da177e4SLinus Torvalds 	.cache_flush		= global_cache_flush,
4641da177e4SLinus Torvalds 	.create_gatt_table	= agp_generic_create_gatt_table,
4651da177e4SLinus Torvalds 	.free_gatt_table	= agp_generic_free_gatt_table,
4661da177e4SLinus Torvalds 	.insert_memory		= agp_generic_insert_memory,
4671da177e4SLinus Torvalds 	.remove_memory		= agp_generic_remove_memory,
4681da177e4SLinus Torvalds 	.alloc_by_type		= agp_generic_alloc_by_type,
4691da177e4SLinus Torvalds 	.free_by_type		= agp_generic_free_by_type,
4701da177e4SLinus Torvalds 	.agp_alloc_page		= agp_generic_alloc_page,
47137acee10SShaohua Li 	.agp_alloc_pages        = agp_generic_alloc_pages,
4721da177e4SLinus Torvalds 	.agp_destroy_page	= agp_generic_destroy_page,
473bd07928cSShaohua Li 	.agp_destroy_pages      = agp_generic_destroy_pages,
474a030ce44SThomas Hellstrom 	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
4751da177e4SLinus Torvalds };
4761da177e4SLinus Torvalds 
477e5524f35SDave Jones static const struct agp_bridge_driver intel_815_driver = {
4781da177e4SLinus Torvalds 	.owner			= THIS_MODULE,
4791da177e4SLinus Torvalds 	.aperture_sizes		= intel_815_sizes,
4801da177e4SLinus Torvalds 	.size_type		= U8_APER_SIZE,
4811da177e4SLinus Torvalds 	.num_aperture_sizes	= 2,
48261cf0593SJerome Glisse 	.needs_scratch_page	= true,
4831da177e4SLinus Torvalds 	.configure		= intel_815_configure,
4841da177e4SLinus Torvalds 	.fetch_size		= intel_815_fetch_size,
4851da177e4SLinus Torvalds 	.cleanup		= intel_8xx_cleanup,
4861da177e4SLinus Torvalds 	.tlb_flush		= intel_8xx_tlbflush,
4871da177e4SLinus Torvalds 	.mask_memory		= agp_generic_mask_memory,
4881da177e4SLinus Torvalds 	.masks			= intel_generic_masks,
4891da177e4SLinus Torvalds 	.agp_enable		= agp_generic_enable,
4901da177e4SLinus Torvalds 	.cache_flush		= global_cache_flush,
4911da177e4SLinus Torvalds 	.create_gatt_table	= agp_generic_create_gatt_table,
4921da177e4SLinus Torvalds 	.free_gatt_table	= agp_generic_free_gatt_table,
4931da177e4SLinus Torvalds 	.insert_memory		= agp_generic_insert_memory,
4941da177e4SLinus Torvalds 	.remove_memory		= agp_generic_remove_memory,
4951da177e4SLinus Torvalds 	.alloc_by_type		= agp_generic_alloc_by_type,
4961da177e4SLinus Torvalds 	.free_by_type		= agp_generic_free_by_type,
4971da177e4SLinus Torvalds 	.agp_alloc_page		= agp_generic_alloc_page,
49837acee10SShaohua Li 	.agp_alloc_pages        = agp_generic_alloc_pages,
4991da177e4SLinus Torvalds 	.agp_destroy_page	= agp_generic_destroy_page,
500bd07928cSShaohua Li 	.agp_destroy_pages      = agp_generic_destroy_pages,
501a030ce44SThomas Hellstrom 	.agp_type_to_mask_type	= agp_generic_type_to_mask_type,
5021da177e4SLinus Torvalds };
5031da177e4SLinus Torvalds 
504e5524f35SDave Jones static const struct agp_bridge_driver intel_820_driver = {
5051da177e4SLinus Torvalds 	.owner			= THIS_MODULE,
5061da177e4SLinus Torvalds 	.aperture_sizes		= intel_8xx_sizes,
5071da177e4SLinus Torvalds 	.size_type		= U8_APER_SIZE,
5081da177e4SLinus Torvalds 	.num_aperture_sizes	= 7,
50961cf0593SJerome Glisse 	.needs_scratch_page	= true,
5101da177e4SLinus Torvalds 	.configure		= intel_820_configure,
5111da177e4SLinus Torvalds 	.fetch_size		= intel_8xx_fetch_size,
5121da177e4SLinus Torvalds 	.cleanup		= intel_820_cleanup,
5131da177e4SLinus Torvalds 	.tlb_flush		= intel_820_tlbflush,
5141da177e4SLinus Torvalds 	.mask_memory		= agp_generic_mask_memory,
5151da177e4SLinus Torvalds 	.masks			= intel_generic_masks,
5161da177e4SLinus Torvalds 	.agp_enable		= agp_generic_enable,
5171da177e4SLinus Torvalds 	.cache_flush		= global_cache_flush,
5181da177e4SLinus Torvalds 	.create_gatt_table	= agp_generic_create_gatt_table,
5191da177e4SLinus Torvalds 	.free_gatt_table	= agp_generic_free_gatt_table,
5201da177e4SLinus Torvalds 	.insert_memory		= agp_generic_insert_memory,
5211da177e4SLinus Torvalds 	.remove_memory		= agp_generic_remove_memory,
5221da177e4SLinus Torvalds 	.alloc_by_type		= agp_generic_alloc_by_type,
5231da177e4SLinus Torvalds 	.free_by_type		= agp_generic_free_by_type,
5241da177e4SLinus Torvalds 	.agp_alloc_page		= agp_generic_alloc_page,
52537acee10SShaohua Li 	.agp_alloc_pages        = agp_generic_alloc_pages,
5261da177e4SLinus Torvalds 	.agp_destroy_page	= agp_generic_destroy_page,
527bd07928cSShaohua Li 	.agp_destroy_pages      = agp_generic_destroy_pages,
528a030ce44SThomas Hellstrom 	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
5291da177e4SLinus Torvalds };
5301da177e4SLinus Torvalds 
531e5524f35SDave Jones static const struct agp_bridge_driver intel_830mp_driver = {
5321da177e4SLinus Torvalds 	.owner			= THIS_MODULE,
5331da177e4SLinus Torvalds 	.aperture_sizes		= intel_830mp_sizes,
5341da177e4SLinus Torvalds 	.size_type		= U8_APER_SIZE,
5351da177e4SLinus Torvalds 	.num_aperture_sizes	= 4,
53661cf0593SJerome Glisse 	.needs_scratch_page	= true,
5371da177e4SLinus Torvalds 	.configure		= intel_830mp_configure,
5381da177e4SLinus Torvalds 	.fetch_size		= intel_8xx_fetch_size,
5391da177e4SLinus Torvalds 	.cleanup		= intel_8xx_cleanup,
5401da177e4SLinus Torvalds 	.tlb_flush		= intel_8xx_tlbflush,
5411da177e4SLinus Torvalds 	.mask_memory		= agp_generic_mask_memory,
5421da177e4SLinus Torvalds 	.masks			= intel_generic_masks,
5431da177e4SLinus Torvalds 	.agp_enable		= agp_generic_enable,
5441da177e4SLinus Torvalds 	.cache_flush		= global_cache_flush,
5451da177e4SLinus Torvalds 	.create_gatt_table	= agp_generic_create_gatt_table,
5461da177e4SLinus Torvalds 	.free_gatt_table	= agp_generic_free_gatt_table,
5471da177e4SLinus Torvalds 	.insert_memory		= agp_generic_insert_memory,
5481da177e4SLinus Torvalds 	.remove_memory		= agp_generic_remove_memory,
5491da177e4SLinus Torvalds 	.alloc_by_type		= agp_generic_alloc_by_type,
5501da177e4SLinus Torvalds 	.free_by_type		= agp_generic_free_by_type,
5511da177e4SLinus Torvalds 	.agp_alloc_page		= agp_generic_alloc_page,
55237acee10SShaohua Li 	.agp_alloc_pages        = agp_generic_alloc_pages,
5531da177e4SLinus Torvalds 	.agp_destroy_page	= agp_generic_destroy_page,
554bd07928cSShaohua Li 	.agp_destroy_pages      = agp_generic_destroy_pages,
555a030ce44SThomas Hellstrom 	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
5561da177e4SLinus Torvalds };
5571da177e4SLinus Torvalds 
558e5524f35SDave Jones static const struct agp_bridge_driver intel_840_driver = {
5591da177e4SLinus Torvalds 	.owner			= THIS_MODULE,
5601da177e4SLinus Torvalds 	.aperture_sizes		= intel_8xx_sizes,
5611da177e4SLinus Torvalds 	.size_type		= U8_APER_SIZE,
5621da177e4SLinus Torvalds 	.num_aperture_sizes	= 7,
56361cf0593SJerome Glisse 	.needs_scratch_page	= true,
5641da177e4SLinus Torvalds 	.configure		= intel_840_configure,
5651da177e4SLinus Torvalds 	.fetch_size		= intel_8xx_fetch_size,
5661da177e4SLinus Torvalds 	.cleanup		= intel_8xx_cleanup,
5671da177e4SLinus Torvalds 	.tlb_flush		= intel_8xx_tlbflush,
5681da177e4SLinus Torvalds 	.mask_memory		= agp_generic_mask_memory,
5691da177e4SLinus Torvalds 	.masks			= intel_generic_masks,
5701da177e4SLinus Torvalds 	.agp_enable		= agp_generic_enable,
5711da177e4SLinus Torvalds 	.cache_flush		= global_cache_flush,
5721da177e4SLinus Torvalds 	.create_gatt_table	= agp_generic_create_gatt_table,
5731da177e4SLinus Torvalds 	.free_gatt_table	= agp_generic_free_gatt_table,
5741da177e4SLinus Torvalds 	.insert_memory		= agp_generic_insert_memory,
5751da177e4SLinus Torvalds 	.remove_memory		= agp_generic_remove_memory,
5761da177e4SLinus Torvalds 	.alloc_by_type		= agp_generic_alloc_by_type,
5771da177e4SLinus Torvalds 	.free_by_type		= agp_generic_free_by_type,
5781da177e4SLinus Torvalds 	.agp_alloc_page		= agp_generic_alloc_page,
57937acee10SShaohua Li 	.agp_alloc_pages        = agp_generic_alloc_pages,
5801da177e4SLinus Torvalds 	.agp_destroy_page	= agp_generic_destroy_page,
581bd07928cSShaohua Li 	.agp_destroy_pages      = agp_generic_destroy_pages,
582a030ce44SThomas Hellstrom 	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
5831da177e4SLinus Torvalds };
5841da177e4SLinus Torvalds 
585e5524f35SDave Jones static const struct agp_bridge_driver intel_845_driver = {
5861da177e4SLinus Torvalds 	.owner			= THIS_MODULE,
5871da177e4SLinus Torvalds 	.aperture_sizes		= intel_8xx_sizes,
5881da177e4SLinus Torvalds 	.size_type		= U8_APER_SIZE,
5891da177e4SLinus Torvalds 	.num_aperture_sizes	= 7,
59061cf0593SJerome Glisse 	.needs_scratch_page	= true,
5911da177e4SLinus Torvalds 	.configure		= intel_845_configure,
5921da177e4SLinus Torvalds 	.fetch_size		= intel_8xx_fetch_size,
5931da177e4SLinus Torvalds 	.cleanup		= intel_8xx_cleanup,
5941da177e4SLinus Torvalds 	.tlb_flush		= intel_8xx_tlbflush,
5951da177e4SLinus Torvalds 	.mask_memory		= agp_generic_mask_memory,
5961da177e4SLinus Torvalds 	.masks			= intel_generic_masks,
5971da177e4SLinus Torvalds 	.agp_enable		= agp_generic_enable,
5981da177e4SLinus Torvalds 	.cache_flush		= global_cache_flush,
5991da177e4SLinus Torvalds 	.create_gatt_table	= agp_generic_create_gatt_table,
6001da177e4SLinus Torvalds 	.free_gatt_table	= agp_generic_free_gatt_table,
6011da177e4SLinus Torvalds 	.insert_memory		= agp_generic_insert_memory,
6021da177e4SLinus Torvalds 	.remove_memory		= agp_generic_remove_memory,
6031da177e4SLinus Torvalds 	.alloc_by_type		= agp_generic_alloc_by_type,
6041da177e4SLinus Torvalds 	.free_by_type		= agp_generic_free_by_type,
6051da177e4SLinus Torvalds 	.agp_alloc_page		= agp_generic_alloc_page,
60637acee10SShaohua Li 	.agp_alloc_pages        = agp_generic_alloc_pages,
6071da177e4SLinus Torvalds 	.agp_destroy_page	= agp_generic_destroy_page,
608bd07928cSShaohua Li 	.agp_destroy_pages      = agp_generic_destroy_pages,
609a030ce44SThomas Hellstrom 	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
6101da177e4SLinus Torvalds };
6111da177e4SLinus Torvalds 
612e5524f35SDave Jones static const struct agp_bridge_driver intel_850_driver = {
6131da177e4SLinus Torvalds 	.owner			= THIS_MODULE,
6141da177e4SLinus Torvalds 	.aperture_sizes		= intel_8xx_sizes,
6151da177e4SLinus Torvalds 	.size_type		= U8_APER_SIZE,
6161da177e4SLinus Torvalds 	.num_aperture_sizes	= 7,
61761cf0593SJerome Glisse 	.needs_scratch_page	= true,
6181da177e4SLinus Torvalds 	.configure		= intel_850_configure,
6191da177e4SLinus Torvalds 	.fetch_size		= intel_8xx_fetch_size,
6201da177e4SLinus Torvalds 	.cleanup		= intel_8xx_cleanup,
6211da177e4SLinus Torvalds 	.tlb_flush		= intel_8xx_tlbflush,
6221da177e4SLinus Torvalds 	.mask_memory		= agp_generic_mask_memory,
6231da177e4SLinus Torvalds 	.masks			= intel_generic_masks,
6241da177e4SLinus Torvalds 	.agp_enable		= agp_generic_enable,
6251da177e4SLinus Torvalds 	.cache_flush		= global_cache_flush,
6261da177e4SLinus Torvalds 	.create_gatt_table	= agp_generic_create_gatt_table,
6271da177e4SLinus Torvalds 	.free_gatt_table	= agp_generic_free_gatt_table,
6281da177e4SLinus Torvalds 	.insert_memory		= agp_generic_insert_memory,
6291da177e4SLinus Torvalds 	.remove_memory		= agp_generic_remove_memory,
6301da177e4SLinus Torvalds 	.alloc_by_type		= agp_generic_alloc_by_type,
6311da177e4SLinus Torvalds 	.free_by_type		= agp_generic_free_by_type,
6321da177e4SLinus Torvalds 	.agp_alloc_page		= agp_generic_alloc_page,
63337acee10SShaohua Li 	.agp_alloc_pages        = agp_generic_alloc_pages,
6341da177e4SLinus Torvalds 	.agp_destroy_page	= agp_generic_destroy_page,
635bd07928cSShaohua Li 	.agp_destroy_pages      = agp_generic_destroy_pages,
636a030ce44SThomas Hellstrom 	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
6371da177e4SLinus Torvalds };
6381da177e4SLinus Torvalds 
639e5524f35SDave Jones static const struct agp_bridge_driver intel_860_driver = {
6401da177e4SLinus Torvalds 	.owner			= THIS_MODULE,
6411da177e4SLinus Torvalds 	.aperture_sizes		= intel_8xx_sizes,
6421da177e4SLinus Torvalds 	.size_type		= U8_APER_SIZE,
6431da177e4SLinus Torvalds 	.num_aperture_sizes	= 7,
64461cf0593SJerome Glisse 	.needs_scratch_page	= true,
6451da177e4SLinus Torvalds 	.configure		= intel_860_configure,
6461da177e4SLinus Torvalds 	.fetch_size		= intel_8xx_fetch_size,
6471da177e4SLinus Torvalds 	.cleanup		= intel_8xx_cleanup,
6481da177e4SLinus Torvalds 	.tlb_flush		= intel_8xx_tlbflush,
6491da177e4SLinus Torvalds 	.mask_memory		= agp_generic_mask_memory,
6501da177e4SLinus Torvalds 	.masks			= intel_generic_masks,
6511da177e4SLinus Torvalds 	.agp_enable		= agp_generic_enable,
6521da177e4SLinus Torvalds 	.cache_flush		= global_cache_flush,
6531da177e4SLinus Torvalds 	.create_gatt_table	= agp_generic_create_gatt_table,
6541da177e4SLinus Torvalds 	.free_gatt_table	= agp_generic_free_gatt_table,
6551da177e4SLinus Torvalds 	.insert_memory		= agp_generic_insert_memory,
6561da177e4SLinus Torvalds 	.remove_memory		= agp_generic_remove_memory,
6571da177e4SLinus Torvalds 	.alloc_by_type		= agp_generic_alloc_by_type,
6581da177e4SLinus Torvalds 	.free_by_type		= agp_generic_free_by_type,
6591da177e4SLinus Torvalds 	.agp_alloc_page		= agp_generic_alloc_page,
66037acee10SShaohua Li 	.agp_alloc_pages        = agp_generic_alloc_pages,
6611da177e4SLinus Torvalds 	.agp_destroy_page	= agp_generic_destroy_page,
662bd07928cSShaohua Li 	.agp_destroy_pages      = agp_generic_destroy_pages,
663a030ce44SThomas Hellstrom 	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
6641da177e4SLinus Torvalds };
6651da177e4SLinus Torvalds 
666e5524f35SDave Jones static const struct agp_bridge_driver intel_7505_driver = {
6671da177e4SLinus Torvalds 	.owner			= THIS_MODULE,
6681da177e4SLinus Torvalds 	.aperture_sizes		= intel_8xx_sizes,
6691da177e4SLinus Torvalds 	.size_type		= U8_APER_SIZE,
6701da177e4SLinus Torvalds 	.num_aperture_sizes	= 7,
67161cf0593SJerome Glisse 	.needs_scratch_page	= true,
6721da177e4SLinus Torvalds 	.configure		= intel_7505_configure,
6731da177e4SLinus Torvalds 	.fetch_size		= intel_8xx_fetch_size,
6741da177e4SLinus Torvalds 	.cleanup		= intel_8xx_cleanup,
6751da177e4SLinus Torvalds 	.tlb_flush		= intel_8xx_tlbflush,
6761da177e4SLinus Torvalds 	.mask_memory		= agp_generic_mask_memory,
6771da177e4SLinus Torvalds 	.masks			= intel_generic_masks,
6781da177e4SLinus Torvalds 	.agp_enable		= agp_generic_enable,
6791da177e4SLinus Torvalds 	.cache_flush		= global_cache_flush,
6801da177e4SLinus Torvalds 	.create_gatt_table	= agp_generic_create_gatt_table,
6811da177e4SLinus Torvalds 	.free_gatt_table	= agp_generic_free_gatt_table,
6821da177e4SLinus Torvalds 	.insert_memory		= agp_generic_insert_memory,
6831da177e4SLinus Torvalds 	.remove_memory		= agp_generic_remove_memory,
6841da177e4SLinus Torvalds 	.alloc_by_type		= agp_generic_alloc_by_type,
6851da177e4SLinus Torvalds 	.free_by_type		= agp_generic_free_by_type,
6861da177e4SLinus Torvalds 	.agp_alloc_page		= agp_generic_alloc_page,
68737acee10SShaohua Li 	.agp_alloc_pages        = agp_generic_alloc_pages,
6881da177e4SLinus Torvalds 	.agp_destroy_page	= agp_generic_destroy_page,
689bd07928cSShaohua Li 	.agp_destroy_pages      = agp_generic_destroy_pages,
690a030ce44SThomas Hellstrom 	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
6911da177e4SLinus Torvalds };
6921da177e4SLinus Torvalds 
6939614ece1SWang Zhenyu /* Table to describe Intel GMCH and AGP/PCIE GART drivers.  At least one of
6949614ece1SWang Zhenyu  * driver and gmch_driver must be non-null, and find_gmch will determine
6959614ece1SWang Zhenyu  * which one should be used if a gmch_chip_id is present.
6969614ece1SWang Zhenyu  */
69702c026ceSDaniel Vetter static const struct intel_agp_driver_description {
6989614ece1SWang Zhenyu 	unsigned int chip_id;
6999614ece1SWang Zhenyu 	char *name;
7009614ece1SWang Zhenyu 	const struct agp_bridge_driver *driver;
7019614ece1SWang Zhenyu } intel_agp_chipsets[] = {
70202c026ceSDaniel Vetter 	{ PCI_DEVICE_ID_INTEL_82443LX_0, "440LX", &intel_generic_driver },
70302c026ceSDaniel Vetter 	{ PCI_DEVICE_ID_INTEL_82443BX_0, "440BX", &intel_generic_driver },
70402c026ceSDaniel Vetter 	{ PCI_DEVICE_ID_INTEL_82443GX_0, "440GX", &intel_generic_driver },
70502c026ceSDaniel Vetter 	{ PCI_DEVICE_ID_INTEL_82815_MC, "i815", &intel_815_driver },
70602c026ceSDaniel Vetter 	{ PCI_DEVICE_ID_INTEL_82820_HB, "i820", &intel_820_driver },
70702c026ceSDaniel Vetter 	{ PCI_DEVICE_ID_INTEL_82820_UP_HB, "i820", &intel_820_driver },
70802c026ceSDaniel Vetter 	{ PCI_DEVICE_ID_INTEL_82830_HB, "830M", &intel_830mp_driver },
70902c026ceSDaniel Vetter 	{ PCI_DEVICE_ID_INTEL_82840_HB, "i840", &intel_840_driver },
71053371edaSOswald Buddenhagen 	{ PCI_DEVICE_ID_INTEL_82845_HB, "i845", &intel_845_driver },
71153371edaSOswald Buddenhagen 	{ PCI_DEVICE_ID_INTEL_82845G_HB, "845G", &intel_845_driver },
71202c026ceSDaniel Vetter 	{ PCI_DEVICE_ID_INTEL_82850_HB, "i850", &intel_850_driver },
71302c026ceSDaniel Vetter 	{ PCI_DEVICE_ID_INTEL_82854_HB, "854", &intel_845_driver },
71402c026ceSDaniel Vetter 	{ PCI_DEVICE_ID_INTEL_82855PM_HB, "855PM", &intel_845_driver },
71502c026ceSDaniel Vetter 	{ PCI_DEVICE_ID_INTEL_82855GM_HB, "855GM", &intel_845_driver },
71602c026ceSDaniel Vetter 	{ PCI_DEVICE_ID_INTEL_82860_HB, "i860", &intel_860_driver },
71702c026ceSDaniel Vetter 	{ PCI_DEVICE_ID_INTEL_82865_HB, "865", &intel_845_driver },
71802c026ceSDaniel Vetter 	{ PCI_DEVICE_ID_INTEL_82875_HB, "i875", &intel_845_driver },
71902c026ceSDaniel Vetter 	{ PCI_DEVICE_ID_INTEL_7505_0, "E7505", &intel_7505_driver },
72002c026ceSDaniel Vetter 	{ PCI_DEVICE_ID_INTEL_7205_0, "E7205", &intel_7505_driver },
72102c026ceSDaniel Vetter 	{ 0, NULL, NULL }
7229614ece1SWang Zhenyu };
7231da177e4SLinus Torvalds 
agp_intel_probe(struct pci_dev * pdev,const struct pci_device_id * ent)724bcd2982aSGreg Kroah-Hartman static int agp_intel_probe(struct pci_dev *pdev,
7251da177e4SLinus Torvalds 			   const struct pci_device_id *ent)
7261da177e4SLinus Torvalds {
7271da177e4SLinus Torvalds 	struct agp_bridge_data *bridge;
7281da177e4SLinus Torvalds 	u8 cap_ptr = 0;
7291da177e4SLinus Torvalds 	struct resource *r;
7301f7a6e37SZhenyu Wang 	int i, err;
7311da177e4SLinus Torvalds 
7321da177e4SLinus Torvalds 	cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP);
7331da177e4SLinus Torvalds 
7341da177e4SLinus Torvalds 	bridge = agp_alloc_bridge();
7351da177e4SLinus Torvalds 	if (!bridge)
7361da177e4SLinus Torvalds 		return -ENOMEM;
7371da177e4SLinus Torvalds 
73822dd82a3SDaniel Vetter 	bridge->capndx = cap_ptr;
73922dd82a3SDaniel Vetter 
74014be93ddSDaniel Vetter 	if (intel_gmch_probe(pdev, NULL, bridge))
74122dd82a3SDaniel Vetter 		goto found_gmch;
74222dd82a3SDaniel Vetter 
7439614ece1SWang Zhenyu 	for (i = 0; intel_agp_chipsets[i].name != NULL; i++) {
7449614ece1SWang Zhenyu 		/* In case that multiple models of gfx chip may
7459614ece1SWang Zhenyu 		   stand on same host bridge type, this can be
7469614ece1SWang Zhenyu 		   sure we detect the right IGD. */
74788889851SWang Zhenyu 		if (pdev->device == intel_agp_chipsets[i].chip_id) {
74888889851SWang Zhenyu 			bridge->driver = intel_agp_chipsets[i].driver;
74988889851SWang Zhenyu 			break;
75088889851SWang Zhenyu 		}
75188889851SWang Zhenyu 	}
7529614ece1SWang Zhenyu 
75302c026ceSDaniel Vetter 	if (!bridge->driver) {
7541da177e4SLinus Torvalds 		if (cap_ptr)
755e3cf6951SBjorn Helgaas 			dev_warn(&pdev->dev, "unsupported Intel chipset [%04x/%04x]\n",
756e3cf6951SBjorn Helgaas 				 pdev->vendor, pdev->device);
7571da177e4SLinus Torvalds 		agp_put_bridge(bridge);
7581da177e4SLinus Torvalds 		return -ENODEV;
7599614ece1SWang Zhenyu 	}
7609614ece1SWang Zhenyu 
7611da177e4SLinus Torvalds 	bridge->dev = pdev;
76222dd82a3SDaniel Vetter 	bridge->dev_private_data = NULL;
7631da177e4SLinus Torvalds 
764e3cf6951SBjorn Helgaas 	dev_info(&pdev->dev, "Intel %s Chipset\n", intel_agp_chipsets[i].name);
7651da177e4SLinus Torvalds 
7661da177e4SLinus Torvalds 	/*
7671da177e4SLinus Torvalds 	* The following fixes the case where the BIOS has "forgotten" to
7681da177e4SLinus Torvalds 	* provide an address range for the GART.
7691da177e4SLinus Torvalds 	* 20030610 - hamish@zot.org
770a70b95c0SStephen Kitt 	* This happens before pci_enable_device() intentionally;
771a70b95c0SStephen Kitt 	* calling pci_enable_device() before assigning the resource
772a70b95c0SStephen Kitt 	* will result in the GART being disabled on machines with such
773a70b95c0SStephen Kitt 	* BIOSs (the GART ends up with a BAR starting at 0, which
774a70b95c0SStephen Kitt 	* conflicts a lot of other devices).
7751da177e4SLinus Torvalds 	*/
7761da177e4SLinus Torvalds 	r = &pdev->resource[0];
7771da177e4SLinus Torvalds 	if (!r->start && r->end) {
7781da177e4SLinus Torvalds 		if (pci_assign_resource(pdev, 0)) {
779e3cf6951SBjorn Helgaas 			dev_err(&pdev->dev, "can't assign resource 0\n");
7801da177e4SLinus Torvalds 			agp_put_bridge(bridge);
7811da177e4SLinus Torvalds 			return -ENODEV;
7821da177e4SLinus Torvalds 		}
7831da177e4SLinus Torvalds 	}
7841da177e4SLinus Torvalds 
785a70b95c0SStephen Kitt 	/*
786a70b95c0SStephen Kitt 	* If the device has not been properly setup, the following will catch
787a70b95c0SStephen Kitt 	* the problem and should stop the system from crashing.
788a70b95c0SStephen Kitt 	* 20030610 - hamish@zot.org
789a70b95c0SStephen Kitt 	*/
790a70b95c0SStephen Kitt 	if (pci_enable_device(pdev)) {
791a70b95c0SStephen Kitt 		dev_err(&pdev->dev, "can't enable PCI device\n");
792a70b95c0SStephen Kitt 		agp_put_bridge(bridge);
793a70b95c0SStephen Kitt 		return -ENODEV;
794a70b95c0SStephen Kitt 	}
795a70b95c0SStephen Kitt 
7961da177e4SLinus Torvalds 	/* Fill in the mode register */
7971da177e4SLinus Torvalds 	if (cap_ptr) {
7981da177e4SLinus Torvalds 		pci_read_config_dword(pdev,
7991da177e4SLinus Torvalds 				bridge->capndx+PCI_AGP_STATUS,
8001da177e4SLinus Torvalds 				&bridge->mode);
8011da177e4SLinus Torvalds 	}
8021da177e4SLinus Torvalds 
80322dd82a3SDaniel Vetter found_gmch:
8041da177e4SLinus Torvalds 	pci_set_drvdata(pdev, bridge);
8051f7a6e37SZhenyu Wang 	err = agp_add_bridge(bridge);
8061f7a6e37SZhenyu Wang 	return err;
8071da177e4SLinus Torvalds }
8081da177e4SLinus Torvalds 
agp_intel_remove(struct pci_dev * pdev)80939af33fcSBill Pemberton static void agp_intel_remove(struct pci_dev *pdev)
8101da177e4SLinus Torvalds {
8111da177e4SLinus Torvalds 	struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
8121da177e4SLinus Torvalds 
8131da177e4SLinus Torvalds 	agp_remove_bridge(bridge);
8141da177e4SLinus Torvalds 
81514be93ddSDaniel Vetter 	intel_gmch_remove();
8161da177e4SLinus Torvalds 
8171da177e4SLinus Torvalds 	agp_put_bridge(bridge);
8181da177e4SLinus Torvalds }
8191da177e4SLinus Torvalds 
agp_intel_resume(struct device * dev)8207f142022SBjorn Helgaas static int agp_intel_resume(struct device *dev)
8211da177e4SLinus Torvalds {
8227f142022SBjorn Helgaas 	struct pci_dev *pdev = to_pci_dev(dev);
8231da177e4SLinus Torvalds 	struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
8241da177e4SLinus Torvalds 
825e5a04d52SDaniel Vetter 	bridge->driver->configure();
8261da177e4SLinus Torvalds 
8271da177e4SLinus Torvalds 	return 0;
8281da177e4SLinus Torvalds }
8291da177e4SLinus Torvalds 
83084a6bf7fSArvind Yadav static const struct pci_device_id agp_intel_pci_table[] = {
8311da177e4SLinus Torvalds #define ID(x)						\
8321da177e4SLinus Torvalds 	{						\
8331da177e4SLinus Torvalds 	.class		= (PCI_CLASS_BRIDGE_HOST << 8),	\
8341da177e4SLinus Torvalds 	.class_mask	= ~0,				\
8351da177e4SLinus Torvalds 	.vendor		= PCI_VENDOR_ID_INTEL,		\
8361da177e4SLinus Torvalds 	.device		= x,				\
8371da177e4SLinus Torvalds 	.subvendor	= PCI_ANY_ID,			\
8381da177e4SLinus Torvalds 	.subdevice	= PCI_ANY_ID,			\
8391da177e4SLinus Torvalds 	}
8406b2d5905SBen Widawsky 	ID(PCI_DEVICE_ID_INTEL_82441), /* for HAS2 support */
8411da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82443LX_0),
8421da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82443BX_0),
8431da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82443GX_0),
8441da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82810_MC1),
8451da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82810_MC3),
8461da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82810E_MC),
8471da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82815_MC),
8481da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82820_HB),
8491da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82820_UP_HB),
8501da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82830_HB),
8511da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82840_HB),
8521da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82845_HB),
8531da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82845G_HB),
8541da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82850_HB),
855347486bbSStefan Husemann 	ID(PCI_DEVICE_ID_INTEL_82854_HB),
8561da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82855PM_HB),
8571da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82855GM_HB),
8581da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82860_HB),
8591da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82865_HB),
8601da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82875_HB),
8611da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_7505_0),
8621da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_7205_0),
863e914a36aSCarlos Martín 	ID(PCI_DEVICE_ID_INTEL_E7221_HB),
8641da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82915G_HB),
8651da177e4SLinus Torvalds 	ID(PCI_DEVICE_ID_INTEL_82915GM_HB),
866d0de98faSAlan Hourihane 	ID(PCI_DEVICE_ID_INTEL_82945G_HB),
8673b0e8eadSAlan Hourihane 	ID(PCI_DEVICE_ID_INTEL_82945GM_HB),
868dde47876SZhenyu Wang 	ID(PCI_DEVICE_ID_INTEL_82945GME_HB),
869107f517bSAdam Jackson 	ID(PCI_DEVICE_ID_INTEL_PINEVIEW_M_HB),
870107f517bSAdam Jackson 	ID(PCI_DEVICE_ID_INTEL_PINEVIEW_HB),
87165c25aadSEric Anholt 	ID(PCI_DEVICE_ID_INTEL_82946GZ_HB),
8729119f85aSZhenyu Wang 	ID(PCI_DEVICE_ID_INTEL_82G35_HB),
87365c25aadSEric Anholt 	ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
87465c25aadSEric Anholt 	ID(PCI_DEVICE_ID_INTEL_82965G_HB),
8754598af33SWang Zhenyu 	ID(PCI_DEVICE_ID_INTEL_82965GM_HB),
876dde47876SZhenyu Wang 	ID(PCI_DEVICE_ID_INTEL_82965GME_HB),
877874808c6SWang Zhenyu 	ID(PCI_DEVICE_ID_INTEL_G33_HB),
878874808c6SWang Zhenyu 	ID(PCI_DEVICE_ID_INTEL_Q35_HB),
879874808c6SWang Zhenyu 	ID(PCI_DEVICE_ID_INTEL_Q33_HB),
88099d32bd5SZhenyu Wang 	ID(PCI_DEVICE_ID_INTEL_GM45_HB),
881107f517bSAdam Jackson 	ID(PCI_DEVICE_ID_INTEL_EAGLELAKE_HB),
88225ce77abSZhenyu Wang 	ID(PCI_DEVICE_ID_INTEL_Q45_HB),
88325ce77abSZhenyu Wang 	ID(PCI_DEVICE_ID_INTEL_G45_HB),
884a50ccc6cSZhenyu Wang 	ID(PCI_DEVICE_ID_INTEL_G41_HB),
88538d8a956SFabian Henze 	ID(PCI_DEVICE_ID_INTEL_B43_HB),
8863dde04b0SChris Wilson 	ID(PCI_DEVICE_ID_INTEL_B43_1_HB),
887107f517bSAdam Jackson 	ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB),
88867384fe3SEugeni Dodonov 	ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D2_HB),
889107f517bSAdam Jackson 	ID(PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB),
890107f517bSAdam Jackson 	ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB),
8913ff99164SDave Airlie 	ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB),
8921da177e4SLinus Torvalds 	{ }
8931da177e4SLinus Torvalds };
8941da177e4SLinus Torvalds 
8951da177e4SLinus Torvalds MODULE_DEVICE_TABLE(pci, agp_intel_pci_table);
8961da177e4SLinus Torvalds 
8977f142022SBjorn Helgaas static DEFINE_SIMPLE_DEV_PM_OPS(agp_intel_pm_ops, NULL, agp_intel_resume);
8987f142022SBjorn Helgaas 
8991da177e4SLinus Torvalds static struct pci_driver agp_intel_pci_driver = {
9001da177e4SLinus Torvalds 	.name		= "agpgart-intel",
9011da177e4SLinus Torvalds 	.id_table	= agp_intel_pci_table,
9021da177e4SLinus Torvalds 	.probe		= agp_intel_probe,
903bcd2982aSGreg Kroah-Hartman 	.remove		= agp_intel_remove,
9047f142022SBjorn Helgaas 	.driver.pm	= &agp_intel_pm_ops,
9051da177e4SLinus Torvalds };
9061da177e4SLinus Torvalds 
agp_intel_init(void)9071da177e4SLinus Torvalds static int __init agp_intel_init(void)
9081da177e4SLinus Torvalds {
9091da177e4SLinus Torvalds 	if (agp_off)
9101da177e4SLinus Torvalds 		return -EINVAL;
9111da177e4SLinus Torvalds 	return pci_register_driver(&agp_intel_pci_driver);
9121da177e4SLinus Torvalds }
9131da177e4SLinus Torvalds 
agp_intel_cleanup(void)9141da177e4SLinus Torvalds static void __exit agp_intel_cleanup(void)
9151da177e4SLinus Torvalds {
9161da177e4SLinus Torvalds 	pci_unregister_driver(&agp_intel_pci_driver);
9171da177e4SLinus Torvalds }
9181da177e4SLinus Torvalds 
9191da177e4SLinus Torvalds module_init(agp_intel_init);
9201da177e4SLinus Torvalds module_exit(agp_intel_cleanup);
9211da177e4SLinus Torvalds 
922bd8136d3SDave Jones MODULE_AUTHOR("Dave Jones, Various @Intel");
923*541b1b0aSJeff Johnson MODULE_DESCRIPTION("Intel AGPGART routines");
9241da177e4SLinus Torvalds MODULE_LICENSE("GPL and additional rights");
925