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
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
/* 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);
* (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;
/*
* 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);
static int agp_try_unsupported __initdata = 0;
+
static int via_fetch_size(void)
{
int i;
return values[i].size;
}
}
-
return 0;
}
+
static int via_configure(void)
{
u32 temp;
return 0;
}
+
static void via_cleanup(void)
{
struct aper_size_info_8 *previous_size;
*/
}
+
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 */
return addr | agp_bridge->masks[0].mask;
}
+
static struct aper_size_info_8 via_generic_sizes[7] =
{
{256, 65536, 6, 0},
{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;
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 =
{
{
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;
return -ENODEV;
}
+
static struct pci_device_id agp_via_pci_table[] __initdata = {
{
.class = (PCI_CLASS_BRIDGE_HOST << 8),
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;
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>");
+++ /dev/null
-/*
- * 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");
-