|
@@ -1499,6 +1499,14 @@ static void vfio_msix_early_setup(VFIOPCIDevice *vdev, Error **errp)
|
|
|
if (vdev->vendor_id == PCI_VENDOR_ID_CHELSIO &&
|
|
|
(vdev->device_id & 0xff00) == 0x5800) {
|
|
|
msix->pba_offset = 0x1000;
|
|
|
+ /*
|
|
|
+ * BAIDU KUNLUN Virtual Function devices for KUNLUN AI processor
|
|
|
+ * return an incorrect value of 0x460000 for the VF PBA offset while
|
|
|
+ * the BAR itself is only 0x10000. The correct value is 0xb400.
|
|
|
+ */
|
|
|
+ } else if (vfio_pci_is(vdev, PCI_VENDOR_ID_BAIDU,
|
|
|
+ PCI_DEVICE_ID_KUNLUN_VF)) {
|
|
|
+ msix->pba_offset = 0xb400;
|
|
|
} else if (vdev->msix_relo == OFF_AUTOPCIBAR_OFF) {
|
|
|
error_setg(errp, "hardware reports invalid configuration, "
|
|
|
"MSIX PBA outside of specified BAR");
|
|
@@ -3058,14 +3066,14 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (vdev->vendor_id == PCI_VENDOR_ID_NVIDIA) {
|
|
|
+ if (vfio_pci_is(vdev, PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID)) {
|
|
|
ret = vfio_pci_nvidia_v100_ram_init(vdev, errp);
|
|
|
if (ret && ret != -ENODEV) {
|
|
|
error_report("Failed to setup NVIDIA V100 GPU RAM");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (vdev->vendor_id == PCI_VENDOR_ID_IBM) {
|
|
|
+ if (vfio_pci_is(vdev, PCI_VENDOR_ID_IBM, PCI_ANY_ID)) {
|
|
|
ret = vfio_pci_nvlink2_init(vdev, errp);
|
|
|
if (ret && ret != -ENODEV) {
|
|
|
error_report("Failed to setup NVlink2 bridge");
|