diff -urpN --exclude-from=/home/davej/.exclude bk-linus/drivers/char/agp/Makefile agpgart/drivers/char/agp/Makefile
--- bk-linus/drivers/char/agp/Makefile	2002-12-20 10:56:29.000000000 -0100
+++ agpgart/drivers/char/agp/Makefile	2002-12-20 12:17:50.000000000 -0100
@@ -6,9 +6,9 @@
 export-objs := backend.o
 
 agpgart-y := backend.o frontend.o generic.o
+agpgart-$(CONFIG_AGP3) += generic-3.0.o
 agpgart-objs := $(agpgart-y)
 obj-$(CONFIG_AGP) += agpgart.o
-obj-$(CONFIG_AGP3) += generic-3.0.o
 
 obj-$(CONFIG_AGP_INTEL)		+= intel-agp.o
 obj-$(CONFIG_AGP_VIA)		+= via-agp.o
diff -urpN --exclude-from=/home/davej/.exclude bk-linus/drivers/char/agp/agp.h agpgart/drivers/char/agp/agp.h
--- bk-linus/drivers/char/agp/agp.h	2002-12-20 10:56:29.000000000 -0100
+++ agpgart/drivers/char/agp/agp.h	2002-12-19 10:12:37.000000000 -0100
@@ -33,6 +33,7 @@ extern struct agp_bridge_data agp_bridge
 
 /* Generic routines. */
 void agp_generic_agp_enable(u32 mode);
+int agp_generic_agp_3_0_enable(u32 mode);
 int agp_generic_create_gatt_table(void);
 int agp_generic_free_gatt_table(void);
 agp_memory *agp_create_memory(int scratch_pages);
@@ -290,6 +291,9 @@ struct agp_bridge_data {
 #define VIA_APSIZE	0x84
 #define VIA_ATTBASE	0x88
 
+/* VIA KT400 */
+#define VIA_AGPSEL	0xfd
+
 /* SiS registers */
 #define SIS_APBASE	0x10
 #define SIS_ATTBASE	0x90
diff -urpN --exclude-from=/home/davej/.exclude bk-linus/drivers/char/agp/ali-agp.c agpgart/drivers/char/agp/ali-agp.c
--- bk-linus/drivers/char/agp/ali-agp.c	2002-12-20 10:56:29.000000000 -0100
+++ agpgart/drivers/char/agp/ali-agp.c	2002-12-20 12:17:50.000000000 -0100
@@ -195,7 +195,7 @@ static struct aper_size_info_32 ali_gene
 	{4, 1024, 0, 3}
 };
 
-int __init ali_generic_setup (struct pci_dev *pdev)
+static int __init ali_generic_setup (struct pci_dev *pdev)
 {
 	agp_bridge.masks = ali_generic_masks;
 	agp_bridge.num_of_masks = 1;
@@ -338,17 +338,20 @@ static int __init agp_lookup_host_bridge
 }
 
 
-
-
-static int agp_ali_probe (struct pci_dev *dev, const struct pci_device_id *ent)
+static int __init agp_ali_probe (struct pci_dev *dev, const struct pci_device_id *ent)
 {
-	if (pci_find_capability(dev, PCI_CAP_ID_AGP)==0)
-		return -ENODEV;
+	u8 cap_ptr = 0;
 
-	agp_bridge.dev = dev;
+	cap_ptr = pci_find_capability(dev, PCI_CAP_ID_AGP);
+	if (cap_ptr == 0)
+		return -ENODEV;
 
 	/* probe for known chipsets */
-	if (agp_lookup_host_bridge (dev) != -ENODEV ) {
+	if (agp_lookup_host_bridge(dev) != -ENODEV) {
+		agp_bridge.dev = dev;
+		agp_bridge.capndx = cap_ptr;
+		/* Fill in the mode register */
+		pci_read_config_dword(agp_bridge.dev, agp_bridge.capndx+4, &agp_bridge.mode);
 		agp_register_driver(dev);
 		return 0;
 	}
@@ -369,7 +372,7 @@ static struct pci_device_id agp_ali_pci_
 
 MODULE_DEVICE_TABLE(pci, agp_ali_pci_table);
 
-static struct pci_driver agp_ali_pci_driver = {
+static struct __initdata pci_driver agp_ali_pci_driver = {
 	.name		= "agpgart-ali",
 	.id_table	= agp_ali_pci_table,
 	.probe		= agp_ali_probe,
diff -urpN --exclude-from=/home/davej/.exclude bk-linus/drivers/char/agp/amd-k7-agp.c agpgart/drivers/char/agp/amd-k7-agp.c
--- bk-linus/drivers/char/agp/amd-k7-agp.c	2002-12-20 10:56:29.000000000 -0100
+++ agpgart/drivers/char/agp/amd-k7-agp.c	2002-12-20 12:17:50.000000000 -0100
@@ -351,7 +351,7 @@ static struct gatt_mask amd_irongate_mas
 	{.mask = 0x00000001, .type = 0}
 };
 
-int __init amd_irongate_setup (struct pci_dev *pdev)
+static int __init amd_irongate_setup (struct pci_dev *pdev)
 {
 	agp_bridge.masks = amd_irongate_masks;
 	agp_bridge.num_of_masks = 1;
@@ -439,25 +439,23 @@ static int __init agp_lookup_host_bridge
 
 /* Supported Device Scanning routine */
 
-static int __init agp_find_supported_device(struct pci_dev *dev)
+static int __init agp_amdk7_probe (struct pci_dev *dev, const struct pci_device_id *ent)
 {
-	agp_bridge.dev = dev;
+	u8 cap_ptr = 0;
 
-	if (pci_find_capability(dev, PCI_CAP_ID_AGP)==0)
+	cap_ptr = pci_find_capability(dev, PCI_CAP_ID_AGP);
+	if (cap_ptr == 0)
 		return -ENODEV;
 
-	/* probe for known chipsets */
-	return agp_lookup_host_bridge (dev);
-}
-
-
-static int agp_amdk7_probe (struct pci_dev *dev, const struct pci_device_id *ent)
-{
-	if (agp_find_supported_device(dev) == 0) {
+	if (agp_lookup_host_bridge(dev) != -ENODEV) {
+		agp_bridge.dev = dev;
+		agp_bridge.capndx = cap_ptr;
+		/* Fill in the mode register */
+		pci_read_config_dword(agp_bridge.dev, agp_bridge.capndx+4, &agp_bridge.mode);
 		agp_register_driver(dev);
 		return 0;
 	}
-	return -ENODEV;	
+	return -ENODEV;
 }
 
 static struct pci_device_id agp_amdk7_pci_table[] __initdata = {
@@ -474,7 +472,7 @@ static struct pci_device_id agp_amdk7_pc
 
 MODULE_DEVICE_TABLE(pci, agp_amdk7_pci_table);
 
-static struct pci_driver agp_amdk7_pci_driver = {
+static struct __initdata pci_driver agp_amdk7_pci_driver = {
 	.name		= "agpgart-amdk7",
 	.id_table	= agp_amdk7_pci_table,
 	.probe		= agp_amdk7_probe,
diff -urpN --exclude-from=/home/davej/.exclude bk-linus/drivers/char/agp/amd-k8-agp.c agpgart/drivers/char/agp/amd-k8-agp.c
--- bk-linus/drivers/char/agp/amd-k8-agp.c	2002-12-20 10:56:29.000000000 -0100
+++ agpgart/drivers/char/agp/amd-k8-agp.c	2002-12-20 12:17:50.000000000 -0100
@@ -370,7 +370,7 @@ static void agp_x86_64_agp_enable(u32 mo
 	}
 
 
-	pci_read_config_dword(agp_bridge.dev, agp_bridge.capndx + 4, &command);
+	pci_read_config_dword(agp_bridge.dev, agp_bridge.capndx+4, &command);
 
 	/*
 	 * PASS2: go through all devices that claim to be
@@ -429,7 +429,7 @@ static void agp_x86_64_agp_enable(u32 mo
 
 	command |= 0x100;
 
-	pci_write_config_dword(agp_bridge.dev, agp_bridge.capndx + 8, command);
+	pci_write_config_dword(agp_bridge.dev, agp_bridge.capndx+8, command);
 
 	/*
 	 * PASS4: Go through all AGP devices and update the
@@ -475,11 +475,19 @@ static int __init amd_8151_setup (struct
 }
 
 
-static int agp_amdk8_probe (struct pci_dev *dev, const struct pci_device_id *ent)
+static int __init agp_amdk8_probe (struct pci_dev *dev, const struct pci_device_id *ent)
 {
-	if (pci_find_capability(dev, PCI_CAP_ID_AGP)==0)
+	u8 cap_ptr = 0;
+
+	cap_ptr = pci_find_capability(dev, PCI_CAP_ID_AGP);
+	if (cap_ptr == 0)
 		return -ENODEV;
 
+	agp_bridge.dev = dev;
+	agp_bridge.capndx = cap_ptr;
+
+	/* Fill in the mode register */
+	pci_read_config_dword(agp_bridge.dev, agp_bridge.capndx+4, &agp_bridge.mode);
 	amd_8151_setup(dev);
 	agp_register_driver(dev);
 	return 0;
@@ -499,7 +507,7 @@ static struct pci_device_id agp_amdk8_pc
 
 MODULE_DEVICE_TABLE(pci, agp_amdk8_pci_table);
 
-static struct pci_driver agp_amdk8_pci_driver = {
+static struct __initdata pci_driver agp_amdk8_pci_driver = {
 	.name		= "agpgart-amd-k8",
 	.id_table	= agp_amdk8_pci_table,
 	.probe		= agp_amdk8_probe,
diff -urpN --exclude-from=/home/davej/.exclude bk-linus/drivers/char/agp/backend.c agpgart/drivers/char/agp/backend.c
--- bk-linus/drivers/char/agp/backend.c	2002-12-17 13:16:56.000000000 -0100
+++ agpgart/drivers/char/agp/backend.c	2002-12-20 12:17:50.000000000 -0100
@@ -112,23 +112,13 @@ static struct agp_version agp_current_ve
 	.minor = AGPGART_VERSION_MINOR,
 };
 
-static int __init agp_backend_initialize(struct pci_dev *dev)
+static int agp_backend_initialize(struct pci_dev *dev)
 {
 	int size_value, rc, got_gatt=0, got_keylist=0;
-	u8 cap_ptr = 0;
 
 	agp_bridge.max_memory_agp = agp_find_max();
 	agp_bridge.version = &agp_current_version;
 
-	cap_ptr = pci_find_capability(dev, PCI_CAP_ID_AGP);
-	if (cap_ptr == 0)
-		return -ENODEV;
-	agp_bridge.capndx = cap_ptr;
-
-	/* Fill in the mode register */
-	pci_read_config_dword(agp_bridge.dev, agp_bridge.capndx + 4, &agp_bridge.mode);
-
-
 	if (agp_bridge.needs_scratch_page == TRUE) {
 		void *addr;
 		addr = agp_bridge.agp_alloc_page();
@@ -254,7 +244,7 @@ int agp_register_driver (struct pci_dev 
 	}
 
 	inter_module_register("drm_agp", THIS_MODULE, &drm_agp);
-	
+
 	pm_register(PM_PCI_DEV, PM_PCI_ID(agp_bridge.dev), agp_power);
 
 	agp_count++;
@@ -272,13 +262,6 @@ int agp_unregister_driver(void)
 	return 0;
 }
 
-int __exit agp_exit(void)
-{
-	if (agp_count==0)
-		return -EBUSY;
-
-	return 0;
-}
 
 int __init agp_init(void)
 {
@@ -297,6 +280,12 @@ int __init agp_init(void)
 	return 0;
 }
 
+void __exit agp_exit(void)
+{
+	if (agp_count!=0)
+		BUG();
+}
+
 #ifndef CONFIG_GART_IOMMU
 module_init(agp_init);
 module_exit(agp_exit);
diff -urpN --exclude-from=/home/davej/.exclude bk-linus/drivers/char/agp/frontend.c agpgart/drivers/char/agp/frontend.c
--- bk-linus/drivers/char/agp/frontend.c	2002-12-20 10:56:30.000000000 -0100
+++ agpgart/drivers/char/agp/frontend.c	2002-12-20 12:17:50.000000000 -0100
@@ -1067,7 +1067,7 @@ static struct miscdevice agp_miscdev =
 	.fops	= &agp_fops
 };
 
-int __init agp_frontend_initialize(void)
+int agp_frontend_initialize(void)
 {
 	memset(&agp_fe, 0, sizeof(struct agp_front_data));
 	AGP_LOCK_INIT();
diff -urpN --exclude-from=/home/davej/.exclude bk-linus/drivers/char/agp/generic-3.0.c agpgart/drivers/char/agp/generic-3.0.c
--- bk-linus/drivers/char/agp/generic-3.0.c	2002-12-20 10:56:30.000000000 -0100
+++ agpgart/drivers/char/agp/generic-3.0.c	2002-12-20 12:17:50.000000000 -0100
@@ -1,11 +1,7 @@
 #include <linux/list.h>
 #include <linux/pci.h>
-
-
-//#include <linux/pagemap.h>
-//#include <linux/miscdevice.h>
-//#include <linux/pm.h>
 #include <linux/agp_backend.h>
+#include <linux/module.h>
 
 #include "agp.h"
 
@@ -529,7 +525,7 @@ get_out:
  * (AGP 3.0 devices are required to operate as AGP 2.0 devices 
  * when not using 3.0 electricals.
  */
-void agp_generic_agp_3_0_enable(u32 mode)
+int agp_generic_agp_3_0_enable(u32 mode)
 {
 	u32 ncapid, major, minor, agp_3_0;
 
@@ -548,9 +544,11 @@ void agp_generic_agp_3_0_enable(u32 mode
 		 */
 		if((agp_3_0 >> 3) & 0x1) {
 			agp_3_0_node_enable(mode, minor);
-			return;
+			return TRUE;
 		}
 	}
-	agp_generic_agp_enable(mode);
+	return FALSE;
 }
 
+EXPORT_SYMBOL(agp_generic_agp_3_0_enable);
+
diff -urpN --exclude-from=/home/davej/.exclude bk-linus/drivers/char/agp/hp-agp.c agpgart/drivers/char/agp/hp-agp.c
--- bk-linus/drivers/char/agp/hp-agp.c	2002-12-20 10:56:30.000000000 -0100
+++ agpgart/drivers/char/agp/hp-agp.c	2002-12-20 12:17:50.000000000 -0100
@@ -216,8 +216,7 @@ static void hp_zx1_tlbflush(agp_memory *
 {
 	struct _hp_private *hp = &hp_private;
 
-	OUTREG64(hp->registers, HP_ZX1_PCOM, 
-		hp->gart_base | log2(hp->gart_size));
+	OUTREG64(hp->registers, HP_ZX1_PCOM, hp->gart_base | log2(hp->gart_size));
 	INREG64(hp->registers, HP_ZX1_PCOM);
 }
 
@@ -251,7 +250,7 @@ static int hp_zx1_create_gatt_table(void
 static int hp_zx1_free_gatt_table(void)
 {
 	struct _hp_private *hp = &hp_private;
-	
+
 	if (hp->io_pdir_owner)
 		free_pages((unsigned long) hp->io_pdir,
 			    get_order(hp->io_pdir_size));
@@ -329,7 +328,7 @@ static unsigned long hp_zx1_mask_memory(
 	return HP_ZX1_PDIR_VALID_BIT | addr;
 }
 
-int __init hp_zx1_setup (struct pci_dev *pdev __attribute__((unused)))
+static int __init hp_zx1_setup (struct pci_dev *pdev __attribute__((unused)))
 {
 	agp_bridge.masks = hp_zx1_masks;
 	agp_bridge.num_of_masks = 1;
@@ -368,21 +367,22 @@ static int __init agp_find_supported_dev
 		return hp_zx1_setup(dev);
 	}
 	return -ENODEV;
+}
 
-static int agp_hp_probe (struct pci_dev *dev, const struct pci_device_id *ent)
+static int __init agp_hp_probe (struct pci_dev *dev, const struct pci_device_id *ent)
 {
 	if (agp_find_supported_device(dev) == 0) {
 		agp_register_driver(dev);
 		return 0;
 	}
-	return -ENODEV;	
+	return -ENODEV;
 }
 
 static struct pci_device_id agp_hp_pci_table[] __initdata = {
 	{
 	.class		= (PCI_CLASS_BRIDGE_HOST << 8),
 	.class_mask	= ~0,
-	.vendor_id	= PCI_VENDOR_ID_HP,
+	.vendor		= PCI_VENDOR_ID_HP,
 	.device		= PCI_DEVICE_ID_HP_ZX1_LBA,
 	.subvendor	= PCI_ANY_ID,
 	.subdevice	= PCI_ANY_ID,
@@ -392,7 +392,7 @@ static struct pci_device_id agp_hp_pci_t
 
 MODULE_DEVICE_TABLE(pci, agp_pci_table);
 
-static struct pci_driver agp_hp_pci_driver = {
+static struct __initdata pci_driver agp_hp_pci_driver = {
 	.name		= "agpgart-hp",
 	.id_table	= agp_hp_pci_table,
 	.probe		= agp_hp_probe,
@@ -412,7 +412,7 @@ static int __init agp_hp_init(void)
 static void __exit agp_hp_cleanup(void)
 {
 	agp_unregister_driver();
-	pci_unregister_driver(&agp_pci_driver);
+	pci_unregister_driver(&agp_hp_pci_driver);
 }
 
 module_init(agp_hp_init);
diff -urpN --exclude-from=/home/davej/.exclude bk-linus/drivers/char/agp/i460-agp.c agpgart/drivers/char/agp/i460-agp.c
--- bk-linus/drivers/char/agp/i460-agp.c	2002-12-20 10:56:30.000000000 -0100
+++ agpgart/drivers/char/agp/i460-agp.c	2002-12-20 12:17:50.000000000 -0100
@@ -523,7 +523,7 @@ static unsigned long i460_mask_memory (u
 		| (((addr & ~((1 << I460_IO_PAGE_SHIFT) - 1)) & 0xffffff000) >> 12));
 }
 
-int __init intel_i460_setup (struct pci_dev *pdev __attribute__((unused)))
+static int __init intel_i460_setup (struct pci_dev *pdev __attribute__((unused)))
 {
 	agp_bridge.num_of_masks = 1;
 	agp_bridge.masks = i460_masks;
@@ -560,55 +560,60 @@ int __init intel_i460_setup (struct pci_
 	return 0;
 }
 
-static int agp_intel_i460_probe (struct pci_dev *dev, const struct pci_device_id *ent)
+static int __init agp_intel_i460_probe (struct pci_dev *dev, const struct pci_device_id *ent)
 {
-	if (pci_find_capability(dev, PCI_CAP_ID_AGP)==0)
+	u8 cap_ptr = 0;
+
+	cap_ptr = pci_find_capability(dev, PCI_CAP_ID_AGP);
+	if (cap_ptr == 0)
 		return -ENODEV;
 
+	agp_bridge.dev = dev;
+	agp_bridge.capndx = cap_ptr;
 	intel_i460_setup(dev);
 	agp_register_driver(dev);
 	return 0;
 }
 
-static struct pci_device_id agp_i460_pci_table[] __initdata = {
+static struct pci_device_id agp_intel_i460_pci_table[] __initdata = {
 	{
 	.class		= (PCI_CLASS_BRIDGE_HOST << 8),
 	.class_mask	= ~0,
 	.vendor		= PCI_VENDOR_ID_INTEL,
-	.device		= PCI_DEVICE_ID_INTEL_460GX,
+	.device		= PCI_DEVICE_ID_INTEL_84460GX,
 	.subvendor	= PCI_ANY_ID,
 	.subdevice	= PCI_ANY_ID,
 	},
 	{ }
 };
 
-MODULE_DEVICE_TABLE(pci, agp_i460_pci_table);
+MODULE_DEVICE_TABLE(pci, agp_intel_i460_pci_table);
 
-static struct pci_driver agp_i460_pci_driver = {
+static struct __initdata pci_driver agp_intel_i460_pci_driver = {
 	.name		= "agpgart-intel-i460",
-	.id_table	= agp_i460_pci_table,
-	.probe		= agp_i460_probe,
+	.id_table	= agp_intel_i460_pci_table,
+	.probe		= agp_intel_i460_probe,
 };
 
-static int __init agp_i460_init(void)
+static int __init agp_intel_i460_init(void)
 {
 	int ret_val;
 
-	ret_val = pci_module_init(&agp_i460_pci_driver);
+	ret_val = pci_module_init(&agp_intel_i460_pci_driver);
 	if (ret_val)
 		agp_bridge.type = NOT_SUPPORTED;
 
 	return ret_val;
 }
 
-static void __exit agp_i460_cleanup(void)
+static void __exit agp_intel_i460_cleanup(void)
 {
 	agp_unregister_driver();
-	pci_unregister_driver(&agp_i460_pci_driver);
+	pci_unregister_driver(&agp_intel_i460_pci_driver);
 }
 
-module_init(agp_i460_init);
-module_exit(agp_i460_cleanup);
+module_init(agp_intel_i460_init);
+module_exit(agp_intel_i460_cleanup);
 
 MODULE_AUTHOR("Chris Ahna <Christopher.J.Ahna@intel.com>");
 MODULE_LICENSE("GPL and additional rights");
diff -urpN --exclude-from=/home/davej/.exclude bk-linus/drivers/char/agp/i7x05-agp.c agpgart/drivers/char/agp/i7x05-agp.c
--- bk-linus/drivers/char/agp/i7x05-agp.c	2002-12-20 10:56:30.000000000 -0100
+++ agpgart/drivers/char/agp/i7x05-agp.c	2002-12-20 12:17:50.000000000 -0100
@@ -87,6 +87,11 @@ static aper_size_info_16 intel_7505_size
 	{4, 1024, 0, 0xf3f}
 };
 
+static void i7505_setup (u32 mode)
+{
+	if ((agp_generic_agp_3_0_enable)==FALSE)
+		agp_generic_agp_enable(mode);
+}
 
 static int __init intel_7505_setup (struct pci_dev *pdev)
 {
@@ -102,7 +107,7 @@ static int __init intel_7505_setup (stru
 	agp_bridge.cleanup = intel_7505_cleanup;
 	agp_bridge.tlb_flush = intel_7505_tlbflush;
 	agp_bridge.mask_memory = intel_mask_memory;
-	agp_bridge.agp_enable = agp_generic_agp_3_0_enable;
+	agp_bridge.agp_enable = i7505_enable;
 	agp_bridge.cache_flush = global_cache_flush;
 	agp_bridge.create_gatt_table = agp_generic_create_gatt_table;
 	agp_bridge.free_gatt_table = agp_generic_free_gatt_table;
@@ -161,27 +166,26 @@ static int __init agp_lookup_host_bridge
 }
 
 
-static int __init agp_find_supported_device(struct pci_dev *dev)
+static int __init agp_i7x05_probe (struct pci_dev *dev, const struct pci_device_id *ent)
 {
-	agp_bridge.dev = dev;
+	u8 cap_ptr = 0;
 
-	if (pci_find_capability(dev, PCI_CAP_ID_AGP)==0)
+	cap_ptr = pci_find_capability(dev, PCI_CAP_ID_AGP);
+	if (cap_ptr == 0)
 		return -ENODEV;
 
-	/* probe for known chipsets */
-	return agp_lookup_host_bridge(dev);
-}
-
-
-static int agp_i7x05_probe (struct pci_dev *dev, const struct pci_device_id *ent)
-{
-	if (agp_find_supported_device(dev) == 0) {
+	if (agp_lookup_host_bridge(dev) != -ENODEV) {
+		agp_bridge.dev = dev;
+		agp_bridge.capndx = cap_ptr;
+		/* Fill in the mode register */
+		pci_read_config_dword(agp_bridge.dev, agp_bridge.capndx+4, &agp_bridge.mode)
 		agp_register_driver(dev);
 		return 0;
 	}
-	return -ENODEV;	
+	return -ENODEV;
 }
 
+
 static struct pci_device_id agp_i7x05_pci_table[] __initdata = {
 	{
 	.class		= (PCI_CLASS_BRIDGE_HOST << 8),
@@ -196,7 +200,7 @@ static struct pci_device_id agp_i7x05_pc
 
 MODULE_DEVICE_TABLE(pci, agp_i7x05_pci_table);
 
-static struct pci_driver agp_i7x05_pci_driver = {
+static struct __initdata pci_driver agp_i7x05_pci_driver = {
 	.name		= "agpgart-i7x05",
 	.id_table	= agp_i7x05_pci_table,
 	.probe		= agp_i7x05_probe,
diff -urpN --exclude-from=/home/davej/.exclude bk-linus/drivers/char/agp/intel-agp.c agpgart/drivers/char/agp/intel-agp.c
--- bk-linus/drivers/char/agp/intel-agp.c	2002-12-20 10:56:30.000000000 -0100
+++ agpgart/drivers/char/agp/intel-agp.c	2002-12-20 12:17:50.000000000 -0100
@@ -14,12 +14,12 @@ static int agp_try_unsupported __initdat
 static struct aper_size_info_fixed intel_i810_sizes[] =
 {
 	{64, 16384, 4},
-     /* The 32M mode still requires a 64k gatt */
+	/* The 32M mode still requires a 64k gatt */
 	{32, 8192, 4}
 };
 
-#define AGP_DCACHE_MEMORY 1
-#define AGP_PHYS_MEMORY   2
+#define AGP_DCACHE_MEMORY	1
+#define AGP_PHYS_MEMORY		2
 
 static struct gatt_mask intel_i810_masks[] =
 {
@@ -48,12 +48,12 @@ static int intel_i810_fetch_size(void)
 	}
 	if ((smram_miscc & I810_GFX_MEM_WIN_SIZE) == I810_GFX_MEM_WIN_32M) {
 		agp_bridge.previous_size =
-		    agp_bridge.current_size = (void *) (values + 1);
+			agp_bridge.current_size = (void *) (values + 1);
 		agp_bridge.aperture_size_idx = 1;
 		return values[1].size;
 	} else {
 		agp_bridge.previous_size =
-		    agp_bridge.current_size = (void *) (values);
+			agp_bridge.current_size = (void *) (values);
 		agp_bridge.aperture_size_idx = 0;
 		return values[0].size;
 	}
@@ -72,11 +72,10 @@ static int intel_i810_configure(void)
 	pci_read_config_dword(intel_i810_private.i810_dev, I810_MMADDR, &temp);
 	temp &= 0xfff80000;
 
-	intel_i810_private.registers =
-	    (volatile u8 *) ioremap(temp, 128 * 4096);
+	intel_i810_private.registers = (volatile u8 *) ioremap(temp, 128 * 4096);
 
 	if ((INREG32(intel_i810_private.registers, I810_DRAM_CTL)
-	     & I810_DRAM_ROW_0) == I810_DRAM_ROW_0_SDRAM) {
+		& I810_DRAM_ROW_0) == I810_DRAM_ROW_0_SDRAM) {
 		/* This will need to be dynamically assigned */
 		printk(KERN_INFO PFX "detected 4MB dedicated video ram.\n");
 		intel_i810_private.num_dcache_entries = 1024;
@@ -114,7 +113,7 @@ static void intel_i810_agp_enable(u32 mo
 }
 
 static int intel_i810_insert_entries(agp_memory * mem, off_t pg_start,
-				     int type)
+				int type)
 {
 	int i, j, num_entries;
 	void *temp;
@@ -132,12 +131,10 @@ static int intel_i810_insert_entries(agp
 	}
 
 	if (type != 0 || mem->type != 0) {
-		if ((type == AGP_DCACHE_MEMORY) &&
-		    (mem->type == AGP_DCACHE_MEMORY)) {
+		if ((type == AGP_DCACHE_MEMORY) && (mem->type == AGP_DCACHE_MEMORY)) {
 			/* special insert */
 			CACHE_FLUSH();
-			for (i = pg_start;
-			     i < (pg_start + mem->page_count); i++) {
+			for (i = pg_start; i < (pg_start + mem->page_count); i++) {
 				OUTREG32(intel_i810_private.registers,
 					 I810_PTE_BASE + (i * 4),
 					 (i * 4096) | I810_PTE_LOCAL |
@@ -147,15 +144,13 @@ static int intel_i810_insert_entries(agp
 			agp_bridge.tlb_flush(mem);
 			return 0;
 		}
-	        if((type == AGP_PHYS_MEMORY) &&
-		   (mem->type == AGP_PHYS_MEMORY)) {
-		   goto insert;
-		}
+		if((type == AGP_PHYS_MEMORY) && (mem->type == AGP_PHYS_MEMORY))
+			goto insert;
 		return -EINVAL;
 	}
 
 insert:
-   	CACHE_FLUSH();
+	CACHE_FLUSH();
 	for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
 		OUTREG32(intel_i810_private.registers,
 			 I810_PTE_BASE + (j * 4), mem->memory[i]);
@@ -167,7 +162,7 @@ insert:
 }
 
 static int intel_i810_remove_entries(agp_memory * mem, off_t pg_start,
-				     int type)
+				int type)
 {
 	int i;
 
@@ -199,7 +194,7 @@ static agp_memory *intel_i810_alloc_by_t
 		new->page_count = pg_count;
 		new->num_scratch_pages = 0;
 		vfree(new->memory);
-	   	MOD_INC_USE_COUNT;
+		MOD_INC_USE_COUNT;
 		return new;
 	}
 	if(type == AGP_PHYS_MEMORY) {
@@ -209,15 +204,14 @@ static agp_memory *intel_i810_alloc_by_t
 		 * Xserver still writes to it through the agp
 		 * aperture
 		 */
-	   	if (pg_count != 1) {
-		   	return NULL;
-		}
-	   	new = agp_create_memory(1);
+		if (pg_count != 1)
+			return NULL;
 
-		if (new == NULL) {
+		new = agp_create_memory(1);
+		if (new == NULL)
 			return NULL;
-		}
-	   	MOD_INC_USE_COUNT;
+
+		MOD_INC_USE_COUNT;
 		addr = agp_bridge.agp_alloc_page();
 
 		if (addr == NULL) {
@@ -227,25 +221,23 @@ static agp_memory *intel_i810_alloc_by_t
 		}
 		new->memory[0] = agp_bridge.mask_memory(virt_to_phys(addr), type);
 		new->page_count = 1;
-	   	new->num_scratch_pages = 1;
-	   	new->type = AGP_PHYS_MEMORY;
-	        new->physical = virt_to_phys((void *) new->memory[0]);
-	   	return new;
+		new->num_scratch_pages = 1;
+		new->type = AGP_PHYS_MEMORY;
+		new->physical = virt_to_phys((void *) new->memory[0]);
+		return new;
 	}
-   
 	return NULL;
 }
 
 static void intel_i810_free_by_type(agp_memory * curr)
 {
 	agp_free_key(curr->key);
-   	if(curr->type == AGP_PHYS_MEMORY) {
-	   	agp_bridge.agp_destroy_page(
-				 phys_to_virt(curr->memory[0]));
+	if(curr->type == AGP_PHYS_MEMORY) {
+		agp_bridge.agp_destroy_page(phys_to_virt(curr->memory[0]));
 		vfree(curr->memory);
 	}
 	kfree(curr);
-   	MOD_DEC_USE_COUNT;
+	MOD_DEC_USE_COUNT;
 }
 
 static unsigned long intel_i810_mask_memory(unsigned long addr, int type)
@@ -254,7 +246,7 @@ static unsigned long intel_i810_mask_mem
 	return addr | agp_bridge.masks[type].mask;
 }
 
-int __init intel_i810_setup(struct pci_dev *i810_dev)
+static int __init intel_i810_setup(struct pci_dev *i810_dev)
 {
 	intel_i810_private.i810_dev = i810_dev;
 
@@ -295,7 +287,7 @@ static struct aper_size_info_fixed intel
 };
 
 static struct _intel_i830_private {
-	struct pci_dev *i830_dev;   /* device one */
+	struct pci_dev *i830_dev;		/* device one */
 	volatile u8 *registers;
 	int gtt_entries;
 } intel_i830_private;
@@ -533,7 +525,7 @@ static agp_memory *intel_i830_alloc_by_t
 	return(NULL);
 }
 
-int __init intel_i830_setup(struct pci_dev *i830_dev)
+static int __init intel_i830_setup(struct pci_dev *i830_dev)
 {
 	intel_i830_private.i830_dev = i830_dev;
 
@@ -581,8 +573,7 @@ static int intel_fetch_size(void)
 
 	for (i = 0; i < agp_bridge.num_aperture_sizes; i++) {
 		if (temp == values[i].size_value) {
-			agp_bridge.previous_size =
-			    agp_bridge.current_size = (void *) (values + i);
+			agp_bridge.previous_size = agp_bridge.current_size = (void *) (values + i);
 			agp_bridge.aperture_size_idx = i;
 			return values[i].size;
 		}
@@ -627,11 +618,11 @@ static void intel_tlbflush(agp_memory * 
 
 static void intel_8xx_tlbflush(agp_memory * mem)
 {
-  u32 temp;
-  pci_read_config_dword(agp_bridge.dev, INTEL_AGPCTRL, &temp);
-  pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, temp & ~(1 << 7));
-  pci_read_config_dword(agp_bridge.dev, INTEL_AGPCTRL, &temp);
-  pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, temp | (1 << 7));
+	u32 temp;
+	pci_read_config_dword(agp_bridge.dev, INTEL_AGPCTRL, &temp);
+	pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, temp & ~(1 << 7));
+	pci_read_config_dword(agp_bridge.dev, INTEL_AGPCTRL, &temp);
+	pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, temp | (1 << 7));
 }
 
 
@@ -683,7 +674,7 @@ static int intel_configure(void)
 	/* paccfg/nbxcfg */
 	pci_read_config_word(agp_bridge.dev, INTEL_NBXCFG, &temp2);
 	pci_write_config_word(agp_bridge.dev, INTEL_NBXCFG,
-			      (temp2 & ~(1 << 10)) | (1 << 9));
+			(temp2 & ~(1 << 10)) | (1 << 9));
 	/* clear any possible error conditions */
 	pci_write_config_byte(agp_bridge.dev, INTEL_ERRSTS + 1, 7);
 	return 0;
@@ -708,7 +699,7 @@ static int intel_815_configure(void)
 	/* attbase - aperture base */
 	/* the Intel 815 chipset spec. says that bits 29-31 in the
 	* ATTBASE register are reserved -> try not to write them */
-	if (agp_bridge.gatt_bus_addr &  INTEL_815_ATTBASE_MASK)
+	if (agp_bridge.gatt_bus_addr & INTEL_815_ATTBASE_MASK)
 		panic("gatt bus addr too high");
 	pci_read_config_dword(agp_bridge.dev, INTEL_ATTBASE, &addr);
 	addr &= INTEL_815_ATTBASE_MASK;
@@ -729,7 +720,7 @@ static int intel_815_configure(void)
 
 static void intel_820_tlbflush(agp_memory * mem)
 {
-  return;
+	return;
 }
 
 static void intel_820_cleanup(void)
@@ -740,9 +731,9 @@ static void intel_820_cleanup(void)
 	previous_size = A_SIZE_8(agp_bridge.previous_size);
 	pci_read_config_byte(agp_bridge.dev, INTEL_I820_RDCR, &temp);
 	pci_write_config_byte(agp_bridge.dev, INTEL_I820_RDCR, 
-			      temp & ~(1 << 1));
+			temp & ~(1 << 1));
 	pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE,
-			      previous_size->size_value);
+			previous_size->size_value);
 }
 
 
@@ -974,10 +965,10 @@ static struct aper_size_info_16 intel_ge
 
 static struct aper_size_info_8 intel_830mp_sizes[4] = 
 {
-  {256, 65536, 6, 0},
-  {128, 32768, 5, 32},
-  {64, 16384, 4, 48},
-  {32, 8192, 3, 56}
+	{256, 65536, 6, 0},
+	{128, 32768, 5, 32},
+	{64, 16384, 4, 48},
+	{32, 8192, 3, 56}
 };
 
 static int __init intel_generic_setup (struct pci_dev *pdev)
@@ -1322,7 +1313,7 @@ static int __init agp_lookup_host_bridge
 	/* try init anyway, if user requests it */
 	if (agp_try_unsupported) {
 		printk(KERN_WARNING PFX "Trying generic Intel routines"
-		       " for device id: %04x\n", pdev->device);
+			" for device id: %04x\n", pdev->device);
 		agp_bridge.type = INTEL_GENERIC;
 		return intel_generic_setup(pdev);
 	}
@@ -1338,6 +1329,7 @@ static int __init agp_lookup_host_bridge
 static int __init agp_find_supported_device(struct pci_dev *dev)
 {
 	struct pci_dev *i810_dev;
+	u8 cap_ptr = 0;
 
 	agp_bridge.dev = dev;
 
@@ -1347,7 +1339,7 @@ static int __init agp_find_supported_dev
 		i810_dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82810_IG1, NULL);
 		if (i810_dev == NULL) {
 			printk(KERN_ERR PFX "Detected an Intel i810,"
-			       " but could not find the secondary device.\n");
+				" but could not find the secondary device.\n");
 			return -ENODEV;
 		}
 		printk(KERN_INFO PFX "Detected an Intel i810 Chipset.\n");
@@ -1358,7 +1350,7 @@ static int __init agp_find_supported_dev
 		i810_dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82810_IG3, NULL);
 		if (i810_dev == NULL) {
 			printk(KERN_ERR PFX "Detected an Intel i810 DC100, but could not find the "
-			       "secondary device.\n");
+				"secondary device.\n");
 			return -ENODEV;
 		}
 		printk(KERN_INFO PFX "Detected an Intel i810 DC100 Chipset.\n");
@@ -1369,7 +1361,7 @@ static int __init agp_find_supported_dev
 		i810_dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82810E_IG, NULL);
 		if (i810_dev == NULL) {
 			printk(KERN_ERR PFX "Detected an Intel i810 E"
-			    ", but could not find the secondary device.\n");
+				", but could not find the secondary device.\n");
 			return -ENODEV;
 		}
 		printk(KERN_INFO PFX "Detected an Intel i810 E Chipset.\n");
@@ -1377,11 +1369,11 @@ static int __init agp_find_supported_dev
 		return intel_i810_setup(i810_dev);
 
 	 case PCI_DEVICE_ID_INTEL_82815_MC:
-	   /* The i815 can operate either as an i810 style
-	    * integrated device, or as an AGP4X motherboard.
-	    *
-	    * This only addresses the first mode:
-	    */
+		/* The i815 can operate either as an i810 style
+		 * integrated device, or as an AGP4X motherboard.
+		 *
+		 * This only addresses the first mode:
+		 */
 		i810_dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82815_CGC, NULL);
 		if (i810_dev == NULL) {
 			printk(KERN_ERR PFX "agpgart: Detected an "
@@ -1413,7 +1405,7 @@ static int __init agp_find_supported_dev
 		printk(KERN_INFO PFX "Detected an Intel 845G Chipset.\n");
 		agp_bridge.type = INTEL_I810;
 		return intel_i830_setup(i810_dev);
-		   
+
 	case PCI_DEVICE_ID_INTEL_82830_HB:
 		i810_dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82830_CGC, NULL);
 		if(i810_dev && PCI_FUNC(i810_dev->devfn) != 0)
@@ -1433,15 +1425,20 @@ static int __init agp_find_supported_dev
 		break;
 	}
 
-	if (pci_find_capability(dev, PCI_CAP_ID_AGP)==0)
+	cap_ptr = pci_find_capability(dev, PCI_CAP_ID_AGP);
+	if (cap_ptr == 0)
 		return -ENODEV;
+	agp_bridge.capndx = cap_ptr;
+
+	/* Fill in the mode register */
+	pci_read_config_dword(agp_bridge.dev, agp_bridge.capndx+4, &agp_bridge.mode);
 
 	/* probe for known chipsets */
 	return agp_lookup_host_bridge(dev);
 }
 
 
-static int agp_intel_probe (struct pci_dev *dev, const struct pci_device_id *ent)
+static int __init agp_intel_probe (struct pci_dev *dev, const struct pci_device_id *ent)
 {
 	if (agp_find_supported_device(dev) == 0) {
 		agp_register_driver(dev);
@@ -1464,7 +1461,7 @@ static struct pci_device_id agp_intel_pc
 
 MODULE_DEVICE_TABLE(pci, agp_intel_pci_table);
 
-static struct pci_driver agp_intel_pci_driver = {
+static struct __initdata pci_driver agp_intel_pci_driver = {
 	.name		= "agpgart-intel",
 	.id_table	= agp_intel_pci_table,
 	.probe		= agp_intel_probe,
@@ -1498,4 +1495,3 @@ module_exit(agp_intel_cleanup);
 MODULE_PARM(agp_try_unsupported, "1i");
 MODULE_AUTHOR("Dave Jones <davej@codemonkey.org.uk>");
 MODULE_LICENSE("GPL and additional rights");
-
diff -urpN --exclude-from=/home/davej/.exclude bk-linus/drivers/char/agp/sis-agp.c agpgart/drivers/char/agp/sis-agp.c
--- bk-linus/drivers/char/agp/sis-agp.c	2002-12-20 10:56:30.000000000 -0100
+++ agpgart/drivers/char/agp/sis-agp.c	2002-12-20 12:17:50.000000000 -0100
@@ -86,7 +86,7 @@ static struct gatt_mask sis_generic_mask
 	{.mask = 0x00000000, .type = 0}
 };
 
-int __init sis_generic_setup (struct pci_dev *pdev)
+static int __init sis_generic_setup (struct pci_dev *pdev)
 {
 	agp_bridge.masks = sis_generic_masks;
 	agp_bridge.num_of_masks = 1;
@@ -223,25 +223,24 @@ static int __init agp_lookup_host_bridge
 }
 
 
-static int __init agp_find_supported_device(struct pci_dev *dev)
+static int __init agp_sis_probe (struct pci_dev *dev, const struct pci_device_id *ent)
 {
-	agp_bridge.dev = dev;
+	u8 cap_ptr = 0;
 
-	if (pci_find_capability(dev, PCI_CAP_ID_AGP)==0)
+	cap_ptr = pci_find_capability(dev, PCI_CAP_ID_AGP);
+	if (cap_ptr == 0)
 		return -ENODEV;
 
 	/* probe for known chipsets */
-	return agp_lookup_host_bridge (dev);
-}
-
-
-static int agp_sis_probe (struct pci_dev *dev, const struct pci_device_id *ent)
-{
-	if (agp_find_supported_device(dev) == 0) {
+	if (agp_lookup_host_bridge(dev) != -ENODEV) {
+		agp_bridge.dev = dev;
+		agp_bridge.capndx = cap_ptr;
+		/* Fill in the mode register */
+		pci_read_config_dword(agp_bridge.dev, agp_bridge.capndx+4, &agp_bridge.mode);
 		agp_register_driver(dev);
 		return 0;
 	}
-	return -ENODEV;	
+	return -ENODEV;
 }
 
 static struct pci_device_id agp_sis_pci_table[] __initdata = {
@@ -258,13 +257,13 @@ static struct pci_device_id agp_sis_pci_
 
 MODULE_DEVICE_TABLE(pci, agp_sis_pci_table);
 
-static struct pci_driver agp_sis_pci_driver = {
+static struct __initdata pci_driver agp_sis_pci_driver = {
 	.name		= "agpgart-sis",
 	.id_table	= agp_sis_pci_table,
 	.probe		= agp_sis_probe,
 };
 
-int __init agp_sis_init(void)
+static int __init agp_sis_init(void)
 {
 	int ret_val;
 
diff -urpN --exclude-from=/home/davej/.exclude bk-linus/drivers/char/agp/sworks-agp.c agpgart/drivers/char/agp/sworks-agp.c
--- bk-linus/drivers/char/agp/sworks-agp.c	2002-12-20 10:56:30.000000000 -0100
+++ agpgart/drivers/char/agp/sworks-agp.c	2002-12-20 12:17:50.000000000 -0100
@@ -169,9 +169,7 @@ static int serverworks_create_gatt_table
 	 * used to program the agp master not the cpu
 	 */
 
-	pci_read_config_dword(agp_bridge.dev,
-			      serverworks_private.gart_addr_ofs,
-			      &temp);
+	pci_read_config_dword(agp_bridge.dev,serverworks_private.gart_addr_ofs,&temp);
 	agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
 
 	/* Calculate the agp offset */	
@@ -206,18 +204,11 @@ static int serverworks_fetch_size(void)
 	struct aper_size_info_lvl2 *values;
 
 	values = A_SIZE_LVL2(agp_bridge.aperture_sizes);
-	pci_read_config_dword(agp_bridge.dev,
-			      serverworks_private.gart_addr_ofs,
-			      &temp);
-	pci_write_config_dword(agp_bridge.dev,
-			       serverworks_private.gart_addr_ofs,
-			       SVWRKS_SIZE_MASK);
-	pci_read_config_dword(agp_bridge.dev,
-			      serverworks_private.gart_addr_ofs,
-			      &temp2);
-	pci_write_config_dword(agp_bridge.dev,
-			       serverworks_private.gart_addr_ofs,
-			       temp);
+	pci_read_config_dword(agp_bridge.dev,serverworks_private.gart_addr_ofs,&temp);
+	pci_write_config_dword(agp_bridge.dev,serverworks_private.gart_addr_ofs,
+					SVWRKS_SIZE_MASK);
+	pci_read_config_dword(agp_bridge.dev,serverworks_private.gart_addr_ofs,&temp2);
+	pci_write_config_dword(agp_bridge.dev,serverworks_private.gart_addr_ofs,temp);
 	temp2 &= SVWRKS_SIZE_MASK;
 
 	for (i = 0; i < agp_bridge.num_aperture_sizes; i++) {
@@ -245,9 +236,7 @@ static int serverworks_configure(void)
 	current_size = A_SIZE_LVL2(agp_bridge.current_size);
 
 	/* Get the memory mapped registers */
-	pci_read_config_dword(agp_bridge.dev,
-			      serverworks_private.mm_addr_ofs,
-			      &temp);
+	pci_read_config_dword(agp_bridge.dev, serverworks_private.mm_addr_ofs, &temp);
 	temp = (temp & PCI_BASE_ADDRESS_MEM_MASK);
 	serverworks_private.registers = (volatile u8 *) ioremap(temp, 4096);
 
@@ -269,7 +258,7 @@ static int serverworks_configure(void)
 	agp_bridge.tlb_flush(NULL);
 
 	pci_read_config_byte(serverworks_private.svrwrks_dev, 0x34, &cap_ptr);
-	if (cap_ptr != 0x00) {
+	if (cap_ptr != 0) {
 		do {
 			pci_read_config_dword(serverworks_private.svrwrks_dev,
 					      cap_ptr, &cap_id);
@@ -277,30 +266,21 @@ static int serverworks_configure(void)
 			if ((cap_id & 0xff) != 0x02)
 				cap_ptr = (cap_id >> 8) & 0xff;
 		}
-		while (((cap_id & 0xff) != 0x02) && (cap_ptr != 0x00));
+		while (((cap_id & 0xff) != 0x02) && (cap_ptr != 0));
 	}
 	agp_bridge.capndx = cap_ptr;
 
 	/* Fill in the mode register */
 	pci_read_config_dword(serverworks_private.svrwrks_dev,
-			      agp_bridge.capndx + 4,
-			      &agp_bridge.mode);
+			      agp_bridge.capndx+4, &agp_bridge.mode);
 
-	pci_read_config_byte(agp_bridge.dev,
-			     SVWRKS_CACHING,
-			     &enable_reg);
+	pci_read_config_byte(agp_bridge.dev, SVWRKS_CACHING, &enable_reg);
 	enable_reg &= ~0x3;
-	pci_write_config_byte(agp_bridge.dev,
-			      SVWRKS_CACHING,
-			      enable_reg);
-
-	pci_read_config_byte(agp_bridge.dev,
-			     SVWRKS_FEATURE,
-			     &enable_reg);
+	pci_write_config_byte(agp_bridge.dev, SVWRKS_CACHING, enable_reg);
+
+	pci_read_config_byte(agp_bridge.dev, SVWRKS_FEATURE, &enable_reg);
 	enable_reg |= (1<<6);
-	pci_write_config_byte(agp_bridge.dev,
-			      SVWRKS_FEATURE,
-			      enable_reg);
+	pci_write_config_byte(agp_bridge.dev,SVWRKS_FEATURE, enable_reg);
 
 	return 0;
 }
@@ -532,7 +512,7 @@ static void serverworks_agp_enable(u32 m
 	}
 }
 
-int __init serverworks_setup (struct pci_dev *pdev)
+static int __init serverworks_setup (struct pci_dev *pdev)
 {
 	u32 temp;
 	u32 temp2;
@@ -606,7 +586,6 @@ int __init serverworks_setup (struct pci
 static int __init agp_find_supported_device(struct pci_dev *dev)
 {
 	struct pci_dev *bridge_dev;
-	agp_bridge.dev = dev;
 
 	/* Everything is on func 1 here so we are hardcoding function one */
 	bridge_dev = pci_find_slot ((unsigned int)dev->bus->number, PCI_DEVFN(0, 1));
@@ -617,6 +596,8 @@ static int __init agp_find_supported_dev
 		return -ENODEV;
 	}
 
+	agp_bridge.dev = dev;
+
 	switch (dev->device) {
 	case PCI_DEVICE_ID_SERVERWORKS_HE:
 		agp_bridge.type = SVWRKS_HE;
@@ -638,7 +619,7 @@ static int __init agp_find_supported_dev
 }
 
 
-static int agp_serverworks_probe (struct pci_dev *dev, const struct pci_device_id *ent)
+static int __init agp_serverworks_probe (struct pci_dev *dev, const struct pci_device_id *ent)
 {
 	if (agp_find_supported_device(dev) == 0) {
 		agp_register_driver(dev);
@@ -661,7 +642,7 @@ static struct pci_device_id agp_serverwo
 
 MODULE_DEVICE_TABLE(pci, agp_serverworks_pci_table);
 
-static struct pci_driver agp_serverworks_pci_driver = {
+static struct __initdata pci_driver agp_serverworks_pci_driver = {
 	.name		= "agpgart-serverworks",
 	.id_table	= agp_serverworks_pci_table,
 	.probe		= agp_serverworks_probe,
diff -urpN --exclude-from=/home/davej/.exclude bk-linus/drivers/char/agp/via-agp.c agpgart/drivers/char/agp/via-agp.c
--- bk-linus/drivers/char/agp/via-agp.c	2002-12-20 10:56:30.000000000 -0100
+++ agpgart/drivers/char/agp/via-agp.c	2002-12-18 09:52:49.000000000 -0100
@@ -94,7 +94,7 @@ static struct gatt_mask via_generic_mask
 	{.mask = 0x00000000, .type = 0}
 };
 
-int __init via_generic_setup (struct pci_dev *pdev)
+static int __init via_generic_setup (struct pci_dev *pdev)
 {
 	agp_bridge.masks = via_generic_masks;
 	agp_bridge.num_of_masks = 1;
@@ -124,13 +124,64 @@ int __init via_generic_setup (struct pci
 	return 0;
 }
 
-struct agp_device_ids via_agp_device_ids[] __initdata =
+
+/*
+ * The KT400 does magick to put the AGP bridge compliant with the same
+ * standards version as the graphics card. If we haven't fallen into
+ * 2.0 compatability mode, we run the normal 3.0 code, and fall back
+ * if something nasty happens.
+ */
+static void __init via_kt400_enable(u32 mode)
+{
+	if ((agp_generic_agp_3_0_enable(mode))==FALSE)
+		/* Something weird happened, fall back to 2.0 */
+		agp_generic_agp_enable(mode);
+}
+
+static int __init via_kt400_setup(struct pci_dev *pdev)
+{
+	u8 reg;
+
+	agp_bridge.masks = via_generic_masks;
+	agp_bridge.num_of_masks = 1;
+	agp_bridge.aperture_sizes = (void *) via_generic_sizes;
+	agp_bridge.size_type = U8_APER_SIZE;
+	agp_bridge.num_aperture_sizes = 7;
+	agp_bridge.dev_private_data = NULL;
+	agp_bridge.needs_scratch_page = FALSE;
+	agp_bridge.configure = via_configure;
+	agp_bridge.fetch_size = via_fetch_size;
+	agp_bridge.cleanup = via_cleanup;
+	agp_bridge.tlb_flush = via_tlbflush;
+	agp_bridge.mask_memory = via_mask_memory;
+	agp_bridge.cache_flush = global_cache_flush;
+	agp_bridge.create_gatt_table = agp_generic_create_gatt_table;
+	agp_bridge.free_gatt_table = agp_generic_free_gatt_table;
+	agp_bridge.insert_memory = agp_generic_insert_memory;
+	agp_bridge.remove_memory = agp_generic_remove_memory;
+	agp_bridge.alloc_by_type = agp_generic_alloc_by_type;
+	agp_bridge.free_by_type = agp_generic_free_by_type;
+	agp_bridge.agp_alloc_page = agp_generic_alloc_page;
+	agp_bridge.agp_destroy_page = agp_generic_destroy_page;
+	agp_bridge.suspend = agp_generic_suspend;
+	agp_bridge.resume = agp_generic_resume;
+	agp_bridge.cant_use_aperture = 0;
+
+	pci_read_config_byte(agp_bridge.dev, VIA_AGPSEL, &reg);
+	if ((reg & (1<<1))==1) {
+		/* AGP 2.0 compatability mode. */
+		agp_bridge.agp_enable = agp_generic_agp_enable;
+
+	} else {
+
+		/* AGP 3.0 mode */
+		agp_bridge.agp_enable = via_kt400_enable;
+	}
+	return 0;
+}
+
+static struct agp_device_ids via_agp_device_ids[] __initdata =
 {
-	{
-		.device_id	= PCI_DEVICE_ID_VIA_8501_0,
-		.chipset	= VIA_MVP4,
-		.chipset_name	= "MVP4",
-	},
 	{
 		.device_id	= PCI_DEVICE_ID_VIA_82C597_0,
 		.chipset	= VIA_VP3,
@@ -142,6 +193,11 @@ struct agp_device_ids via_agp_device_ids
 		.chipset_name	= "MVP3",
 	},
 	{
+		.device_id	= PCI_DEVICE_ID_VIA_8501_0,
+		.chipset	= VIA_MVP4,
+		.chipset_name	= "MVP4",
+	},
+	{
 		.device_id	= PCI_DEVICE_ID_VIA_82C691,
 		.chipset	= VIA_APOLLO_PRO,
 		.chipset_name	= "Apollo Pro",
@@ -167,19 +223,21 @@ struct agp_device_ids via_agp_device_ids
 		.chipset_name	= "Apollo Pro KT266",
 	},
 	{
+		.device_id	= PCI_DEVICE_ID_VIA_8653_0,
+		.chipset	= VIA_APOLLO_PRO,
+		.chipset_name	= "Apollo Pro 266T",
+	},
+	{
 		.device_id	= PCI_DEVICE_ID_VIA_8377_0,
 		.chipset	= VIA_APOLLO_KT400,
 		.chipset_name	= "Apollo Pro KT400",
+		.chipset_setup	= via_kt400_setup,
 	},
 	{
-		.device_id	= PCI_DEVICE_ID_VIA_8653_0,
-		.chipset	= VIA_APOLLO_PRO,
-		.chipset_name	= "Apollo Pro266T",
-	},
-	{
+		/* VIA ProSavage PM133 (Apollo Pro133A chipset with S3 Savage4) */
 		.device_id	= PCI_DEVICE_ID_VIA_82C694X_0,
 		.chipset	= VIA_VT8605,
-		.chipset_name	= "PM133"
+		.chipset_name	= "Apollo ProSavage PM133"
 	},
 	{ }, /* dummy final entry, always present */
 };
@@ -220,15 +278,20 @@ static int __init agp_lookup_host_bridge
 }
 
 
-static int agp_via_probe (struct pci_dev *dev, const struct pci_device_id *ent)
+static int __init agp_via_probe (struct pci_dev *dev, const struct pci_device_id *ent)
 {
-	if (pci_find_capability(dev, PCI_CAP_ID_AGP)==0)
-		return -ENODEV;
+	u8 cap_ptr = 0;
 
-	agp_bridge.dev = dev;
+	cap_ptr = pci_find_capability(dev, PCI_CAP_ID_AGP);
+	if (cap_ptr == 0)
+		return -ENODEV;
 
 	/* probe for known chipsets */
 	if (agp_lookup_host_bridge (dev) != -ENODEV) {
+		agp_bridge.dev = dev;
+		agp_bridge.capndx = cap_ptr;
+		/* Fill in the mode register */
+		pci_read_config_dword(agp_bridge.dev, agp_bridge.capndx+4, &agp_bridge.mode);
 		agp_register_driver(dev);
 		return 0;
 	}
@@ -249,7 +312,7 @@ static struct pci_device_id agp_via_pci_
 
 MODULE_DEVICE_TABLE(pci, agp_via_pci_table);
 
-static struct pci_driver agp_via_pci_driver = {
+static struct __initdata pci_driver agp_via_pci_driver = {
 	.name		= "agpgart-via",
 	.id_table	= agp_via_pci_table,
 	.probe		= agp_via_probe,