- Add a new PCI quirk to whitelist an old chipset that doesn't support

PCI-express or PCI-X capabilities if we are running in a virtual machine.
- Whitelist the Intel 82440 chipset used by QEMU.

Tested by:	jfv
MFC after:	1 week
This commit is contained in:
jhb 2010-10-22 11:42:02 +00:00
parent a60a1a68ae
commit 97a61d6656

View File

@ -182,6 +182,7 @@ struct pci_quirk {
int type;
#define PCI_QUIRK_MAP_REG 1 /* PCI map register in weird place */
#define PCI_QUIRK_DISABLE_MSI 2 /* MSI/MSI-X doesn't work */
#define PCI_QUIRK_ENABLE_MSI_VM 3 /* Older chipset in VM where MSI works */
int arg1;
int arg2;
};
@ -218,6 +219,12 @@ struct pci_quirk pci_quirks[] = {
*/
{ 0x74501022, PCI_QUIRK_DISABLE_MSI, 0, 0 },
/*
* Some virtualization environments emulate an older chipset
* but support MSI just fine. QEMU uses the Intel 82440.
*/
{ 0x12378086, PCI_QUIRK_ENABLE_MSI_VM, 0, 0 },
{ 0 }
};
@ -1833,6 +1840,23 @@ pci_msi_device_blacklisted(device_t dev)
return (0);
}
/*
* Returns true if a specified chipset supports MSI when it is
* emulated hardware in a virtual machine.
*/
static int
pci_msi_vm_chipset(device_t dev)
{
struct pci_quirk *q;
for (q = &pci_quirks[0]; q->devid; q++) {
if (q->devid == pci_get_devid(dev) &&
q->type == PCI_QUIRK_ENABLE_MSI_VM)
return (1);
}
return (0);
}
/*
* Determine if MSI is blacklisted globally on this sytem. Currently,
* we just check for blacklisted chipsets as represented by the
@ -1849,8 +1873,14 @@ pci_msi_blacklisted(void)
return (0);
/* Blacklist all non-PCI-express and non-PCI-X chipsets. */
if (!(pcie_chipset || pcix_chipset))
if (!(pcie_chipset || pcix_chipset)) {
if (vm_guest != VM_GUEST_NO) {
dev = pci_find_bsf(0, 0, 0);
if (dev != NULL)
return (pci_msi_vm_chipset(dev) == 0);
}
return (1);
}
dev = pci_find_bsf(0, 0, 0);
if (dev != NULL)