Loading hw/vfio/pci-quirks.c +4 −14 Original line number Diff line number Diff line Loading @@ -19,12 +19,8 @@ /* Use uin32_t for vendor & device so PCI_ANY_ID expands and cannot match hw */ static bool vfio_pci_is(VFIOPCIDevice *vdev, uint32_t vendor, uint32_t device) { PCIDevice *pdev = &vdev->pdev; return (vendor == PCI_ANY_ID || vendor == pci_get_word(pdev->config + PCI_VENDOR_ID)) && (device == PCI_ANY_ID || device == pci_get_word(pdev->config + PCI_DEVICE_ID)); return (vendor == PCI_ANY_ID || vendor == vdev->vendor_id) && (device == PCI_ANY_ID || device == vdev->device_id); } static bool vfio_is_vga(VFIOPCIDevice *vdev) Loading Loading @@ -1178,15 +1174,9 @@ out: void vfio_setup_resetfn_quirk(VFIOPCIDevice *vdev) { PCIDevice *pdev = &vdev->pdev; uint16_t vendor, device; vendor = pci_get_word(pdev->config + PCI_VENDOR_ID); device = pci_get_word(pdev->config + PCI_DEVICE_ID); switch (vendor) { switch (vdev->vendor_id) { case 0x1002: switch (device) { switch (vdev->device_id) { /* Bonaire */ case 0x6649: /* Bonaire [FirePro W5100] */ case 0x6650: Loading hw/vfio/pci.c +5 −5 Original line number Diff line number Diff line Loading @@ -1221,17 +1221,14 @@ static int vfio_msix_early_setup(VFIOPCIDevice *vdev) * specific quirk if the device is known or we have a broken configuration. */ if (msix->pba_offset >= vdev->bars[msix->pba_bar].region.size) { PCIDevice *pdev = &vdev->pdev; uint16_t vendor = pci_get_word(pdev->config + PCI_VENDOR_ID); uint16_t device = pci_get_word(pdev->config + PCI_DEVICE_ID); /* * Chelsio T5 Virtual Function devices are encoded as 0x58xx for T5 * adapters. The T5 hardware returns an incorrect value of 0x8000 for * the VF PBA offset while the BAR itself is only 8k. The correct value * is 0x1000, so we hard code that here. */ if (vendor == PCI_VENDOR_ID_CHELSIO && (device & 0xff00) == 0x5800) { if (vdev->vendor_id == PCI_VENDOR_ID_CHELSIO && (vdev->device_id & 0xff00) == 0x5800) { msix->pba_offset = 0x1000; } else { error_report("vfio: Hardware reports invalid configuration, " Loading Loading @@ -2407,6 +2404,9 @@ static int vfio_initfn(PCIDevice *pdev) /* QEMU can choose to expose the ROM or not */ memset(vdev->emulated_config_bits + PCI_ROM_ADDRESS, 0xff, 4); vdev->vendor_id = pci_get_word(pdev->config + PCI_VENDOR_ID); vdev->device_id = pci_get_word(pdev->config + PCI_DEVICE_ID); /* QEMU can change multi-function devices to single function, or reverse */ vdev->emulated_config_bits[PCI_HEADER_TYPE] = PCI_HEADER_TYPE_MULTI_FUNCTION; Loading hw/vfio/pci.h +2 −0 Original line number Diff line number Diff line Loading @@ -116,6 +116,8 @@ typedef struct VFIOPCIDevice { EventNotifier err_notifier; EventNotifier req_notifier; int (*resetfn)(struct VFIOPCIDevice *); uint16_t vendor_id; uint16_t device_id; uint32_t features; #define VFIO_FEATURE_ENABLE_VGA_BIT 0 #define VFIO_FEATURE_ENABLE_VGA (1 << VFIO_FEATURE_ENABLE_VGA_BIT) Loading Loading
hw/vfio/pci-quirks.c +4 −14 Original line number Diff line number Diff line Loading @@ -19,12 +19,8 @@ /* Use uin32_t for vendor & device so PCI_ANY_ID expands and cannot match hw */ static bool vfio_pci_is(VFIOPCIDevice *vdev, uint32_t vendor, uint32_t device) { PCIDevice *pdev = &vdev->pdev; return (vendor == PCI_ANY_ID || vendor == pci_get_word(pdev->config + PCI_VENDOR_ID)) && (device == PCI_ANY_ID || device == pci_get_word(pdev->config + PCI_DEVICE_ID)); return (vendor == PCI_ANY_ID || vendor == vdev->vendor_id) && (device == PCI_ANY_ID || device == vdev->device_id); } static bool vfio_is_vga(VFIOPCIDevice *vdev) Loading Loading @@ -1178,15 +1174,9 @@ out: void vfio_setup_resetfn_quirk(VFIOPCIDevice *vdev) { PCIDevice *pdev = &vdev->pdev; uint16_t vendor, device; vendor = pci_get_word(pdev->config + PCI_VENDOR_ID); device = pci_get_word(pdev->config + PCI_DEVICE_ID); switch (vendor) { switch (vdev->vendor_id) { case 0x1002: switch (device) { switch (vdev->device_id) { /* Bonaire */ case 0x6649: /* Bonaire [FirePro W5100] */ case 0x6650: Loading
hw/vfio/pci.c +5 −5 Original line number Diff line number Diff line Loading @@ -1221,17 +1221,14 @@ static int vfio_msix_early_setup(VFIOPCIDevice *vdev) * specific quirk if the device is known or we have a broken configuration. */ if (msix->pba_offset >= vdev->bars[msix->pba_bar].region.size) { PCIDevice *pdev = &vdev->pdev; uint16_t vendor = pci_get_word(pdev->config + PCI_VENDOR_ID); uint16_t device = pci_get_word(pdev->config + PCI_DEVICE_ID); /* * Chelsio T5 Virtual Function devices are encoded as 0x58xx for T5 * adapters. The T5 hardware returns an incorrect value of 0x8000 for * the VF PBA offset while the BAR itself is only 8k. The correct value * is 0x1000, so we hard code that here. */ if (vendor == PCI_VENDOR_ID_CHELSIO && (device & 0xff00) == 0x5800) { if (vdev->vendor_id == PCI_VENDOR_ID_CHELSIO && (vdev->device_id & 0xff00) == 0x5800) { msix->pba_offset = 0x1000; } else { error_report("vfio: Hardware reports invalid configuration, " Loading Loading @@ -2407,6 +2404,9 @@ static int vfio_initfn(PCIDevice *pdev) /* QEMU can choose to expose the ROM or not */ memset(vdev->emulated_config_bits + PCI_ROM_ADDRESS, 0xff, 4); vdev->vendor_id = pci_get_word(pdev->config + PCI_VENDOR_ID); vdev->device_id = pci_get_word(pdev->config + PCI_DEVICE_ID); /* QEMU can change multi-function devices to single function, or reverse */ vdev->emulated_config_bits[PCI_HEADER_TYPE] = PCI_HEADER_TYPE_MULTI_FUNCTION; Loading
hw/vfio/pci.h +2 −0 Original line number Diff line number Diff line Loading @@ -116,6 +116,8 @@ typedef struct VFIOPCIDevice { EventNotifier err_notifier; EventNotifier req_notifier; int (*resetfn)(struct VFIOPCIDevice *); uint16_t vendor_id; uint16_t device_id; uint32_t features; #define VFIO_FEATURE_ENABLE_VGA_BIT 0 #define VFIO_FEATURE_ENABLE_VGA (1 << VFIO_FEATURE_ENABLE_VGA_BIT) Loading