summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Williamson <alex.williamson@redhat.com>2013-11-12 11:53:24 -0700
committerMichael Roth <mdroth@linux.vnet.ibm.com>2013-12-09 11:40:30 -0600
commit37da395651cd1279a8f111b5c8fc31d6f547f67f (patch)
tree10dae9739274cd0139aa82dc9592167bd0311eed
parent4d2f39a918ab4ccac7255da143b4322a9b4b204a (diff)
downloadqemu-37da395651cd1279a8f111b5c8fc31d6f547f67f.tar.gz
vfio-pci: Fix multifunction=on
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>
-rw-r--r--hw/misc/vfio.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
index 017e69352a..d9e78e1490 100644
--- a/hw/misc/vfio.c
+++ b/hw/misc/vfio.c
@@ -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