summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Williamson <alex.williamson@redhat.com>2013-11-12 11:53:24 -0700
committerAnthony Liguori <aliguori@amazon.com>2013-11-21 08:01:28 -0800
commit187d62327aca39afbb038d13d7cd6bf2d11640d3 (patch)
tree38b5097193227c689fd3def074def98645e98491
parent7865eec4f5fb10224a2cd391a8476044cbe5a1f7 (diff)
downloadqemu-187d62327aca39afbb038d13d7cd6bf2d11640d3.zip
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. Signed-off-by: Alex Williamson <alex.williamson@redhat.com> Reviewed-by: Bandan Das <bsd@redhat.com> Message-id: 20131112185059.7262.33780.stgit@bling.home Cc: qemu-stable@nongnu.org Signed-off-by: Anthony Liguori <aliguori@amazon.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 fe95e03d1d..f7f8a19ee8 100644
--- a/hw/misc/vfio.c
+++ b/hw/misc/vfio.c
@@ -3568,6 +3568,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