mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 13:11:40 +00:00
[AGPGART] prevent probe collision of sis-agp and amd64_agp
For some vendor/id pairs the kernel will autoload both the sis-agp and the amd64_agp modules as the sis-agp module will load for all sis devices. This collision causes the bug reported in: http://bugzilla.novell.com/show_bug.cgi?id=248665 As currently sis_probe does its own matching, requesting the whole range gains nothing. The clean fix seems to me to leave the matching to the core and advertise only the devices actually supported. This patch does so. Signed-off-by: Oliver Neukum <oneukum@suse.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Dave Jones <davej@redhat.com>
This commit is contained in:
parent
de46c33745
commit
82eab1306c
@ -143,96 +143,6 @@ static struct agp_bridge_driver sis_driver = {
|
|||||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct agp_device_ids sis_agp_device_ids[] __devinitdata =
|
|
||||||
{
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_5591_AGP,
|
|
||||||
.chipset_name = "5591",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_530,
|
|
||||||
.chipset_name = "530",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_540,
|
|
||||||
.chipset_name = "540",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_550,
|
|
||||||
.chipset_name = "550",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_620,
|
|
||||||
.chipset_name = "620",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_630,
|
|
||||||
.chipset_name = "630",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_635,
|
|
||||||
.chipset_name = "635",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_645,
|
|
||||||
.chipset_name = "645",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_646,
|
|
||||||
.chipset_name = "646",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_648,
|
|
||||||
.chipset_name = "648",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_650,
|
|
||||||
.chipset_name = "650",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_651,
|
|
||||||
.chipset_name = "651",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_655,
|
|
||||||
.chipset_name = "655",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_661,
|
|
||||||
.chipset_name = "661",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_730,
|
|
||||||
.chipset_name = "730",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_735,
|
|
||||||
.chipset_name = "735",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_740,
|
|
||||||
.chipset_name = "740",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_741,
|
|
||||||
.chipset_name = "741",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_745,
|
|
||||||
.chipset_name = "745",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_746,
|
|
||||||
.chipset_name = "746",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.device_id = PCI_DEVICE_ID_SI_760,
|
|
||||||
.chipset_name = "760",
|
|
||||||
},
|
|
||||||
{ }, /* dummy final entry, always present */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// chipsets that require the 'delay hack'
|
// chipsets that require the 'delay hack'
|
||||||
static int sis_broken_chipsets[] __devinitdata = {
|
static int sis_broken_chipsets[] __devinitdata = {
|
||||||
PCI_DEVICE_ID_SI_648,
|
PCI_DEVICE_ID_SI_648,
|
||||||
@ -269,29 +179,15 @@ static void __devinit sis_get_driver(struct agp_bridge_data *bridge)
|
|||||||
static int __devinit agp_sis_probe(struct pci_dev *pdev,
|
static int __devinit agp_sis_probe(struct pci_dev *pdev,
|
||||||
const struct pci_device_id *ent)
|
const struct pci_device_id *ent)
|
||||||
{
|
{
|
||||||
struct agp_device_ids *devs = sis_agp_device_ids;
|
|
||||||
struct agp_bridge_data *bridge;
|
struct agp_bridge_data *bridge;
|
||||||
u8 cap_ptr;
|
u8 cap_ptr;
|
||||||
int j;
|
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
/* probe for known chipsets */
|
|
||||||
for (j = 0; devs[j].chipset_name; j++) {
|
|
||||||
if (pdev->device == devs[j].device_id) {
|
|
||||||
printk(KERN_INFO PFX "Detected SiS %s chipset\n",
|
|
||||||
devs[j].chipset_name);
|
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printk(KERN_ERR PFX "Unsupported SiS chipset (device id: %04x)\n",
|
printk(KERN_INFO PFX "Detected SiS chipset - id:%i\n", pdev->device);
|
||||||
pdev->device);
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
found:
|
|
||||||
bridge = agp_alloc_bridge();
|
bridge = agp_alloc_bridge();
|
||||||
if (!bridge)
|
if (!bridge)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@ -320,12 +216,172 @@ static void __devexit agp_sis_remove(struct pci_dev *pdev)
|
|||||||
|
|
||||||
static struct pci_device_id agp_sis_pci_table[] = {
|
static struct pci_device_id agp_sis_pci_table[] = {
|
||||||
{
|
{
|
||||||
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
.class_mask = ~0,
|
.class_mask = ~0,
|
||||||
.vendor = PCI_VENDOR_ID_SI,
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
.device = PCI_ANY_ID,
|
.device = PCI_DEVICE_ID_SI_5591_AGP,
|
||||||
.subvendor = PCI_ANY_ID,
|
.subvendor = PCI_ANY_ID,
|
||||||
.subdevice = PCI_ANY_ID,
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_530,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_540,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_550,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_620,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_630,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_635,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_645,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_646,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_648,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_650,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_651,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_655,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_661,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_730,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_735,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_740,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_741,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_745,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_746,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.class = (PCI_CLASS_BRIDGE_HOST << 8),
|
||||||
|
.class_mask = ~0,
|
||||||
|
.vendor = PCI_VENDOR_ID_SI,
|
||||||
|
.device = PCI_DEVICE_ID_SI_760,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
},
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user