diff options
| author | Dave Jones <davej@tetrachloride.(none)> | 2003-01-02 22:01:15 -0100 |
|---|---|---|
| committer | Dave Jones <davej@tetrachloride.(none)> | 2003-01-02 22:01:15 -0100 |
| commit | c1482c167b2f894d5eb67f2a9ae45954a9bbb808 (patch) | |
| tree | 19ee718b66ee748782f777dd7bd347a20a5d3054 | |
| parent | d127326dbb20263629dd70d85f4a329bb35fbf6b (diff) | |
| parent | f0a6ec87a20db2e93065cb9bd6555e96503655ec (diff) | |
Merge tetrachloride.(none):/mnt/stuff/kernel/2.5/bk-linus
into tetrachloride.(none):/mnt/stuff/kernel/2.5/agpgart
| -rw-r--r-- | drivers/char/agp/Kconfig | 10 | ||||
| -rw-r--r-- | drivers/char/agp/Makefile | 1 | ||||
| -rw-r--r-- | drivers/char/agp/agp.h | 7 | ||||
| -rw-r--r-- | drivers/char/agp/amd-k8-agp.c | 9 | ||||
| -rw-r--r-- | drivers/char/agp/backend.c | 2 | ||||
| -rw-r--r-- | drivers/char/agp/frontend.c | 3 | ||||
| -rw-r--r-- | drivers/char/agp/generic-3.0.c | 21 | ||||
| -rw-r--r-- | drivers/char/agp/generic.c | 38 | ||||
| -rw-r--r-- | drivers/char/agp/intel-agp.c | 4 | ||||
| -rw-r--r-- | drivers/char/agp/via-agp.c | 59 | ||||
| -rw-r--r-- | drivers/char/agp/via-kt400.c | 199 | ||||
| -rw-r--r-- | include/linux/agp_backend.h | 2 | ||||
| -rw-r--r-- | include/linux/pci_ids.h | 1 |
13 files changed, 284 insertions, 72 deletions
diff --git a/drivers/char/agp/Kconfig b/drivers/char/agp/Kconfig index b27355fe0135..b68000d5da44 100644 --- a/drivers/char/agp/Kconfig +++ b/drivers/char/agp/Kconfig @@ -61,6 +61,16 @@ 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 88f62c3284fc..2ff6e33ffb4e 100644 --- a/drivers/char/agp/Makefile +++ b/drivers/char/agp/Makefile @@ -12,6 +12,7 @@ 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 e001b44a5b39..d0fc9f658abf 100644 --- a/drivers/char/agp/agp.h +++ b/drivers/char/agp/agp.h @@ -1,5 +1,6 @@ /* - * AGPGART module version 0.99 + * AGPGART module + * Copyright (C) 2002 Dave Jones * Copyright (C) 1999 Jeff Hartmann * Copyright (C) 1999 Precision Insight, Inc. * Copyright (C) 1999 Xi Graphics, Inc. @@ -46,6 +47,7 @@ void agp_generic_destroy_page(void *addr); int agp_generic_suspend(void); void agp_generic_resume(void); void agp_free_key(int key); +int agp_num_entries(void); #define PFX "agpgart: " @@ -292,6 +294,9 @@ struct agp_bridge_data { #define VIA_ATTBASE 0x88 /* VIA KT400 */ +#define VIA_AGP3_GARTCTRL 0x90 +#define VIA_AGP3_APSIZE 0x94 +#define VIA_AGP3_ATTBASE 0x98 #define VIA_AGPSEL 0xfd /* SiS registers */ diff --git a/drivers/char/agp/amd-k8-agp.c b/drivers/char/agp/amd-k8-agp.c index f7a2a3f81d0b..4b9e5994f6b4 100644 --- a/drivers/char/agp/amd-k8-agp.c +++ b/drivers/char/agp/amd-k8-agp.c @@ -14,8 +14,6 @@ #include <linux/agp_backend.h> #include "agp.h" -extern int agp_memory_reserved; - static u_int64_t pci_read64 (struct pci_dev *dev, int reg) { union { @@ -48,16 +46,11 @@ static void pci_write64 (struct pci_dev *dev, int reg, u64 value) static int x86_64_insert_memory(agp_memory * mem, off_t pg_start, int type) { int i, j, num_entries; - void *temp; long tmp; u32 pte; u64 addr; - temp = agp_bridge.current_size; - - num_entries = A_SIZE_32(temp)->num_entries; - - num_entries -= agp_memory_reserved>>PAGE_SHIFT; + num_entries = agp_num_entries(); if (type != 0 || mem->type != 0) return -EINVAL; diff --git a/drivers/char/agp/backend.c b/drivers/char/agp/backend.c index a901a2af7cdb..65cf115d48ce 100644 --- a/drivers/char/agp/backend.c +++ b/drivers/char/agp/backend.c @@ -1,5 +1,5 @@ /* - * AGPGART module version 1.0 + * AGPGART driver backend routines. * Copyright (C) 2002 Dave Jones. * Copyright (C) 1999 Jeff Hartmann. * Copyright (C) 1999 Precision Insight, Inc. diff --git a/drivers/char/agp/frontend.c b/drivers/char/agp/frontend.c index 46f7d16c9f65..2fb607ad1b4c 100644 --- a/drivers/char/agp/frontend.c +++ b/drivers/char/agp/frontend.c @@ -1,5 +1,6 @@ /* - * AGPGART module frontend version 0.99 + * AGPGART driver frontend + * Copyright (C) 2002 Dave Jones * Copyright (C) 1999 Jeff Hartmann * Copyright (C) 1999 Precision Insight, Inc. * Copyright (C) 1999 Xi Graphics, Inc. diff --git a/drivers/char/agp/generic-3.0.c b/drivers/char/agp/generic-3.0.c index 11a7a4df100f..5319451fa81d 100644 --- a/drivers/char/agp/generic-3.0.c +++ b/drivers/char/agp/generic-3.0.c @@ -1,3 +1,7 @@ +/* + * Generic routines for AGP 3.0 compliant bridges. + */ + #include <linux/list.h> #include <linux/pci.h> #include <linux/agp_backend.h> @@ -393,8 +397,7 @@ static int agp_3_0_node_enable(u32 mode, u32 minor) if(mcapndx == 0) { printk(KERN_ERR PFX "woah! Non-AGP device " - "found on the secondary bus of an AGP 3.0 " - "bridge!\n"); + "found on the secondary bus of an AGP 3.0 bridge!\n"); ret = -ENODEV; goto free_and_exit; } @@ -442,9 +445,8 @@ static int agp_3_0_node_enable(u32 mode, u32 minor) rate = 0x2; break; default: - printk(KERN_ERR PFX "woah! Bogus AGP rate " - "value found advertised behind an AGP 3.0 " - "bridge!\n"); + printk(KERN_ERR PFX "woah! Bogus AGP rate (%d) " + "value found advertised behind an AGP 3.0 bridge!\n", rate); ret = -ENODEV; goto free_and_exit; } @@ -455,12 +457,10 @@ static int agp_3_0_node_enable(u32 mode, u32 minor) * whether isochronous transfers are supported. */ if(isoch != 0) { - if((ret = agp_3_0_isochronous_node_enable(dev_list, - ndevs)) != 0) + if((ret = agp_3_0_isochronous_node_enable(dev_list, ndevs)) != 0) goto free_and_exit; } else { - if((ret = agp_3_0_nonisochronous_node_enable(dev_list, - ndevs)) != 0) + if((ret = agp_3_0_nonisochronous_node_enable(dev_list,ndevs)) != 0) goto free_and_exit; } @@ -534,8 +534,7 @@ int agp_generic_agp_3_0_enable(u32 mode) major = (ncapid >> 20) & 0xf; minor = (ncapid >> 16) & 0xf; - printk(KERN_INFO PFX "Found an AGP %d.%d compliant device.\n", - major, minor); + printk(KERN_INFO PFX "Found an AGP %d.%d compliant device.\n",major, minor); if(major >= 3) { pci_read_config_dword(agp_bridge.dev, agp_bridge.capndx + 0x4, &agp_3_0); diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c index cc5ab2feb26e..6a55778defc9 100644 --- a/drivers/char/agp/generic.c +++ b/drivers/char/agp/generic.c @@ -1,5 +1,5 @@ /* - * AGPGART module version 1.0 + * AGPGART driver. * Copyright (C) 2002 Dave Jones. * Copyright (C) 1999 Jeff Hartmann. * Copyright (C) 1999 Precision Insight, Inc. @@ -203,6 +203,40 @@ static int agp_return_size(void) return current_size; } +int agp_num_entries(void) +{ + int num_entries; + void *temp; + + temp = agp_bridge.current_size; + + switch (agp_bridge.size_type) { + case U8_APER_SIZE: + num_entries = A_SIZE_8(temp)->num_entries; + break; + case U16_APER_SIZE: + num_entries = A_SIZE_16(temp)->num_entries; + break; + case U32_APER_SIZE: + num_entries = A_SIZE_32(temp)->num_entries; + break; + case LVL2_APER_SIZE: + num_entries = A_SIZE_LVL2(temp)->num_entries; + break; + case FIXED_APER_SIZE: + num_entries = A_SIZE_FIX(temp)->num_entries; + break; + default: + num_entries = 0; + break; + } + + num_entries -= agp_memory_reserved>>PAGE_SHIFT; + if (num_entries<0) + num_entries = 0; + return num_entries; +} + /* Routine to copy over information structure */ int agp_copy_info(agp_kern_info * info) @@ -713,3 +747,5 @@ EXPORT_SYMBOL(agp_generic_alloc_by_type); EXPORT_SYMBOL(agp_generic_free_by_type); EXPORT_SYMBOL(global_cache_flush); +EXPORT_SYMBOL_GPL(agp_num_entries); + diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c index ee2961fc4834..c9457777eb64 100644 --- a/drivers/char/agp/intel-agp.c +++ b/drivers/char/agp/intel-agp.c @@ -1467,7 +1467,9 @@ static struct __initdata pci_driver agp_intel_pci_driver = { .probe = agp_intel_probe, }; -static int __init agp_intel_init(void) +/* intel_agp_init() must not be declared static for explicit + early initialization to work (ie i810fb) */ +int __init agp_intel_init(void) { int ret_val; static int agp_initialised=0; diff --git a/drivers/char/agp/via-agp.c b/drivers/char/agp/via-agp.c index a6b774459075..b9ec5981f6ce 100644 --- a/drivers/char/agp/via-agp.c +++ b/drivers/char/agp/via-agp.c @@ -124,65 +124,23 @@ static int __init via_generic_setup (struct pci_dev *pdev) return 0; } -#ifdef CONFIG_AGP3 /* * 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. + * 2.0 compatability mode, we abort, as this gets picked up by + * via-agp3.o */ -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); -} -#endif 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(pdev, VIA_AGPSEL, ®); + /* Check AGP 2.0 compatability mode. */ if ((reg & (1<<1))==1) { - /* AGP 2.0 compatability mode. */ - agp_bridge.agp_enable = agp_generic_agp_enable; - - } else { -#ifdef CONFIG_AGP3 - /* AGP 3.0 mode */ - agp_bridge.agp_enable = via_kt400_enable; -#else - printk ("AGP: VIA KT400 in AGP3.0 mode support not compiled in.\n"); - return -ENODEV; -#endif + via_generic_setup(pdev); + return 0; } - return 0; + return -ENODEV; } static struct agp_device_ids via_agp_device_ids[] __initdata = @@ -244,6 +202,11 @@ static struct agp_device_ids via_agp_device_ids[] __initdata = .chipset = VIA_VT8605, .chipset_name = "Apollo ProSavage PM133" }, + { + .device_id = PCI_DEVICE_ID_VIA_8235_0, + .chipset = VIA_P4X400, + .chipset_name = "P4X400" + }, { }, /* dummy final entry, always present */ }; diff --git a/drivers/char/agp/via-kt400.c b/drivers/char/agp/via-kt400.c new file mode 100644 index 000000000000..b23b19ab90c9 --- /dev/null +++ b/drivers/char/agp/via-kt400.c @@ -0,0 +1,199 @@ +/* + * 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; + u8 temp; + struct aper_size_info_16 *values; + + values = A_SIZE_16(agp_bridge.aperture_sizes); + pci_read_config_byte(agp_bridge.dev, VIA_AGP3_APSIZE, &temp); + 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 __init 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 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))==1) + 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.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.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+4, &agp_bridge.mode); + + agp_register_driver(dev); + 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, + }, + { } +}; + +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(); + 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"); + diff --git a/include/linux/agp_backend.h b/include/linux/agp_backend.h index e6fa886e8d82..90890f4e9e6d 100644 --- a/include/linux/agp_backend.h +++ b/include/linux/agp_backend.h @@ -60,8 +60,10 @@ enum chipset_type { VIA_APOLLO_KX133, VIA_APOLLO_KT133, VIA_APOLLO_KT400, + VIA_APOLLO_KT400_3, VIA_APOLLO_PRO_266, VIA_VT8605, + VIA_P4X400, SIS_GENERIC, AMD_GENERIC, AMD_IRONGATE, diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index f9945ae00d7a..89874d8eeee7 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h @@ -1092,6 +1092,7 @@ #define PCI_DEVICE_ID_VIA_8233C_0 0x3109 #define PCI_DEVICE_ID_VIA_8361 0x3112 #define PCI_DEVICE_ID_VIA_8233A 0x3147 +#define PCI_DEVICE_ID_VIA_8235_0 0x3168 #define PCI_DEVICE_ID_VIA_8235 0x3177 #define PCI_DEVICE_ID_VIA_8377_0 0x3189 #define PCI_DEVICE_ID_VIA_86C100A 0x6100 |
