]> xenbits.xensource.com Git - qemu-upstream-4.5-testing.git/commitdiff
vfio-pci: Fix multifunction=on
authorAlex Williamson <alex.williamson@redhat.com>
Tue, 12 Nov 2013 18:53:24 +0000 (11:53 -0700)
committerMichael Roth <mdroth@linux.vnet.ibm.com>
Mon, 9 Dec 2013 17:40:30 +0000 (11:40 -0600)
When an assigned device is initialized it copies the device config
space into the emulated config space.  Unfortunately multifunction is
setup prior to the device initfn and gets clobbered.  We need to
restore it just like pci-assign does.

Cc: qemu-stable@nongnu.org
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
(cherry picked from commit 8d07d6c46597a885eb38d99cc6fff399ce69cd21)

Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
hw/misc/vfio.c

index 017e69352a17206f62e280991f7ac4a9561f8ba2..d9e78e14901ca21dbc262f7a61b1ddfb272eff74 100644 (file)
@@ -3142,6 +3142,13 @@ static int vfio_initfn(PCIDevice *pdev)
     vdev->emulated_config_bits[PCI_HEADER_TYPE] =
                                               PCI_HEADER_TYPE_MULTI_FUNCTION;
 
+    /* Restore or clear multifunction, this is always controlled by QEMU */
+    if (vdev->pdev.cap_present & QEMU_PCI_CAP_MULTIFUNCTION) {
+        vdev->pdev.config[PCI_HEADER_TYPE] |= PCI_HEADER_TYPE_MULTI_FUNCTION;
+    } else {
+        vdev->pdev.config[PCI_HEADER_TYPE] &= ~PCI_HEADER_TYPE_MULTI_FUNCTION;
+    }
+
     /*
      * Clear host resource mapping info.  If we choose not to register a
      * BAR, such as might be the case with the option ROM, we can get