Commit bce0670d authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://linux-dj.bkbits.net/agpgart

into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents 6079e248 67221af3
...@@ -165,7 +165,7 @@ config AGP_EFFICEON ...@@ -165,7 +165,7 @@ config AGP_EFFICEON
tristate "Transmeta Efficeon support" tristate "Transmeta Efficeon support"
depends on AGP && X86 && !X86_64 depends on AGP && X86 && !X86_64
help help
This option fives you AGP support for the Transmeta Efficeon This option gives you AGP support for the Transmeta Efficeon
series processors with integrated northbridges. series processors with integrated northbridges.
You should say Y here if you use XFree86 3.3.6 or 4.x and want to You should say Y here if you use XFree86 3.3.6 or 4.x and want to
......
...@@ -536,6 +536,15 @@ static struct pci_device_id agp_amd64_pci_table[] = { ...@@ -536,6 +536,15 @@ static struct pci_device_id agp_amd64_pci_table[] = {
.subvendor = PCI_ANY_ID, .subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID, .subdevice = PCI_ANY_ID,
}, },
/* VIA K8T800Pro */
{
.class = (PCI_CLASS_BRIDGE_HOST << 8),
.class_mask = ~0,
.vendor = PCI_VENDOR_ID_VIA,
.device = PCI_DEVICE_ID_VIA_K8T800PRO_0,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
},
/* VIA K8T800 */ /* VIA K8T800 */
{ {
.class = (PCI_CLASS_BRIDGE_HOST << 8), .class = (PCI_CLASS_BRIDGE_HOST << 8),
......
/* /*
* AGPGART driver. * AGPGART driver.
* Copyright (C) 2002-2003 Dave Jones. * Copyright (C) 2002-2004 Dave Jones.
* Copyright (C) 1999 Jeff Hartmann. * Copyright (C) 1999 Jeff Hartmann.
* Copyright (C) 1999 Precision Insight, Inc. * Copyright (C) 1999 Precision Insight, Inc.
* Copyright (C) 1999 Xi Graphics, Inc. * Copyright (C) 1999 Xi Graphics, Inc.
...@@ -18,12 +18,12 @@ ...@@ -18,12 +18,12 @@
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* JEFF HARTMANN, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, * JEFF HARTMANN, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* *
* TODO: * TODO:
* - Allocate more than order 0 pages to avoid too much linear map splitting. * - Allocate more than order 0 pages to avoid too much linear map splitting.
*/ */
#include <linux/config.h> #include <linux/config.h>
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
#include "agp.h" #include "agp.h"
__u32 *agp_gatt_table; __u32 *agp_gatt_table;
int agp_memory_reserved; int agp_memory_reserved;
/* /*
...@@ -46,7 +46,7 @@ int agp_memory_reserved; ...@@ -46,7 +46,7 @@ int agp_memory_reserved;
*/ */
EXPORT_SYMBOL_GPL(agp_memory_reserved); EXPORT_SYMBOL_GPL(agp_memory_reserved);
/* /*
* Generic routines for handling agp_memory structures - * Generic routines for handling agp_memory structures -
* They use the basic page allocation routines to do the brunt of the work. * They use the basic page allocation routines to do the brunt of the work.
*/ */
...@@ -142,12 +142,12 @@ EXPORT_SYMBOL(agp_free_memory); ...@@ -142,12 +142,12 @@ EXPORT_SYMBOL(agp_free_memory);
* agp_allocate_memory - allocate a group of pages of a certain type. * agp_allocate_memory - allocate a group of pages of a certain type.
* *
* @page_count: size_t argument of the number of pages * @page_count: size_t argument of the number of pages
* @type: u32 argument of the type of memory to be allocated. * @type: u32 argument of the type of memory to be allocated.
* *
* Every agp bridge device will allow you to allocate AGP_NORMAL_MEMORY which * Every agp bridge device will allow you to allocate AGP_NORMAL_MEMORY which
* maps to physical ram. Any other type is device dependent. * maps to physical ram. Any other type is device dependent.
* *
* It returns NULL whenever memory is unavailable. * It returns NULL whenever memory is unavailable.
*/ */
struct agp_memory *agp_allocate_memory(size_t page_count, u32 type) struct agp_memory *agp_allocate_memory(size_t page_count, u32 type)
{ {
...@@ -311,7 +311,7 @@ EXPORT_SYMBOL(agp_copy_info); ...@@ -311,7 +311,7 @@ EXPORT_SYMBOL(agp_copy_info);
/** /**
* agp_bind_memory - Bind an agp_memory structure into the GATT. * agp_bind_memory - Bind an agp_memory structure into the GATT.
* *
* @curr: agp_memory pointer * @curr: agp_memory pointer
* @pg_start: an offset into the graphics aperture translation table * @pg_start: an offset into the graphics aperture translation table
* *
...@@ -347,9 +347,9 @@ EXPORT_SYMBOL(agp_bind_memory); ...@@ -347,9 +347,9 @@ EXPORT_SYMBOL(agp_bind_memory);
/** /**
* agp_unbind_memory - Removes an agp_memory structure from the GATT * agp_unbind_memory - Removes an agp_memory structure from the GATT
* *
* @curr: agp_memory pointer to be removed from the GATT. * @curr: agp_memory pointer to be removed from the GATT.
* *
* It returns -EINVAL if this piece of agp_memory is not currently bound to * It returns -EINVAL if this piece of agp_memory is not currently bound to
* the graphics aperture translation table or if the agp_memory pointer == NULL * the graphics aperture translation table or if the agp_memory pointer == NULL
*/ */
...@@ -404,12 +404,18 @@ static void agp_v2_parse_one(u32 *mode, u32 *cmd, u32 *tmp) ...@@ -404,12 +404,18 @@ static void agp_v2_parse_one(u32 *mode, u32 *cmd, u32 *tmp)
*cmd &= ~(AGPSTAT2_1X | AGPSTAT2_4X); /* 2X */ *cmd &= ~(AGPSTAT2_1X | AGPSTAT2_4X); /* 2X */
if (*cmd & AGPSTAT2_1X) if (*cmd & AGPSTAT2_1X)
*cmd &= ~(AGPSTAT2_2X | AGPSTAT2_4X); /* 1Xf */ *cmd &= ~(AGPSTAT2_2X | AGPSTAT2_4X); /* 1X */
} }
/*
* mode = requested mode.
* cmd = PCI_AGP_STATUS from agp bridge.
* tmp = PCI_AGP_STATUS from graphic card.
*/
static void agp_v3_parse_one(u32 *mode, u32 *cmd, u32 *tmp) static void agp_v3_parse_one(u32 *mode, u32 *cmd, u32 *tmp)
{ {
u32 origcmd=*cmd, origtmp=*tmp;
/* ARQSZ - Set the value to the maximum one. /* ARQSZ - Set the value to the maximum one.
* Don't allow the mode register to override values. */ * Don't allow the mode register to override values. */
*cmd = ((*cmd & ~AGPSTAT_ARQSZ) | *cmd = ((*cmd & ~AGPSTAT_ARQSZ) |
...@@ -452,17 +458,43 @@ static void agp_v3_parse_one(u32 *mode, u32 *cmd, u32 *tmp) ...@@ -452,17 +458,43 @@ static void agp_v3_parse_one(u32 *mode, u32 *cmd, u32 *tmp)
*mode |= AGPSTAT3_4X; *mode |= AGPSTAT3_4X;
} }
if (!((*cmd & AGPSTAT3_8X) && (*tmp & AGPSTAT3_8X) && (*mode & AGPSTAT3_8X))) if (*mode & AGPSTAT3_8X) {
*cmd &= ~AGPSTAT3_8X; if (!(*cmd & AGPSTAT3_8X)) {
*cmd &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
*cmd |= AGPSTAT3_4X;
printk ("%s requested AGPx8 but bridge not capable.\n", current->comm);
return;
}
if (!(*tmp & AGPSTAT3_8X)) {
*cmd &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
*cmd |= AGPSTAT3_4X;
printk ("%s requested AGPx8 but graphic card not capable.\n", current->comm);
return;
}
/* All set, bridge & device can do AGP x8*/
*cmd &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD);
return;
if (!((*cmd & AGPSTAT3_4X) && (*tmp & AGPSTAT3_4X) && (*mode & AGPSTAT3_4X))) } else {
*cmd &= ~AGPSTAT3_4X;
/* Clear out unwanted bits. */ /*
if (*cmd & AGPSTAT3_8X) * If we didn't specify AGPx8, we can only do x4.
*cmd &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD); * If the hardware can't do x4, we're up shit creek, and never
if (*cmd & AGPSTAT3_4X) * should have got this far.
*/
*cmd &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD); *cmd &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
if ((*cmd & AGPSTAT3_4X) && (*tmp & AGPSTAT3_4X))
*cmd |= AGPSTAT3_4X;
else {
printk (KERN_INFO PFX "Badness. Don't know which AGP mode to set. "
"[cmd:%x tmp:%x fell back to:- cmd:%x tmp:%x]\n",
origcmd, origtmp, *cmd, *tmp);
if (!(*cmd & AGPSTAT3_4X))
printk (KERN_INFO PFX "Bridge couldn't do AGP x4.\n");
if (!(*tmp & AGPSTAT3_4X))
printk (KERN_INFO PFX "Graphic card couldn't do AGP x4.\n");
}
}
} }
//FIXME: This doesn't smell right. //FIXME: This doesn't smell right.
...@@ -479,8 +511,10 @@ u32 agp_collect_device_status(u32 mode, u32 cmd) ...@@ -479,8 +511,10 @@ u32 agp_collect_device_status(u32 mode, u32 cmd)
if (!cap_ptr) if (!cap_ptr)
continue; continue;
//FIXME: We should probably skip anything here that
// isn't an AGP graphic card.
/* /*
* Ok, here we have a AGP device. Disable impossible * Ok, here we have a AGP device. Disable impossible
* settings, and adjust the readqueue to the minimum. * settings, and adjust the readqueue to the minimum.
*/ */
pci_read_config_dword(device, cap_ptr+PCI_AGP_STATUS, &tmp); pci_read_config_dword(device, cap_ptr+PCI_AGP_STATUS, &tmp);
...@@ -489,7 +523,7 @@ u32 agp_collect_device_status(u32 mode, u32 cmd) ...@@ -489,7 +523,7 @@ u32 agp_collect_device_status(u32 mode, u32 cmd)
cmd = ((cmd & ~AGPSTAT_RQ_DEPTH) | cmd = ((cmd & ~AGPSTAT_RQ_DEPTH) |
min_t(u32, (mode & AGPSTAT_RQ_DEPTH), min_t(u32, (mode & AGPSTAT_RQ_DEPTH),
min_t(u32, (cmd & AGPSTAT_RQ_DEPTH), (tmp & AGPSTAT_RQ_DEPTH)))); min_t(u32, (cmd & AGPSTAT_RQ_DEPTH), (tmp & AGPSTAT_RQ_DEPTH))));
/* disable FW if it's not supported */ /* disable FW if it's not supported */
if (!((cmd & AGPSTAT_FW) && (tmp & AGPSTAT_FW) && (mode & AGPSTAT_FW))) if (!((cmd & AGPSTAT_FW) && (tmp & AGPSTAT_FW) && (mode & AGPSTAT_FW)))
cmd &= ~AGPSTAT_FW; cmd &= ~AGPSTAT_FW;
...@@ -663,7 +697,7 @@ int agp_generic_create_gatt_table(void) ...@@ -663,7 +697,7 @@ int agp_generic_create_gatt_table(void)
agp_bridge->current_size; agp_bridge->current_size;
break; break;
} }
temp = agp_bridge->current_size; temp = agp_bridge->current_size;
} else { } else {
agp_bridge->aperture_size_idx = i; agp_bridge->aperture_size_idx = i;
} }
...@@ -684,7 +718,7 @@ int agp_generic_create_gatt_table(void) ...@@ -684,7 +718,7 @@ int agp_generic_create_gatt_table(void)
SetPageReserved(page); SetPageReserved(page);
agp_bridge->gatt_table_real = (u32 *) table; agp_bridge->gatt_table_real = (u32 *) table;
agp_gatt_table = (void *)table; agp_gatt_table = (void *)table;
agp_bridge->driver->cache_flush(); agp_bridge->driver->cache_flush();
agp_bridge->gatt_table = ioremap_nocache(virt_to_phys(table), agp_bridge->gatt_table = ioremap_nocache(virt_to_phys(table),
...@@ -870,9 +904,9 @@ void agp_generic_free_by_type(struct agp_memory *curr) ...@@ -870,9 +904,9 @@ void agp_generic_free_by_type(struct agp_memory *curr)
EXPORT_SYMBOL(agp_generic_free_by_type); EXPORT_SYMBOL(agp_generic_free_by_type);
/* /*
* Basic Page Allocation Routines - * Basic Page Allocation Routines -
* These routines handle page allocation and by default they reserve the allocated * These routines handle page allocation and by default they reserve the allocated
* memory. They also handle incrementing the current_memory_agp value, Which is checked * memory. They also handle incrementing the current_memory_agp value, Which is checked
* against a maximum value. * against a maximum value.
*/ */
...@@ -914,9 +948,9 @@ EXPORT_SYMBOL(agp_generic_destroy_page); ...@@ -914,9 +948,9 @@ EXPORT_SYMBOL(agp_generic_destroy_page);
/* End Basic Page Allocation Routines */ /* End Basic Page Allocation Routines */
/** /**
* agp_enable - initialise the agp point-to-point connection. * agp_enable - initialise the agp point-to-point connection.
* *
* @mode: agp mode register value to configure with. * @mode: agp mode register value to configure with.
*/ */
void agp_enable(u32 mode) void agp_enable(u32 mode)
......
...@@ -447,6 +447,7 @@ static int __devinit agp_serverworks_probe(struct pci_dev *pdev, ...@@ -447,6 +447,7 @@ static int __devinit agp_serverworks_probe(struct pci_dev *pdev,
struct agp_bridge_data *bridge; struct agp_bridge_data *bridge;
struct pci_dev *bridge_dev; struct pci_dev *bridge_dev;
u32 temp, temp2; u32 temp, temp2;
u8 cap_ptr = 0;
/* Everything is on func 1 here so we are hardcoding function one */ /* Everything is on func 1 here so we are hardcoding function one */
bridge_dev = pci_find_slot((unsigned int)pdev->bus->number, bridge_dev = pci_find_slot((unsigned int)pdev->bus->number,
...@@ -457,6 +458,8 @@ static int __devinit agp_serverworks_probe(struct pci_dev *pdev, ...@@ -457,6 +458,8 @@ static int __devinit agp_serverworks_probe(struct pci_dev *pdev,
return -ENODEV; return -ENODEV;
} }
cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP);
switch (pdev->device) { switch (pdev->device) {
case 0x0006: case 0x0006:
/* ServerWorks CNB20HE /* ServerWorks CNB20HE
...@@ -470,14 +473,15 @@ static int __devinit agp_serverworks_probe(struct pci_dev *pdev, ...@@ -470,14 +473,15 @@ static int __devinit agp_serverworks_probe(struct pci_dev *pdev,
break; break;
default: default:
printk(KERN_ERR PFX "Unsupported Serverworks chipset " if (cap_ptr)
"(device id: %04x)\n", pdev->device); printk(KERN_ERR PFX "Unsupported Serverworks chipset "
"(device id: %04x)\n", pdev->device);
return -ENODEV; return -ENODEV;
} }
serverworks_private.svrwrks_dev = bridge_dev; serverworks_private.svrwrks_dev = bridge_dev;
serverworks_private.gart_addr_ofs = 0x10; serverworks_private.gart_addr_ofs = 0x10;
pci_read_config_dword(pdev, SVWRKS_APSIZE, &temp); pci_read_config_dword(pdev, SVWRKS_APSIZE, &temp);
if (temp & PCI_BASE_ADDRESS_MEM_TYPE_64) { if (temp & PCI_BASE_ADDRESS_MEM_TYPE_64) {
pci_read_config_dword(pdev, SVWRKS_APSIZE + 4, &temp2); pci_read_config_dword(pdev, SVWRKS_APSIZE + 4, &temp2);
......
...@@ -434,6 +434,7 @@ static struct pci_device_id agp_via_pci_table[] = { ...@@ -434,6 +434,7 @@ static struct pci_device_id agp_via_pci_table[] = {
.subvendor = PCI_ANY_ID, \ .subvendor = PCI_ANY_ID, \
.subdevice = PCI_ANY_ID, \ .subdevice = PCI_ANY_ID, \
} }
ID(PCI_DEVICE_ID_VIA_82C597_0),
ID(PCI_DEVICE_ID_VIA_82C598_0), ID(PCI_DEVICE_ID_VIA_82C598_0),
ID(PCI_DEVICE_ID_VIA_8501_0), ID(PCI_DEVICE_ID_VIA_8501_0),
ID(PCI_DEVICE_ID_VIA_8601_0), ID(PCI_DEVICE_ID_VIA_8601_0),
......
...@@ -1176,7 +1176,8 @@ ...@@ -1176,7 +1176,8 @@
#define PCI_DEVICE_ID_VIA_8763_0 0x0198 #define PCI_DEVICE_ID_VIA_8763_0 0x0198
#define PCI_DEVICE_ID_VIA_8380_0 0x0204 #define PCI_DEVICE_ID_VIA_8380_0 0x0204
#define PCI_DEVICE_ID_VIA_PX8X0_0 0x0259 #define PCI_DEVICE_ID_VIA_PX8X0_0 0x0259
#define PCI_DEVICE_ID_VIA_8363_0 0x0305 #define PCI_DEVICE_ID_VIA_K8T800PRO_0 0x0282
#define PCI_DEVICE_ID_VIA_8363_0 0x0305
#define PCI_DEVICE_ID_VIA_8371_0 0x0391 #define PCI_DEVICE_ID_VIA_8371_0 0x0391
#define PCI_DEVICE_ID_VIA_8501_0 0x0501 #define PCI_DEVICE_ID_VIA_8501_0 0x0501
#define PCI_DEVICE_ID_VIA_82C505 0x0505 #define PCI_DEVICE_ID_VIA_82C505 0x0505
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment