diff mbox

[for-1.7] vfio-pci: Fix multifunction=on

Message ID 20131112185059.7262.33780.stgit@bling.home
State New
Headers show

Commit Message

Alex Williamson Nov. 12, 2013, 6:53 p.m. UTC
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>
Cc: qemu-stable@nongnu.org
---

Anthony, please apply directly or let me know if you'd prefer a pull
request.  Thanks

 hw/misc/vfio.c |    7 +++++++
 1 file changed, 7 insertions(+)

Comments

Bandan Das Nov. 13, 2013, 11:25 p.m. UTC | #1
Alex Williamson <alex.williamson@redhat.com> writes:

> 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>
> Cc: qemu-stable@nongnu.org
> ---
>
> Anthony, please apply directly or let me know if you'd prefer a pull
> request.  Thanks
>
>  hw/misc/vfio.c |    7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
> index fe95e03..f7f8a19 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

Reviewed-by: Bandan Das <bsd@redhat.com>
diff mbox

Patch

diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
index fe95e03..f7f8a19 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