[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 08/11] s390x/pci: Move some hotplug checks to the pre
From: |
Cornelia Huck |
Subject: |
[Qemu-devel] [PULL 08/11] s390x/pci: Move some hotplug checks to the pre_plug handler |
Date: |
Fri, 18 Jan 2019 13:19:22 +0100 |
From: David Hildenbrand <address@hidden>
Let's move most of the checks to the new pre_plug handler. As a PCI
bridge is just a PCI device, we can simplify the code.
Notes: We cannot yet move the MSIX check or device ID creation +
zPCI device creation to the pre_plug handler as both parts are not
fixed before actual device realization (and therefore after pre_plug and
before plug). Once that part is factored out, we can move these parts to
the pre_plug handler, too and therefore remove all possible errors from
the plug handler.
Reviewed-by: Collin Walling <address@hidden>
Signed-off-by: David Hildenbrand <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Cornelia Huck <address@hidden>
---
hw/s390x/s390-pci-bus.c | 41 +++++++++++++++++++++++++----------------
1 file changed, 25 insertions(+), 16 deletions(-)
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index 248e0eb295..c467cc526b 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -818,11 +818,31 @@ static bool s390_pci_alloc_idx(S390pciState *s,
S390PCIBusDevice *pbdev)
}
pbdev->idx = idx;
- s->next_idx = (idx + 1) & FH_MASK_INDEX;
-
return true;
}
+static void s390_pcihost_pre_plug(HotplugHandler *hotplug_dev, DeviceState
*dev,
+ Error **errp)
+{
+ S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
+
+ if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
+ PCIDevice *pdev = PCI_DEVICE(dev);
+
+ if (pdev->cap_present & QEMU_PCI_CAP_MULTIFUNCTION) {
+ error_setg(errp, "multifunction not supported in s390");
+ return;
+ }
+ } else if (object_dynamic_cast(OBJECT(dev), TYPE_S390_PCI_DEVICE)) {
+ S390PCIBusDevice *pbdev = S390_PCI_DEVICE(dev);
+
+ if (!s390_pci_alloc_idx(s, pbdev)) {
+ error_setg(errp, "no slot for plugging zpci device");
+ return;
+ }
+ }
+}
+
static void s390_pcihost_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
Error **errp)
{
@@ -835,11 +855,6 @@ static void s390_pcihost_plug(HotplugHandler *hotplug_dev,
DeviceState *dev,
PCIBridge *pb = PCI_BRIDGE(dev);
PCIDevice *pdev = PCI_DEVICE(dev);
- if (pdev->cap_present & QEMU_PCI_CAP_MULTIFUNCTION) {
- error_setg(errp, "multifunction not supported in s390");
- return;
- }
-
pci_bridge_map_irq(pb, dev->id, s390_pci_map_irq);
pci_setup_iommu(&pb->sec_bus, s390_pci_dma_iommu, s);
@@ -859,11 +874,6 @@ static void s390_pcihost_plug(HotplugHandler *hotplug_dev,
DeviceState *dev,
} else if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
pdev = PCI_DEVICE(dev);
- if (pdev->cap_present & QEMU_PCI_CAP_MULTIFUNCTION) {
- error_setg(errp, "multifunction not supported in s390");
- return;
- }
-
if (!dev->id) {
/* In the case the PCI device does not define an id */
/* we generate one based on the PCI address */
@@ -905,10 +915,8 @@ static void s390_pcihost_plug(HotplugHandler *hotplug_dev,
DeviceState *dev,
} else if (object_dynamic_cast(OBJECT(dev), TYPE_S390_PCI_DEVICE)) {
pbdev = S390_PCI_DEVICE(dev);
- if (!s390_pci_alloc_idx(s, pbdev)) {
- error_setg(errp, "no slot for plugging zpci device");
- return;
- }
+ /* the allocated idx is actually getting used */
+ s->next_idx = (pbdev->idx + 1) & FH_MASK_INDEX;
pbdev->fh = pbdev->idx;
QTAILQ_INSERT_TAIL(&s->zpci_devs, pbdev, link);
g_hash_table_insert(s->zpci_table, &pbdev->idx, pbdev);
@@ -1045,6 +1053,7 @@ static void s390_pcihost_class_init(ObjectClass *klass,
void *data)
dc->reset = s390_pcihost_reset;
dc->realize = s390_pcihost_realize;
+ hc->pre_plug = s390_pcihost_pre_plug;
hc->plug = s390_pcihost_plug;
hc->unplug = s390_pcihost_unplug;
msi_nonbroken = true;
--
2.17.2
- [Qemu-devel] [PULL 00/11] s390x updates, Cornelia Huck, 2019/01/18
- [Qemu-devel] [PULL 01/11] s390: avoid potential null dereference in s390_pcihost_unplug(), Cornelia Huck, 2019/01/18
- [Qemu-devel] [PULL 04/11] configure: Only build the s390-ccw bios if the compiler supports -march=z900, Cornelia Huck, 2019/01/18
- [Qemu-devel] [PULL 03/11] s390x: Return specification exception for unimplemented diag 308 subcodes, Cornelia Huck, 2019/01/18
- [Qemu-devel] [PULL 02/11] pc-bios/s390-ccw: Use proper register names for Clang, Cornelia Huck, 2019/01/18
- [Qemu-devel] [PULL 05/11] s390x/pci: Send correct event on hotplug, Cornelia Huck, 2019/01/18
- [Qemu-devel] [PULL 06/11] s390x/pci: Set the iommu region size mpcifc request, Cornelia Huck, 2019/01/18
- [Qemu-devel] [PULL 07/11] s390x/pci: Use hotplug_dev instead of looking up the host bridge, Cornelia Huck, 2019/01/18
- [Qemu-devel] [PULL 08/11] s390x/pci: Move some hotplug checks to the pre_plug handler,
Cornelia Huck <=
- [Qemu-devel] [PULL 09/11] s390x/pci: Always delete and free the release_timer, Cornelia Huck, 2019/01/18
- [Qemu-devel] [PULL 11/11] s390x/pci: add common function measurement block, Cornelia Huck, 2019/01/18
- [Qemu-devel] [PULL 10/11] s390x/pci: Ignore the unplug call if we already have a release_timer, Cornelia Huck, 2019/01/18
- Re: [Qemu-devel] [PULL 00/11] s390x updates, Peter Maydell, 2019/01/18