On 28/09/2017 7:08, David Gibson wrote:
On Wed, Sep 27, 2017 at 04:56:32PM -0300, Eduardo Habkost wrote:
The following devices support both PCI Express and Conventional
PCI, by including special code to handle the QEMU_PCI_CAP_EXPRESS
flag and/or conditional pcie_endpoint_cap_init() calls:

* vfio-pci (is_express=1, but legacy PCI handled by
   vfio_populate_device())

In the case of VFIO, won't this depend on the capabilities of the
device on the host?


Most (almost all?) assigned devices are PCI Express,
they will be exposed as PCI/PCI express depending on the
slot they are plugged into.

Anyway, the interface only states the device can be PCI or PCI Express,
so I think is OK.

Reviewed-by: Marcel Apfelbaum <[email protected]>

Thanks,
Marcel

* vmxnet3 (is_express=0, but PCIe handled by vmxnet3_realize())
* pvscsi (is_express=0, but PCIe handled by pvscsi_realize())
* virtio-pci (is_express=0, but PCIe handled by
   virtio_pci_dc_realize(), and additional legacy PCI code at
   virtio_pci_realize())
* base-xhci (is_express=1, but pcie_endpoint_cap_init() call
   is conditional on pci_bus_is_express(dev->bus)
   * Note that xhci does not clear QEMU_PCI_CAP_EXPRESS like the
     other hybrid devices

Cc: Dmitry Fleytman <[email protected]>
Cc: Jason Wang <[email protected]>
Cc: Paolo Bonzini <[email protected]>
Cc: Gerd Hoffmann <[email protected]>
Cc: Alex Williamson <[email protected]>
Cc: "Michael S. Tsirkin" <[email protected]>
Signed-off-by: Eduardo Habkost <[email protected]>

Except for the query above,

Reviewed-by: David Gibson <[email protected]>

---
Changes v1 -> v2:
* s/legacy/conventional/
   * Suggested-by: Alex Williamson <[email protected]>
* Mark base-xhci as hybrid too
---
  hw/net/vmxnet3.c       | 5 +++++
  hw/scsi/vmw_pvscsi.c   | 2 ++
  hw/usb/hcd-xhci.c      | 5 +++++
  hw/vfio/pci.c          | 5 +++++
  hw/virtio/virtio-pci.c | 5 +++++
  5 files changed, 22 insertions(+)

diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c
index a19a7a31dd..f99d9a69ec 100644
--- a/hw/net/vmxnet3.c
+++ b/hw/net/vmxnet3.c
@@ -2651,6 +2651,11 @@ static const TypeInfo vmxnet3_info = {
      .instance_size = sizeof(VMXNET3State),
      .class_init    = vmxnet3_class_init,
      .instance_init = vmxnet3_instance_init,
+    .interfaces = (InterfaceInfo[]) {
+        { INTERFACE_PCIE_DEVICE },
+        { INTERFACE_CONVENTIONAL_PCI_DEVICE },
+        { }
+    },
  };
static void vmxnet3_register_types(void)
diff --git a/hw/scsi/vmw_pvscsi.c b/hw/scsi/vmw_pvscsi.c
index 6d3f0bf11d..d6b315f8b2 100644
--- a/hw/scsi/vmw_pvscsi.c
+++ b/hw/scsi/vmw_pvscsi.c
@@ -1300,6 +1300,8 @@ static const TypeInfo pvscsi_info = {
      .class_init    = pvscsi_class_init,
      .interfaces = (InterfaceInfo[]) {
          { TYPE_HOTPLUG_HANDLER },
+        { INTERFACE_PCIE_DEVICE },
+        { INTERFACE_CONVENTIONAL_PCI_DEVICE },
          { }
      }
  };
diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
index d75c085d94..af3a9d88de 100644
--- a/hw/usb/hcd-xhci.c
+++ b/hw/usb/hcd-xhci.c
@@ -3670,6 +3670,11 @@ static const TypeInfo xhci_info = {
      .instance_size = sizeof(XHCIState),
      .class_init    = xhci_class_init,
      .abstract      = true,
+    .interfaces = (InterfaceInfo[]) {
+        { INTERFACE_PCIE_DEVICE },
+        { INTERFACE_CONVENTIONAL_PCI_DEVICE },
+        { }
+    },
  };
static void qemu_xhci_class_init(ObjectClass *klass, void *data)
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index 31e1edf447..913433d6ba 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -3023,6 +3023,11 @@ static const TypeInfo vfio_pci_dev_info = {
      .class_init = vfio_pci_dev_class_init,
      .instance_init = vfio_instance_init,
      .instance_finalize = vfio_instance_finalize,
+    .interfaces = (InterfaceInfo[]) {
+        { INTERFACE_PCIE_DEVICE },
+        { INTERFACE_CONVENTIONAL_PCI_DEVICE },
+        { }
+    },
  };
static void register_vfio_pci_dev_type(void)
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index 8b0d6b69cd..67c8ab63ad 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1958,6 +1958,11 @@ static const TypeInfo virtio_pci_info = {
      .class_init    = virtio_pci_class_init,
      .class_size    = sizeof(VirtioPCIClass),
      .abstract      = true,
+    .interfaces = (InterfaceInfo[]) {
+        { INTERFACE_PCIE_DEVICE },
+        { INTERFACE_CONVENTIONAL_PCI_DEVICE },
+        { }
+    },
  };
/* virtio-blk-pci */



Reply via email to