]> git.hungrycats.org Git - linux/commitdiff
[AGPGART] Merge VIA KT400 AGP3 support into main via-agp module.
authorDave Jones <davej@codemonkey.org.uk>
Mon, 10 Feb 2003 17:45:11 +0000 (16:45 -0100)
committerDave Jones <davej@tetrachloride.(none)>
Mon, 10 Feb 2003 17:45:11 +0000 (16:45 -0100)
This removes lots of annoying problems trying to prevent both modules
from being loaded, and also shares quite a bit of code.
CONFIG_AGP3 will disable AGP3 mode operation of KT400s.

drivers/char/agp/Kconfig
drivers/char/agp/Makefile
drivers/char/agp/agp.h
drivers/char/agp/generic-3.0.c
drivers/char/agp/via-agp.c
drivers/char/agp/via-kt400.c [deleted file]

index 97d74327e07e6388fd15d968cb8df2cc144f1ec2..907d9fa66db8b6ea946922747a1bca13f846fd30 100644 (file)
@@ -61,16 +61,6 @@ config AGP_VIA
          You should say Y here if you use XFree86 3.3.6 or 4.x and want to
          use GLX or DRI.  If unsure, say N.
 
-config AGP_VIA_KT400
-       tristate "VIA KT400 chipset support"
-       depends on AGP3
-       help
-         This option gives you AGP support for the GLX component of the
-         XFree86 4.x on VIA KT400 AGP 3.0 chipsets.
-
-         You should say Y here if you use XFree86 3.3.6 or 4.x and want to
-         use GLX or DRI.  If unsure, say N.
-
 config AGP_AMD
        tristate "AMD Irongate, 761, and 762 support"
        depends on AGP
index 9531c6bc8ef5c5ac0c4c10b7a376477332bb10e9..6ad2d3d4a911f7a1e70f094404e510f197d81e99 100644 (file)
@@ -10,7 +10,6 @@ obj-$(CONFIG_AGP) += agpgart.o
 
 obj-$(CONFIG_AGP_INTEL)                += intel-agp.o
 obj-$(CONFIG_AGP_VIA)          += via-agp.o
-obj-$(CONFIG_AGP_VIA_KT400)    += via-kt400.o
 obj-$(CONFIG_AGP_AMD)          += amd-k7-agp.o
 obj-$(CONFIG_AGP_SIS)          += sis-agp.o
 obj-$(CONFIG_AGP_ALI)          += ali-agp.o
index 25e4c024432ef500c016be42968de27681d910b3..f228b43d1ccaaf1d938f64dc16acc57ffdc1b001 100644 (file)
@@ -367,7 +367,7 @@ struct agp_driver {
 
 /* Generic routines. */
 void agp_generic_agp_enable(u32 mode);
-int agp_generic_agp_3_0_enable(u32 mode);
+void 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);
index 40c20bad5f2fa0405ae6026fc58db6a6b36a5cd3..14aa760ee717ed6020ab8587f18df15fde4c02d6 100644 (file)
@@ -525,7 +525,7 @@ get_out:
  * (AGP 3.0 devices are required to operate as AGP 2.0 devices 
  * when not using 3.0 electricals.
  */
-int agp_generic_agp_3_0_enable(u32 mode)
+void agp_generic_agp_3_0_enable(u32 mode)
 {
        u32 ncapid, major, minor, agp_3_0;
 
@@ -541,12 +541,9 @@ int agp_generic_agp_3_0_enable(u32 mode)
                /* 
                 * Check to see if we are operating in 3.0 mode 
                 */
-               if((agp_3_0 >> 3) & 0x1) {
+               if((agp_3_0 >> 3) & 0x1)
                        agp_3_0_node_enable(mode, minor);
-                       return TRUE;
-               }
        }
-       return FALSE;
 }
 
 EXPORT_SYMBOL(agp_generic_agp_3_0_enable);
index ec3c62cfeb8b0aa92bef279a745508f303c359cc..1d0c22b170b246edca4d8cc8942ce7e6f911e775 100644 (file)
@@ -11,6 +11,7 @@
 
 static int agp_try_unsupported __initdata = 0;
 
+
 static int via_fetch_size(void)
 {
        int i;
@@ -27,10 +28,10 @@ static int via_fetch_size(void)
                        return values[i].size;
                }
        }
-
        return 0;
 }
 
+
 static int via_configure(void)
 {
        u32 temp;
@@ -53,6 +54,7 @@ static int via_configure(void)
        return 0;
 }
 
+
 static void via_cleanup(void)
 {
        struct aper_size_info_8 *previous_size;
@@ -65,12 +67,14 @@ static void via_cleanup(void)
         */
 }
 
+
 static void via_tlbflush(agp_memory * mem)
 {
        pci_write_config_dword(agp_bridge->dev, VIA_GARTCTRL, 0x0000008f);
        pci_write_config_dword(agp_bridge->dev, VIA_GARTCTRL, 0x0000000f);
 }
 
+
 static unsigned long via_mask_memory(unsigned long addr, int type)
 {
        /* Memory type is ignored */
@@ -78,6 +82,7 @@ static unsigned long via_mask_memory(unsigned long addr, int type)
        return addr | agp_bridge->masks[0].mask;
 }
 
+
 static struct aper_size_info_8 via_generic_sizes[7] =
 {
        {256, 65536, 6, 0},
@@ -89,30 +94,148 @@ static struct aper_size_info_8 via_generic_sizes[7] =
        {4, 1024, 0, 252}
 };
 
+
 static struct gatt_mask via_generic_masks[] =
 {
        {.mask = 0x00000000, .type = 0}
 };
 
-static int __init via_generic_setup (struct pci_dev *pdev)
+
+#ifdef CONFIG_AGP3
+static int via_fetch_size_agp3(void)
 {
-       u8 reg;
+       int i;
+       u16 temp;
+       struct aper_size_info_16 *values;
+
+       values = A_SIZE_16(agp_bridge->aperture_sizes);
+       pci_read_config_word(agp_bridge->dev, VIA_AGP3_APSIZE, &temp);
+       temp &= 0xfff;
+
+       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->aperture_size_idx = i;
+                       return values[i].size;
+               }
+       }
+       return 0;
+}
+
+
+static int via_configure_agp3(void)
+{
+       u32 temp;
+       struct aper_size_info_16 *current_size;
+    
+       current_size = A_SIZE_16(agp_bridge->current_size);
+
+       /* address to map too */
+       pci_read_config_dword(agp_bridge->dev, VIA_APBASE, &temp);
+       agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
+
+       /* attbase - aperture GATT base */
+       pci_write_config_dword(agp_bridge->dev, VIA_AGP3_ATTBASE,
+               agp_bridge->gatt_bus_addr & 0xfffff000);
+       return 0;
+}
+
+
+static void via_cleanup_agp3(void)
+{
+       struct aper_size_info_16 *previous_size;
+
+       previous_size = A_SIZE_16(agp_bridge->previous_size);
+       pci_write_config_byte(agp_bridge->dev, VIA_APSIZE, previous_size->size_value);
+}
+
+
+static void via_tlbflush_agp3(agp_memory * mem)
+{
+       u32 temp;
+
+       pci_read_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, &temp);
+       pci_write_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, temp & ~(1<<7));
+       pci_write_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, temp);
+}
+
+
+static struct aper_size_info_16 via_generic_agp3_sizes[11] =
+{
+       { 4,     1024,  0, 1<<11|1<<10|1<<9|1<<8|1<<5|1<<4|1<<3|1<<2|1<<1|1<<0 },
+       { 8,     2048,  1, 1<<11|1<<10|1<<9|1<<8|1<<5|1<<4|1<<3|1<<2|1<<1},
+       { 16,    4096,  2, 1<<11|1<<10|1<<9|1<<8|1<<5|1<<4|1<<3|1<<2},
+       { 32,    8192,  3, 1<<11|1<<10|1<<9|1<<8|1<<5|1<<4|1<<3},
+       { 64,   16384,  4, 1<<11|1<<10|1<<9|1<<8|1<<5|1<<4},
+       { 128,  32768,  5, 1<<11|1<<10|1<<9|1<<8|1<<5},
+       { 256,  65536,  6, 1<<11|1<<10|1<<9|1<<8},
+       { 512,  131072, 7, 1<<11|1<<10|1<<9},
+       { 1024, 262144, 8, 1<<11|1<<10},
+       { 2048, 524288, 9, 1<<11}       /* 2GB <- Max supported */
+};
+
+
+static int __init via_generic_agp3_setup (struct pci_dev *pdev)
+{
+       agp_bridge->dev = pdev;
+       agp_bridge->type = VIA_APOLLO_KT400_3;
+       agp_bridge->masks = via_generic_masks;
+       agp_bridge->aperture_sizes = (void *) via_generic_agp3_sizes;
+       agp_bridge->size_type = U16_APER_SIZE;
+       agp_bridge->num_aperture_sizes = 10;
+       agp_bridge->dev_private_data = NULL;
+       agp_bridge->needs_scratch_page = FALSE;
+       agp_bridge->agp_enable = agp_generic_agp_3_0_enable;
+       agp_bridge->configure = via_configure_agp3;
+       agp_bridge->fetch_size = via_fetch_size_agp3;
+       agp_bridge->cleanup = via_cleanup_agp3;
+       agp_bridge->tlb_flush = via_tlbflush_agp3;
+       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;
+       return 0;
+}
+#else
+static int __init via_generic_agp3_setup (struct pci_dev *pdev)
+{
+       printk (KERN_INFO PFX "Bridge in AGP3 mode, but CONFIG_AGP3=n\n");
+       return -ENODEV;
+}
+#endif /* CONFIG_AGP3 */
+
 
+static int __init via_generic_setup (struct pci_dev *pdev)
+{
+#ifdef CONFIG_AGP3
        /* Garg, there are KT400s with KT266 IDs. */
        if (pdev->device == PCI_DEVICE_ID_VIA_8367_0) {
+
                /* Is there a KT400 subsystem ? */
                if (pdev->subsystem_device==PCI_DEVICE_ID_VIA_8377_0) {
-                       pci_read_config_byte(pdev, VIA_AGPSEL, &reg);
+                       u8 reg;
+
+                       printk (KERN_INFO PFX "Found KT400 in disguise as a KT266.\n");
 
                        /* Check AGP compatability mode. */
-                       if ((reg & (1<<1))==0) {
-                               printk ("KT400 in AGP3.0 mode. Use via-kt400 driver\n");
-                               return -ENODEV;
-                       }
+                       pci_read_config_byte(pdev, VIA_AGPSEL, &reg);
+                       if ((reg & (1<<1))==0)
+                               return via_generic_agp3_setup(pdev);
 
-                       printk (KERN_INFO PFX "Found KT400 in disguise as a KT266.\n");
+                       /* Its in 2.0 mode, drop through. */
                }
        }
+#endif
 
        agp_bridge->masks = via_generic_masks;
        agp_bridge->aperture_sizes = (void *) via_generic_sizes;
@@ -141,25 +264,20 @@ static int __init via_generic_setup (struct pci_dev *pdev)
        return 0;
 }
 
-/*
- * 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 abort, as this gets picked up by
- * via-agp3.o
- */
 
+/* The KT400 does magick to put the AGP bridge compliant with the same
+ * standards version as the graphics card. */
 static int __init via_kt400_setup(struct pci_dev *pdev)
 {
        u8 reg;
        pci_read_config_byte(pdev, VIA_AGPSEL, &reg);
        /* Check AGP 2.0 compatability mode. */
-       if ((reg & (1<<1))==1) {
-               via_generic_setup(pdev);
-               return 0;
-       }
-       return -ENODEV;
+       if ((reg & (1<<1))==0)
+               return via_generic_agp3_setup(pdev);
+       return via_generic_setup(pdev);
 }
 
+
 static struct agp_device_ids via_agp_device_ids[] __initdata =
 {
        {
@@ -358,10 +476,12 @@ static int __init agp_lookup_host_bridge (struct pci_dev *pdev)
        return -ENODEV;
 }
 
+
 static struct agp_driver via_agp_driver = {
        .owner = THIS_MODULE,
 };
 
+
 static int __init agp_via_probe (struct pci_dev *dev, const struct pci_device_id *ent)
 {
        u8 cap_ptr = 0;
@@ -383,6 +503,7 @@ static int __init agp_via_probe (struct pci_dev *dev, const struct pci_device_id
        return -ENODEV; 
 }
 
+
 static struct pci_device_id agp_via_pci_table[] __initdata = {
        {
        .class          = (PCI_CLASS_BRIDGE_HOST << 8),
@@ -397,12 +518,14 @@ static struct pci_device_id agp_via_pci_table[] __initdata = {
 
 MODULE_DEVICE_TABLE(pci, agp_via_pci_table);
 
+
 static struct __initdata pci_driver agp_via_pci_driver = {
        .name           = "agpgart-via",
        .id_table       = agp_via_pci_table,
        .probe          = agp_via_probe,
 };
 
+
 static int __init agp_via_init(void)
 {
        int ret_val;
@@ -414,14 +537,17 @@ static int __init agp_via_init(void)
        return ret_val;
 }
 
+
 static void __exit agp_via_cleanup(void)
 {
        agp_unregister_driver(&via_agp_driver);
        pci_unregister_driver(&agp_via_pci_driver);
 }
 
+
 module_init(agp_via_init);
 module_exit(agp_via_cleanup);
 
 MODULE_PARM(agp_try_unsupported, "1i");
 MODULE_LICENSE("GPL and additional rights");
+MODULE_AUTHOR("Dave Jones <davej@codemonkey.org.uk>");
diff --git a/drivers/char/agp/via-kt400.c b/drivers/char/agp/via-kt400.c
deleted file mode 100644 (file)
index 34ee9df..0000000
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * VIA KT400 AGPGART routines. 
- *
- * 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 this code. Otherwise, we run the
- * code in via-agp.c
- */
-
-#include <linux/types.h>
-#include <linux/module.h>
-#include <linux/pci.h>
-#include <linux/init.h>
-#include <linux/agp_backend.h>
-#include "agp.h"
-
-static int via_fetch_size(void)
-{
-       int i;
-       u16 temp;
-       struct aper_size_info_16 *values;
-
-       values = A_SIZE_16(agp_bridge->aperture_sizes);
-       pci_read_config_word(agp_bridge->dev, VIA_AGP3_APSIZE, &temp);
-       temp &= 0xfff;
-
-       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->aperture_size_idx = i;
-                       return values[i].size;
-               }
-       }
-       return 0;
-}
-
-static int via_configure(void)
-{
-       u32 temp;
-       struct aper_size_info_16 *current_size;
-    
-       current_size = A_SIZE_16(agp_bridge->current_size);
-
-       /* address to map too */
-       pci_read_config_dword(agp_bridge->dev, VIA_APBASE, &temp);
-       agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
-
-       /* attbase - aperture GATT base */
-       pci_write_config_dword(agp_bridge->dev, VIA_AGP3_ATTBASE,
-               agp_bridge->gatt_bus_addr & 0xfffff000);
-       return 0;
-}
-
-static void via_cleanup(void)
-{
-       struct aper_size_info_16 *previous_size;
-
-       previous_size = A_SIZE_16(agp_bridge->previous_size);
-       pci_write_config_byte(agp_bridge->dev, VIA_APSIZE, previous_size->size_value);
-}
-
-static void via_tlbflush(agp_memory * mem)
-{
-       u32 temp;
-
-       pci_read_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, &temp);
-       pci_write_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, temp & ~(1<<7));
-       pci_write_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, temp);
-}
-
-static unsigned long via_mask_memory(unsigned long addr, int type)
-{
-       /* Memory type is ignored */
-
-       return addr | agp_bridge->masks[0].mask;
-}
-
-static struct aper_size_info_16 via_generic_sizes[11] =
-{
-       { 4,     1024,  0, 1<<11|1<<10|1<<9|1<<8|1<<5|1<<4|1<<3|1<<2|1<<1|1<<0 },
-       { 8,     2048,  1, 1<<11|1<<10|1<<9|1<<8|1<<5|1<<4|1<<3|1<<2|1<<1},
-       { 16,    4096,  2, 1<<11|1<<10|1<<9|1<<8|1<<5|1<<4|1<<3|1<<2},
-       { 32,    8192,  3, 1<<11|1<<10|1<<9|1<<8|1<<5|1<<4|1<<3},
-       { 64,   16384,  4, 1<<11|1<<10|1<<9|1<<8|1<<5|1<<4},
-       { 128,  32768,  5, 1<<11|1<<10|1<<9|1<<8|1<<5},
-       { 256,  65536,  6, 1<<11|1<<10|1<<9|1<<8},
-       { 512,  131072, 7, 1<<11|1<<10|1<<9},
-       { 1024, 262144, 8, 1<<11|1<<10},
-       { 2048, 524288, 9, 1<<11}       /* 2GB <- Max supported */
-};
-
-static struct gatt_mask via_generic_masks[] =
-{
-       {.mask = 0x00000000, .type = 0}
-};
-
-
-static void via_kt400_enable(u32 mode)
-{
-       if ((agp_generic_agp_3_0_enable(mode))==FALSE)
-               printk (KERN_INFO PFX "agp_generic_agp_3_0_enable() failed\n");
-}
-
-static struct agp_driver via_kt400_agp_driver = {
-       .owner = THIS_MODULE,
-};
-
-static int __init agp_via_probe (struct pci_dev *dev, const struct pci_device_id *ent)
-{
-       u8 reg;
-       u8 cap_ptr = 0;
-
-       cap_ptr = pci_find_capability(dev, PCI_CAP_ID_AGP);
-       if (cap_ptr == 0)
-               return -ENODEV;
-
-       pci_read_config_byte(dev, VIA_AGPSEL, &reg);
-       /* Check if we are in AGP 2.0 compatability mode, if so it
-        * will be picked up by via-agp.o */
-       if ((reg & (1<<1))!=0)
-               return -ENODEV;
-
-       printk (KERN_INFO PFX "Detected VIA KT400 AGP3 chipset\n");
-
-       agp_bridge->dev = dev;
-       agp_bridge->type = VIA_APOLLO_KT400_3;
-       agp_bridge->capndx = cap_ptr;
-       agp_bridge->masks = via_generic_masks;
-       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->agp_enable = via_kt400_enable;
-       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;
-
-       /* Fill in the mode register */
-       pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx+PCI_AGP_STATUS, &agp_bridge->mode);
-
-       via_kt400_agp_driver.dev = dev;
-       agp_register_driver(&via_kt400_agp_driver);
-       return 0;
-}
-
-static struct pci_device_id agp_via_pci_table[] __initdata = {
-       {
-       .class          = (PCI_CLASS_BRIDGE_HOST << 8),
-       .class_mask     = ~0,
-       .vendor         = PCI_VENDOR_ID_VIA,
-       .device         = PCI_DEVICE_ID_VIA_8377_0,
-       .subvendor      = PCI_ANY_ID,
-       .subdevice      = PCI_ANY_ID,
-       },
-       {
-       .class          = (PCI_CLASS_BRIDGE_HOST << 8),
-       .class_mask     = ~0,
-       .vendor         = PCI_VENDOR_ID_VIA,
-       .device         = PCI_DEVICE_ID_VIA_8367_0,
-       .subvendor      = PCI_VENDOR_ID_VIA,
-       .subdevice      = PCI_DEVICE_ID_VIA_8377_0,
-       },
-       { }
-};
-
-MODULE_DEVICE_TABLE(pci, agp_via_pci_table);
-
-static struct __initdata pci_driver agp_via_pci_driver = {
-       .name           = "agpgart-via",
-       .id_table       = agp_via_pci_table,
-       .probe          = agp_via_probe,
-};
-
-static int __init agp_via_init(void)
-{
-       int ret_val;
-
-       ret_val = pci_module_init(&agp_via_pci_driver);
-       if (ret_val)
-               agp_bridge->type = NOT_SUPPORTED;
-
-       return ret_val;
-}
-
-static void __exit agp_via_cleanup(void)
-{
-       agp_unregister_driver(&via_kt400_agp_driver);
-       pci_unregister_driver(&agp_via_pci_driver);
-}
-
-module_init(agp_via_init);
-module_exit(agp_via_cleanup);
-
-MODULE_AUTHOR("Dave Jones <davej@codemonkey.org.uk>");
-MODULE_LICENSE("GPL and additional rights");
-