Commit 59470101 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 a7cf3f04 6cf5f82c
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
#define AMD_TLBFLUSH 0x0c /* In mmio region (32-bit register) */ #define AMD_TLBFLUSH 0x0c /* In mmio region (32-bit register) */
#define AMD_CACHEENTRY 0x10 /* In mmio region (32-bit register) */ #define AMD_CACHEENTRY 0x10 /* In mmio region (32-bit register) */
static struct pci_device_id agp_amdk7_pci_table[];
struct amd_page_map { struct amd_page_map {
unsigned long *real; unsigned long *real;
unsigned long *remapped; unsigned long *remapped;
...@@ -394,7 +396,6 @@ static struct agp_device_ids amd_agp_device_ids[] __devinitdata = ...@@ -394,7 +396,6 @@ static struct agp_device_ids amd_agp_device_ids[] __devinitdata =
static int __devinit agp_amdk7_probe(struct pci_dev *pdev, static int __devinit agp_amdk7_probe(struct pci_dev *pdev,
const struct pci_device_id *ent) const struct pci_device_id *ent)
{ {
struct agp_device_ids *devs = amd_agp_device_ids;
struct agp_bridge_data *bridge; struct agp_bridge_data *bridge;
u8 cap_ptr; u8 cap_ptr;
int j; int j;
...@@ -403,19 +404,10 @@ static int __devinit agp_amdk7_probe(struct pci_dev *pdev, ...@@ -403,19 +404,10 @@ static int __devinit agp_amdk7_probe(struct pci_dev *pdev,
if (!cap_ptr) if (!cap_ptr)
return -ENODEV; return -ENODEV;
for (j = 0; devs[j].chipset_name; j++) { j = ent - agp_amdk7_pci_table;
if (pdev->device == devs[j].device_id) { printk(KERN_INFO PFX "Detected AMD %s chipset\n",
printk (KERN_INFO PFX "Detected AMD %s chipset\n", amd_agp_device_ids[j].chipset_name);
devs[j].chipset_name);
goto found;
}
}
printk(KERN_ERR PFX "Unsupported AMD chipset (device id: %04x)\n",
pdev->device);
return -ENODEV;
found:
bridge = agp_alloc_bridge(); bridge = agp_alloc_bridge();
if (!bridge) if (!bridge)
return -ENOMEM; return -ENOMEM;
...@@ -442,12 +434,29 @@ static void __devexit agp_amdk7_remove(struct pci_dev *pdev) ...@@ -442,12 +434,29 @@ static void __devexit agp_amdk7_remove(struct pci_dev *pdev)
agp_put_bridge(bridge); agp_put_bridge(bridge);
} }
/* must be the same order as name table above */
static struct pci_device_id agp_amdk7_pci_table[] = { static struct pci_device_id agp_amdk7_pci_table[] = {
{ {
.class = (PCI_CLASS_BRIDGE_HOST << 8), .class = (PCI_CLASS_BRIDGE_HOST << 8),
.class_mask = ~0, .class_mask = ~0,
.vendor = PCI_VENDOR_ID_AMD, .vendor = PCI_VENDOR_ID_AMD,
.device = PCI_ANY_ID, .device = PCI_DEVICE_ID_AMD_FE_GATE_7006,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
},
{
.class = (PCI_CLASS_BRIDGE_HOST << 8),
.class_mask = ~0,
.vendor = PCI_VENDOR_ID_AMD,
.device = PCI_DEVICE_ID_AMD_FE_GATE_700E,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
},
{
.class = (PCI_CLASS_BRIDGE_HOST << 8),
.class_mask = ~0,
.vendor = PCI_VENDOR_ID_AMD,
.device = PCI_DEVICE_ID_AMD_FE_GATE_700C,
.subvendor = PCI_ANY_ID, .subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID, .subdevice = PCI_ANY_ID,
}, },
......
...@@ -288,8 +288,8 @@ static int __devinit aperture_valid(u64 aper, u32 size) ...@@ -288,8 +288,8 @@ static int __devinit aperture_valid(u64 aper, u32 size)
/* Request the Aperture. This catches cases when someone else /* Request the Aperture. This catches cases when someone else
already put a mapping in there - happens with some very broken BIOS already put a mapping in there - happens with some very broken BIOS
Maybe better to use pci_assign_resource/pci_enable_device instead trusting Maybe better to use pci_assign_resource/pci_enable_device instead
the bridges? */ trusting the bridges? */
if (!aperture_resource && if (!aperture_resource &&
!(aperture_resource = request_mem_region(aper, size, "aperture"))) { !(aperture_resource = request_mem_region(aper, size, "aperture"))) {
printk(KERN_ERR PFX "Aperture conflicts with PCI mapping.\n"); printk(KERN_ERR PFX "Aperture conflicts with PCI mapping.\n");
...@@ -377,7 +377,6 @@ static __devinit int cache_nbs (struct pci_dev *pdev, u32 cap_ptr) ...@@ -377,7 +377,6 @@ static __devinit int cache_nbs (struct pci_dev *pdev, u32 cap_ptr)
/* Handle AMD 8151 quirks */ /* Handle AMD 8151 quirks */
static void __devinit amd8151_init(struct pci_dev *pdev, struct agp_bridge_data *bridge) static void __devinit amd8151_init(struct pci_dev *pdev, struct agp_bridge_data *bridge)
{ {
char *revstring; char *revstring;
u8 rev_id; u8 rev_id;
...@@ -491,8 +490,7 @@ static int __devinit agp_amd64_probe(struct pci_dev *pdev, ...@@ -491,8 +490,7 @@ static int __devinit agp_amd64_probe(struct pci_dev *pdev,
pdev->device == PCI_DEVICE_ID_AMD_8151_0) { pdev->device == PCI_DEVICE_ID_AMD_8151_0) {
amd8151_init(pdev, bridge); amd8151_init(pdev, bridge);
} else { } else {
printk(KERN_INFO PFX "Detected AGP bridge %x\n", printk(KERN_INFO PFX "Detected AGP bridge %x\n", pdev->devfn);
pdev->devfn);
} }
bridge->driver = &amd_8151_driver; bridge->driver = &amd_8151_driver;
...@@ -581,6 +579,15 @@ static struct pci_device_id agp_amd64_pci_table[] = { ...@@ -581,6 +579,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,
}, },
/* SIS 755 */
{
.class = (PCI_CLASS_BRIDGE_HOST << 8),
.class_mask = ~0,
.vendor = PCI_VENDOR_ID_SI,
.device = PCI_DEVICE_ID_SI_755,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
},
{ } { }
}; };
......
...@@ -131,6 +131,7 @@ static int ati_create_gatt_pages(int nr_tables) ...@@ -131,6 +131,7 @@ static int ati_create_gatt_pages(int nr_tables)
i--; i--;
} }
kfree (tables); kfree (tables);
tables = NULL;
retval = -ENOMEM; retval = -ENOMEM;
break; break;
} }
......
...@@ -243,6 +243,9 @@ int agp_add_bridge(struct agp_bridge_data *bridge) ...@@ -243,6 +243,9 @@ int agp_add_bridge(struct agp_bridge_data *bridge)
{ {
int error; int error;
if (agp_off)
return -ENODEV;
if (!bridge->dev) { if (!bridge->dev) {
printk (KERN_DEBUG PFX "Erk, registering with no pci_dev!\n"); printk (KERN_DEBUG PFX "Erk, registering with no pci_dev!\n");
return -EINVAL; return -EINVAL;
......
...@@ -1382,8 +1382,10 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev, ...@@ -1382,8 +1382,10 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev,
name = "E7205"; name = "E7205";
break; break;
default: default:
printk(KERN_ERR PFX "Unsupported Intel chipset (device id: %04x)\n", if (cap_ptr)
printk(KERN_WARNING PFX "Unsupported Intel chipset (device id: %04x)\n",
pdev->device); pdev->device);
agp_put_bridge(bridge);
return -ENODEV; return -ENODEV;
}; };
...@@ -1406,7 +1408,8 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev, ...@@ -1406,7 +1408,8 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev,
if (!r->start && r->end) { if (!r->start && r->end) {
if(pci_assign_resource(pdev, 0)) { if(pci_assign_resource(pdev, 0)) {
printk(KERN_ERR PFX "could not assign resource 0\n"); printk(KERN_ERR PFX "could not assign resource 0\n");
return (-ENODEV); agp_put_bridge(bridge);
return -ENODEV;
} }
} }
...@@ -1417,7 +1420,8 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev, ...@@ -1417,7 +1420,8 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev,
*/ */
if (pci_enable_device(pdev)) { if (pci_enable_device(pdev)) {
printk(KERN_ERR PFX "Unable to Enable PCI device\n"); printk(KERN_ERR PFX "Unable to Enable PCI device\n");
return (-ENODEV); agp_put_bridge(bridge);
return -ENODEV;
} }
/* Fill in the mode register */ /* Fill in the mode register */
...@@ -1442,15 +1446,12 @@ static void __devexit agp_intel_remove(struct pci_dev *pdev) ...@@ -1442,15 +1446,12 @@ static void __devexit agp_intel_remove(struct pci_dev *pdev)
agp_put_bridge(bridge); agp_put_bridge(bridge);
} }
static int agp_intel_suspend(struct pci_dev *dev, u32 state)
{
return 0;
}
static int agp_intel_resume(struct pci_dev *pdev) static int agp_intel_resume(struct pci_dev *pdev)
{ {
struct agp_bridge_data *bridge = pci_get_drvdata(pdev); struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
pci_restore_state(pdev, pdev->saved_config_space);
if (bridge->driver == &intel_generic_driver) if (bridge->driver == &intel_generic_driver)
intel_configure(); intel_configure();
else if (bridge->driver == &intel_845_driver) else if (bridge->driver == &intel_845_driver)
...@@ -1462,14 +1463,36 @@ static int agp_intel_resume(struct pci_dev *pdev) ...@@ -1462,14 +1463,36 @@ static int agp_intel_resume(struct pci_dev *pdev)
} }
static struct pci_device_id agp_intel_pci_table[] = { static struct pci_device_id agp_intel_pci_table[] = {
{ #define ID(x) \
.class = (PCI_CLASS_BRIDGE_HOST << 8), { \
.class_mask = ~0, .class = (PCI_CLASS_BRIDGE_HOST << 8), \
.vendor = PCI_VENDOR_ID_INTEL, .class_mask = ~0, \
.device = PCI_ANY_ID, .vendor = PCI_VENDOR_ID_INTEL, \
.subvendor = PCI_ANY_ID, .device = x, \
.subdevice = PCI_ANY_ID, .subvendor = PCI_ANY_ID, \
}, .subdevice = PCI_ANY_ID, \
}
ID(PCI_DEVICE_ID_INTEL_82443LX_0),
ID(PCI_DEVICE_ID_INTEL_82443BX_0),
ID(PCI_DEVICE_ID_INTEL_82443GX_0),
ID(PCI_DEVICE_ID_INTEL_82810_MC1),
ID(PCI_DEVICE_ID_INTEL_82810_MC3),
ID(PCI_DEVICE_ID_INTEL_82810E_MC),
ID(PCI_DEVICE_ID_INTEL_82815_MC),
ID(PCI_DEVICE_ID_INTEL_82820_HB),
ID(PCI_DEVICE_ID_INTEL_82820_UP_HB),
ID(PCI_DEVICE_ID_INTEL_82830_HB),
ID(PCI_DEVICE_ID_INTEL_82840_HB),
ID(PCI_DEVICE_ID_INTEL_82845_HB),
ID(PCI_DEVICE_ID_INTEL_82845G_HB),
ID(PCI_DEVICE_ID_INTEL_82850_HB),
ID(PCI_DEVICE_ID_INTEL_82855PM_HB),
ID(PCI_DEVICE_ID_INTEL_82855GM_HB),
ID(PCI_DEVICE_ID_INTEL_82860_HB),
ID(PCI_DEVICE_ID_INTEL_82865_HB),
ID(PCI_DEVICE_ID_INTEL_82875_HB),
ID(PCI_DEVICE_ID_INTEL_7505_0),
ID(PCI_DEVICE_ID_INTEL_7205_0),
{ } { }
}; };
...@@ -1480,7 +1503,6 @@ static struct pci_driver agp_intel_pci_driver = { ...@@ -1480,7 +1503,6 @@ static struct pci_driver agp_intel_pci_driver = {
.id_table = agp_intel_pci_table, .id_table = agp_intel_pci_table,
.probe = agp_intel_probe, .probe = agp_intel_probe,
.remove = agp_intel_remove, .remove = agp_intel_remove,
.suspend = agp_intel_suspend,
.resume = agp_intel_resume, .resume = agp_intel_resume,
}; };
......
...@@ -491,10 +491,9 @@ static int __devinit agp_intelmch_probe(struct pci_dev *pdev, ...@@ -491,10 +491,9 @@ static int __devinit agp_intelmch_probe(struct pci_dev *pdev,
char *name = "(unknown)"; char *name = "(unknown)";
u8 cap_ptr = 0; u8 cap_ptr = 0;
if (!boot_cpu_has(X86_FEATURE_LM))
return -ENODEV;
cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP); cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP);
if (!cap_ptr)
return -ENODEV;
bridge = agp_alloc_bridge(); bridge = agp_alloc_bridge();
if (!bridge) if (!bridge)
...@@ -570,15 +569,12 @@ static void __devexit agp_intelmch_remove(struct pci_dev *pdev) ...@@ -570,15 +569,12 @@ static void __devexit agp_intelmch_remove(struct pci_dev *pdev)
agp_put_bridge(bridge); agp_put_bridge(bridge);
} }
static int agp_intelmch_suspend(struct pci_dev *dev, u32 state)
{
return 0;
}
static int agp_intelmch_resume(struct pci_dev *pdev) static int agp_intelmch_resume(struct pci_dev *pdev)
{ {
struct agp_bridge_data *bridge = pci_get_drvdata(pdev); struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
pci_restore_state(pdev, pdev->saved_config_space);
if (bridge->driver == &intel_845_driver) if (bridge->driver == &intel_845_driver)
intel_845_configure(); intel_845_configure();
...@@ -590,7 +586,15 @@ static struct pci_device_id agp_intelmch_pci_table[] = { ...@@ -590,7 +586,15 @@ static struct pci_device_id agp_intelmch_pci_table[] = {
.class = (PCI_CLASS_BRIDGE_HOST << 8), .class = (PCI_CLASS_BRIDGE_HOST << 8),
.class_mask = ~0, .class_mask = ~0,
.vendor = PCI_VENDOR_ID_INTEL, .vendor = PCI_VENDOR_ID_INTEL,
.device = PCI_ANY_ID, .device = PCI_DEVICE_ID_INTEL_82865_HB,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
},
{
.class = (PCI_CLASS_BRIDGE_HOST << 8),
.class_mask = ~0,
.vendor = PCI_VENDOR_ID_INTEL,
.device = PCI_DEVICE_ID_INTEL_82875_HB,
.subvendor = PCI_ANY_ID, .subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID, .subdevice = PCI_ANY_ID,
}, },
...@@ -604,7 +608,6 @@ static struct pci_driver agp_intelmch_pci_driver = { ...@@ -604,7 +608,6 @@ static struct pci_driver agp_intelmch_pci_driver = {
.id_table = agp_intelmch_pci_table, .id_table = agp_intelmch_pci_table,
.probe = agp_intelmch_probe, .probe = agp_intelmch_probe,
.remove = agp_intelmch_remove, .remove = agp_intelmch_remove,
.suspend = agp_intelmch_suspend,
.resume = agp_intelmch_resume, .resume = agp_intelmch_resume,
}; };
......
...@@ -380,7 +380,15 @@ static struct pci_device_id agp_nvidia_pci_table[] = { ...@@ -380,7 +380,15 @@ static struct pci_device_id agp_nvidia_pci_table[] = {
.class = (PCI_CLASS_BRIDGE_HOST << 8), .class = (PCI_CLASS_BRIDGE_HOST << 8),
.class_mask = ~0, .class_mask = ~0,
.vendor = PCI_VENDOR_ID_NVIDIA, .vendor = PCI_VENDOR_ID_NVIDIA,
.device = PCI_ANY_ID, .device = PCI_DEVICE_ID_NVIDIA_NFORCE,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
},
{
.class = (PCI_CLASS_BRIDGE_HOST << 8),
.class_mask = ~0,
.vendor = PCI_VENDOR_ID_NVIDIA,
.device = PCI_DEVICE_ID_NVIDIA_NFORCE2,
.subvendor = PCI_ANY_ID, .subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID, .subdevice = PCI_ANY_ID,
}, },
......
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
#define SIS_TLBCNTRL 0x97 #define SIS_TLBCNTRL 0x97
#define SIS_TLBFLUSH 0x98 #define SIS_TLBFLUSH 0x98
static int __devinitdata agp_sis_force_delay = 0;
static int __devinitdata agp_sis_agp_spec = -1;
static int sis_fetch_size(void) static int sis_fetch_size(void)
{ {
...@@ -67,7 +69,7 @@ static void sis_cleanup(void) ...@@ -67,7 +69,7 @@ static void sis_cleanup(void)
(previous_size->size_value & ~(0x03))); (previous_size->size_value & ~(0x03)));
} }
static void sis_648_enable(u32 mode) static void sis_delayed_enable(u32 mode)
{ {
struct pci_dev *device = NULL; struct pci_dev *device = NULL;
u32 command; u32 command;
...@@ -94,13 +96,12 @@ static void sis_648_enable(u32 mode) ...@@ -94,13 +96,12 @@ static void sis_648_enable(u32 mode)
pci_write_config_dword(device, agp + PCI_AGP_COMMAND, command); pci_write_config_dword(device, agp + PCI_AGP_COMMAND, command);
/* /*
* Weird: on 648(fx) and 746(fx) chipsets any rate change in the target * Weird: on some sis chipsets any rate change in the target
* command register triggers a 5ms screwup during which the master * command register triggers a 5ms screwup during which the master
* cannot be configured * cannot be configured
*/ */
if (device->device == PCI_DEVICE_ID_SI_648 || if (device->device == agp_bridge->dev->device) {
device->device == PCI_DEVICE_ID_SI_746) { printk(KERN_INFO PFX "SiS delay workaround: giving bridge time to recover.\n");
printk(KERN_INFO PFX "SiS chipset with AGP problems detected. Giving bridge time to recover.\n");
set_current_state(TASK_UNINTERRUPTIBLE); set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout (1+(HZ*10)/1000); schedule_timeout (1+(HZ*10)/1000);
} }
...@@ -223,11 +224,28 @@ static struct agp_device_ids sis_agp_device_ids[] __devinitdata = ...@@ -223,11 +224,28 @@ static struct agp_device_ids sis_agp_device_ids[] __devinitdata =
}; };
// chipsets that require the 'delay hack'
static int sis_broken_chipsets[] __devinitdata = {
PCI_DEVICE_ID_SI_648,
PCI_DEVICE_ID_SI_746,
0 // terminator
};
static void __devinit sis_get_driver(struct agp_bridge_data *bridge) static void __devinit sis_get_driver(struct agp_bridge_data *bridge)
{ {
if (bridge->dev->device == PCI_DEVICE_ID_SI_648) { int i;
sis_driver.agp_enable=sis_648_enable;
if (agp_bridge->major_version == 3) { for(i=0; sis_broken_chipsets[i]!=0; ++i)
if(bridge->dev->device==sis_broken_chipsets[i])
break;
if(sis_broken_chipsets[i] || agp_sis_force_delay)
sis_driver.agp_enable=sis_delayed_enable;
// sis chipsets that indicate less than agp3.5
// are not actually fully agp3 compliant
if ((agp_bridge->major_version == 3 && agp_bridge->minor_version >= 5
&& agp_sis_agp_spec!=0) || agp_sis_agp_spec==1) {
sis_driver.aperture_sizes = agp3_generic_sizes; sis_driver.aperture_sizes = agp3_generic_sizes;
sis_driver.size_type = U16_APER_SIZE; sis_driver.size_type = U16_APER_SIZE;
sis_driver.num_aperture_sizes = AGP_GENERIC_SIZES_ENTRIES; sis_driver.num_aperture_sizes = AGP_GENERIC_SIZES_ENTRIES;
...@@ -236,16 +254,6 @@ static void __devinit sis_get_driver(struct agp_bridge_data *bridge) ...@@ -236,16 +254,6 @@ static void __devinit sis_get_driver(struct agp_bridge_data *bridge)
sis_driver.cleanup = agp3_generic_cleanup; sis_driver.cleanup = agp3_generic_cleanup;
sis_driver.tlb_flush = agp3_generic_tlbflush; sis_driver.tlb_flush = agp3_generic_tlbflush;
} }
}
if (bridge->dev->device == PCI_DEVICE_ID_SI_746) {
/*
* We don't know enough about the 746 to enable it properly.
* Though we do know that it needs the 'delay' hack to settle
* after changing modes.
*/
sis_driver.agp_enable=sis_648_enable;
}
} }
...@@ -335,4 +343,8 @@ static void __exit agp_sis_cleanup(void) ...@@ -335,4 +343,8 @@ static void __exit agp_sis_cleanup(void)
module_init(agp_sis_init); module_init(agp_sis_init);
module_exit(agp_sis_cleanup); module_exit(agp_sis_cleanup);
MODULE_PARM(agp_sis_force_delay,"i");
MODULE_PARM_DESC(agp_sis_force_delay,"forces sis delay hack");
MODULE_PARM(agp_sis_agp_spec,"i");
MODULE_PARM_DESC(agp_sis_agp_spec,"0=force sis init, 1=force generic agp3 init, default: autodetect");
MODULE_LICENSE("GPL and additional rights"); MODULE_LICENSE("GPL and additional rights");
...@@ -248,26 +248,13 @@ static int serverworks_fetch_size(void) ...@@ -248,26 +248,13 @@ static int serverworks_fetch_size(void)
*/ */
static void serverworks_tlbflush(struct agp_memory *temp) static void serverworks_tlbflush(struct agp_memory *temp)
{ {
unsigned long end; OUTREG8(serverworks_private.registers, SVWRKS_POSTFLUSH, 1);
while(INREG8(serverworks_private.registers, SVWRKS_POSTFLUSH) == 1)
OUTREG8(serverworks_private.registers, SVWRKS_POSTFLUSH, 0x01); cpu_relax();
end = jiffies + 3*HZ;
while(INREG8(serverworks_private.registers, OUTREG32(serverworks_private.registers, SVWRKS_DIRFLUSH, 1);
SVWRKS_POSTFLUSH) == 0x01) { while(INREG32(serverworks_private.registers, SVWRKS_DIRFLUSH) == 1)
if((signed)(end - jiffies) <= 0) { cpu_relax();
printk(KERN_ERR PFX "Posted write buffer flush took more"
"then 3 seconds\n");
}
}
OUTREG32(serverworks_private.registers, SVWRKS_DIRFLUSH, 0x00000001);
end = jiffies + 3*HZ;
while(INREG32(serverworks_private.registers,
SVWRKS_DIRFLUSH) == 0x00000001) {
if((signed)(end - jiffies) <= 0) {
printk(KERN_ERR PFX "TLB flush took more"
"then 3 seconds\n");
}
}
} }
static int serverworks_configure(void) static int serverworks_configure(void)
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
#include <linux/agp_backend.h> #include <linux/agp_backend.h>
#include "agp.h" #include "agp.h"
static struct pci_device_id agp_via_pci_table[];
#define VIA_GARTCTRL 0x80 #define VIA_GARTCTRL 0x80
#define VIA_APSIZE 0x84 #define VIA_APSIZE 0x84
#define VIA_ATTBASE 0x88 #define VIA_ATTBASE 0x88
...@@ -378,20 +380,9 @@ static int __devinit agp_via_probe(struct pci_dev *pdev, ...@@ -378,20 +380,9 @@ static int __devinit agp_via_probe(struct pci_dev *pdev,
if (!cap_ptr) if (!cap_ptr)
return -ENODEV; return -ENODEV;
/* probe for known chipsets */ j = ent - agp_via_pci_table;
for (j = 0; devs[j].chipset_name; j++) { printk (KERN_INFO PFX "Detected VIA %s chipset\n", devs[j].chipset_name);
if (pdev->device == devs[j].device_id) {
printk (KERN_INFO PFX "Detected VIA %s chipset\n",
devs[j].chipset_name);
goto found;
}
}
printk(KERN_ERR PFX "Unsupported VIA chipset (device id: %04x)\n",
pdev->device);
return -ENODEV;
found:
bridge = agp_alloc_bridge(); bridge = agp_alloc_bridge();
if (!bridge) if (!bridge)
return -ENOMEM; return -ENOMEM;
...@@ -432,15 +423,40 @@ static void __devexit agp_via_remove(struct pci_dev *pdev) ...@@ -432,15 +423,40 @@ static void __devexit agp_via_remove(struct pci_dev *pdev)
agp_put_bridge(bridge); agp_put_bridge(bridge);
} }
/* must be the same order as name table above */
static struct pci_device_id agp_via_pci_table[] = { static struct pci_device_id agp_via_pci_table[] = {
{ #define ID(x) \
.class = (PCI_CLASS_BRIDGE_HOST << 8), { \
.class_mask = ~0, .class = (PCI_CLASS_BRIDGE_HOST << 8), \
.vendor = PCI_VENDOR_ID_VIA, .class_mask = ~0, \
.device = PCI_ANY_ID, .vendor = PCI_VENDOR_ID_VIA, \
.subvendor = PCI_ANY_ID, .device = x, \
.subdevice = PCI_ANY_ID, .subvendor = PCI_ANY_ID, \
}, .subdevice = PCI_ANY_ID, \
}
ID(PCI_DEVICE_ID_VIA_82C598_0),
ID(PCI_DEVICE_ID_VIA_8501_0),
ID(PCI_DEVICE_ID_VIA_8601_0),
ID(PCI_DEVICE_ID_VIA_82C691_0),
ID(PCI_DEVICE_ID_VIA_8371_0),
ID(PCI_DEVICE_ID_VIA_8633_0),
ID(PCI_DEVICE_ID_VIA_XN266),
ID(PCI_DEVICE_ID_VIA_8361),
ID(PCI_DEVICE_ID_VIA_8363_0),
ID(PCI_DEVICE_ID_VIA_8753_0),
ID(PCI_DEVICE_ID_VIA_8367_0),
ID(PCI_DEVICE_ID_VIA_8653_0),
ID(PCI_DEVICE_ID_VIA_XM266),
ID(PCI_DEVICE_ID_VIA_862X_0),
ID(PCI_DEVICE_ID_VIA_8377_0),
ID(PCI_DEVICE_ID_VIA_8605_0),
ID(PCI_DEVICE_ID_VIA_8703_51_0),
ID(PCI_DEVICE_ID_VIA_8754C_0),
ID(PCI_DEVICE_ID_VIA_8763_0),
ID(PCI_DEVICE_ID_VIA_8378_0),
ID(PCI_DEVICE_ID_VIA_PT880),
ID(PCI_DEVICE_ID_VIA_8783_0),
ID(PCI_DEVICE_ID_VIA_PX8X0_0),
{ } { }
}; };
......
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