0a122b
From 7197c8b9234f26922ce7c6f3d7784b2604bdaafd Mon Sep 17 00:00:00 2001
0a122b
From: Alex Williamson <alex.williamson@redhat.com>
0a122b
Date: Thu, 21 Nov 2013 21:08:58 +0100
0a122b
Subject: [PATCH 10/14] vfio-pci: Fix multifunction=on
0a122b
0a122b
RH-Author: Alex Williamson <alex.williamson@redhat.com>
0a122b
Message-id: <20131121210817.12705.22782.stgit@bling.home>
0a122b
Patchwork-id: 55844
0a122b
O-Subject: [RHEL7 qemu-kvm PATCH] vfio-pci: Fix multifunction=on
0a122b
Bugzilla: 1029275
0a122b
RH-Acked-by: Amos Kong <akong@redhat.com>
0a122b
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
0a122b
RH-Acked-by: Bandan Das <bsd@redhat.com>
0a122b
0a122b
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1029275
0a122b
Brew: https://brewweb.devel.redhat.com/taskinfo?taskID=6627360
0a122b
Upstream: 187d62327aca39afbb038d13d7cd6bf2d11640d3
0a122b
0a122b
When an assigned device is initialized it copies the device config
0a122b
space into the emulated config space.  Unfortunately multifunction is
0a122b
setup prior to the device initfn and gets clobbered.  We need to
0a122b
restore it just like pci-assign does.
0a122b
0a122b
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
0a122b
Reviewed-by: Bandan Das <bsd@redhat.com>
0a122b
Message-id: 20131112185059.7262.33780.stgit@bling.home
0a122b
Cc: qemu-stable@nongnu.org
0a122b
Signed-off-by: Anthony Liguori <aliguori@amazon.com>
0a122b
---
0a122b
 hw/misc/vfio.c |    7 +++++++
0a122b
 1 file changed, 7 insertions(+)
0a122b
0a122b
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
0a122b
---
0a122b
 hw/misc/vfio.c |    7 +++++++
0a122b
 1 files changed, 7 insertions(+), 0 deletions(-)
0a122b
0a122b
diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
0a122b
index b7f213b..5a6925c 100644
0a122b
--- a/hw/misc/vfio.c
0a122b
+++ b/hw/misc/vfio.c
0a122b
@@ -3625,6 +3625,13 @@ static int vfio_initfn(PCIDevice *pdev)
0a122b
     vdev->emulated_config_bits[PCI_HEADER_TYPE] =
0a122b
                                               PCI_HEADER_TYPE_MULTI_FUNCTION;
0a122b
 
0a122b
+    /* Restore or clear multifunction, this is always controlled by QEMU */
0a122b
+    if (vdev->pdev.cap_present & QEMU_PCI_CAP_MULTIFUNCTION) {
0a122b
+        vdev->pdev.config[PCI_HEADER_TYPE] |= PCI_HEADER_TYPE_MULTI_FUNCTION;
0a122b
+    } else {
0a122b
+        vdev->pdev.config[PCI_HEADER_TYPE] &= ~PCI_HEADER_TYPE_MULTI_FUNCTION;
0a122b
+    }
0a122b
+
0a122b
     /*
0a122b
      * Clear host resource mapping info.  If we choose not to register a
0a122b
      * BAR, such as might be the case with the option ROM, we can get
0a122b
-- 
0a122b
1.7.1
0a122b