Index: pci.c =================================================================== --- pci.c (revision 220127) +++ pci.c (working copy) @@ -108,7 +108,7 @@ uint64_t address, uint32_t data); static void pci_mask_msix(device_t dev, u_int index); static void pci_unmask_msix(device_t dev, u_int index); -static int pci_msi_blacklisted(void); +static int pci_msi_blacklisted(device_t child); static void pci_resume_msi(device_t dev); static void pci_resume_msix(device_t dev); static int pci_remap_intr_method(device_t bus, device_t dev, @@ -1300,7 +1300,7 @@ return (ENXIO); /* If MSI is blacklisted for this system, fail. */ - if (pci_msi_blacklisted()) + if (pci_msi_blacklisted(child)) return (ENXIO); /* MSI-X capability present? */ @@ -1887,8 +1887,9 @@ * that give the motherboard manufacturer and model number. */ static int -pci_msi_blacklisted(void) +pci_msi_blacklisted(device_t child) { + struct pci_devinfo *dinfo; device_t dev; if (!pci_honor_msi_blacklist) @@ -1907,6 +1908,18 @@ dev = pci_find_bsf(0, 0, 0); if (dev != NULL) return (pci_msi_device_blacklisted(dev)); + + /* + * Blacklist HyperTransport devices on systems with Nvidia + * chipsets if the device at 0:0:0:0 is not a HyperTransport + * slave. + */ + if (pci_find_cap(child, PCIY_HT, NULL) == 0 && dev != NULL && + pci_get_vendor(dev) == 0x10de) { + dinfo = device_get_ivars(dev); + if (dinfo->cfg.ht.ht_slave == 0) + return (1); + } return (0); } @@ -1938,7 +1951,7 @@ return (ENXIO); /* If MSI is blacklisted for this system, fail. */ - if (pci_msi_blacklisted()) + if (pci_msi_blacklisted(child)) return (ENXIO); /* MSI capability present? */