Commit 6fd02489 authored by Ben Hutchings's avatar Ben Hutchings Committed by Dave Airlie

amd64-agp: Probe unknown AGP devices the right way

The current initialisation code probes 'unsupported' AGP devices
simply by calling its own probe function.  It does not lock these
devices or even check whether another driver is already bound to
them.

We must use the device core to manage this.  So if the specific
device id table didn't match anything and agp_try_unsupported=1,
switch the device id table and call driver_attach() again.
Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent d831692a
...@@ -500,6 +500,10 @@ static int __devinit agp_amd64_probe(struct pci_dev *pdev, ...@@ -500,6 +500,10 @@ static int __devinit agp_amd64_probe(struct pci_dev *pdev,
u8 cap_ptr; u8 cap_ptr;
int err; int err;
/* The Highlander principle */
if (agp_bridges_found)
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) if (!cap_ptr)
return -ENODEV; return -ENODEV;
...@@ -563,6 +567,8 @@ static void __devexit agp_amd64_remove(struct pci_dev *pdev) ...@@ -563,6 +567,8 @@ static void __devexit agp_amd64_remove(struct pci_dev *pdev)
amd64_aperture_sizes[bridge->aperture_size_idx].size); amd64_aperture_sizes[bridge->aperture_size_idx].size);
agp_remove_bridge(bridge); agp_remove_bridge(bridge);
agp_put_bridge(bridge); agp_put_bridge(bridge);
agp_bridges_found--;
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM
...@@ -710,6 +716,11 @@ static struct pci_device_id agp_amd64_pci_table[] = { ...@@ -710,6 +716,11 @@ static struct pci_device_id agp_amd64_pci_table[] = {
MODULE_DEVICE_TABLE(pci, agp_amd64_pci_table); MODULE_DEVICE_TABLE(pci, agp_amd64_pci_table);
static DEFINE_PCI_DEVICE_TABLE(agp_amd64_pci_promisc_table) = {
{ PCI_DEVICE_CLASS(0, 0) },
{ }
};
static struct pci_driver agp_amd64_pci_driver = { static struct pci_driver agp_amd64_pci_driver = {
.name = "agpgart-amd64", .name = "agpgart-amd64",
.id_table = agp_amd64_pci_table, .id_table = agp_amd64_pci_table,
...@@ -735,7 +746,6 @@ int __init agp_amd64_init(void) ...@@ -735,7 +746,6 @@ int __init agp_amd64_init(void)
return err; return err;
if (agp_bridges_found == 0) { if (agp_bridges_found == 0) {
struct pci_dev *dev;
if (!agp_try_unsupported && !agp_try_unsupported_boot) { if (!agp_try_unsupported && !agp_try_unsupported_boot) {
printk(KERN_INFO PFX "No supported AGP bridge found.\n"); printk(KERN_INFO PFX "No supported AGP bridge found.\n");
#ifdef MODULE #ifdef MODULE
...@@ -751,17 +761,10 @@ int __init agp_amd64_init(void) ...@@ -751,17 +761,10 @@ int __init agp_amd64_init(void)
return -ENODEV; return -ENODEV;
/* Look for any AGP bridge */ /* Look for any AGP bridge */
dev = NULL; agp_amd64_pci_driver.id_table = agp_amd64_pci_promisc_table;
err = driver_attach(&agp_amd64_pci_driver.driver);
if (err == 0 && agp_bridges_found == 0)
err = -ENODEV; err = -ENODEV;
for_each_pci_dev(dev) {
if (!pci_find_capability(dev, PCI_CAP_ID_AGP))
continue;
/* Only one bridge supported right now */
if (agp_amd64_probe(dev, NULL) == 0) {
err = 0;
break;
}
}
} }
return err; return err;
} }
......
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