diff options
| author | Dave Jones <davej@codemonkey.org.uk> | 2003-02-10 16:45:11 -0100 |
|---|---|---|
| committer | Dave Jones <davej@tetrachloride.(none)> | 2003-02-10 16:45:11 -0100 |
| commit | 102257ca1b5eff1bddff42d24800d79a1be72e24 (patch) | |
| tree | a64668d89947c6c87fcdcb87ee587f99cbee8586 | |
| parent | 8fc7eea6f89ec02feb59ab228c8d700c3c282844 (diff) | |
[AGPGART] Merge VIA KT400 AGP3 support into main via-agp module.
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.
| -rw-r--r-- | drivers/char/agp/Kconfig | 10 | ||||
| -rw-r--r-- | drivers/char/agp/Makefile | 1 | ||||
| -rw-r--r-- | drivers/char/agp/agp.h | 2 | ||||
| -rw-r--r-- | drivers/char/agp/generic-3.0.c | 7 | ||||
| -rw-r--r-- | drivers/char/agp/via-agp.c | 166 | ||||
| -rw-r--r-- | drivers/char/agp/via-kt400.c | 212 |
6 files changed, 149 insertions, 249 deletions
diff --git a/drivers/char/agp/Kconfig b/drivers/char/agp/Kconfig index 97d74327e07e..907d9fa66db8 100644 --- a/drivers/char/agp/Kconfig +++ b/drivers/char/agp/Kconfig @@ -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 diff --git a/drivers/char/agp/Makefile b/drivers/char/agp/Makefile index 9531c6bc8ef5..6ad2d3d4a911 100644 --- a/drivers/char/agp/Makefile +++ b/drivers/char/agp/Makefile @@ -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 diff --git a/drivers/char/agp/agp.h b/drivers/char/agp/agp.h index 25e4c024432e..f228b43d1cca 100644 --- a/drivers/char/agp/agp.h +++ b/drivers/char/agp/agp.h @@ -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); diff --git a/drivers/char/agp/generic-3.0.c b/drivers/char/agp/generic-3.0.c index 40c20bad5f2f..14aa760ee717 100644 --- a/drivers/char/agp/generic-3.0.c +++ b/drivers/char/agp/generic-3.0.c @@ -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); diff --git a/drivers/char/agp/via-agp.c b/drivers/char/agp/via-agp.c index ec3c62cfeb8b..1d0c22b170b2 100644 --- a/drivers/char/agp/via-agp.c +++ b/drivers/char/agp/via-agp.c @@ -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, ®); + 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, ®); + 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, ®); /* 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 index 34ee9df6d4dc..000000000000 --- a/drivers/char/agp/via-kt400.c +++ /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, ®); - /* 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"); - |
