[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v3 39/44] pci/shpc: perform unplug via the hotplug ha
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] [PULL v3 39/44] pci/shpc: perform unplug via the hotplug handler |
Date: |
Thu, 20 Dec 2018 13:40:08 -0500 |
From: David Hildenbrand <address@hidden>
Introduce and use the "unplug" callback.
This is a preparation for multi-stage hotplug handlers, whereby the bus
hotplug handler is overwritten by the machine hotplug handler. This handler
will then pass control to the bus hotplug handler. So to get this running
cleanly, we also have to make sure to go via the hotplug handler chain when
actually unplugging a device after an unplug request. Lookup the hotplug
handler and call "unplug".
Reviewed-by: David Gibson <address@hidden>
Signed-off-by: David Hildenbrand <address@hidden>
Reviewed-by: Michael S. Tsirkin <address@hidden>
Signed-off-by: Michael S. Tsirkin <address@hidden>
---
include/hw/pci/pci_bridge.h | 2 ++
include/hw/pci/shpc.h | 2 ++
hw/pci-bridge/pci_bridge_dev.c | 10 ++++++++++
hw/pci-bridge/pcie_pci_bridge.c | 1 +
hw/pci/shpc.c | 11 ++++++++++-
5 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/include/hw/pci/pci_bridge.h b/include/hw/pci/pci_bridge.h
index 6e37c7551a..ba488818d2 100644
--- a/include/hw/pci/pci_bridge.h
+++ b/include/hw/pci/pci_bridge.h
@@ -101,6 +101,8 @@ void pci_bridge_exitfn(PCIDevice *pci_dev);
void pci_bridge_dev_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
Error **errp);
+void pci_bridge_dev_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
+ Error **errp);
void pci_bridge_dev_unplug_request_cb(HotplugHandler *hotplug_dev,
DeviceState *dev, Error **errp);
diff --git a/include/hw/pci/shpc.h b/include/hw/pci/shpc.h
index 71293aca58..18f6ec1cd5 100644
--- a/include/hw/pci/shpc.h
+++ b/include/hw/pci/shpc.h
@@ -47,6 +47,8 @@ void shpc_cap_write_config(PCIDevice *d, uint32_t addr,
uint32_t val, int len);
void shpc_device_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
Error **errp);
+void shpc_device_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
+ Error **errp);
void shpc_device_unplug_request_cb(HotplugHandler *hotplug_dev,
DeviceState *dev, Error **errp);
diff --git a/hw/pci-bridge/pci_bridge_dev.c b/hw/pci-bridge/pci_bridge_dev.c
index fa0be13ac4..ff6b8323da 100644
--- a/hw/pci-bridge/pci_bridge_dev.c
+++ b/hw/pci-bridge/pci_bridge_dev.c
@@ -219,6 +219,15 @@ void pci_bridge_dev_plug_cb(HotplugHandler *hotplug_dev,
DeviceState *dev,
shpc_device_plug_cb(hotplug_dev, dev, errp);
}
+void pci_bridge_dev_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
+ Error **errp)
+{
+ PCIDevice *pci_hotplug_dev = PCI_DEVICE(hotplug_dev);
+
+ g_assert(shpc_present(pci_hotplug_dev));
+ shpc_device_unplug_cb(hotplug_dev, dev, errp);
+}
+
void pci_bridge_dev_unplug_request_cb(HotplugHandler *hotplug_dev,
DeviceState *dev, Error **errp)
{
@@ -251,6 +260,7 @@ static void pci_bridge_dev_class_init(ObjectClass *klass,
void *data)
dc->vmsd = &pci_bridge_dev_vmstate;
set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
hc->plug = pci_bridge_dev_plug_cb;
+ hc->unplug = pci_bridge_dev_unplug_cb;
hc->unplug_request = pci_bridge_dev_unplug_request_cb;
}
diff --git a/hw/pci-bridge/pcie_pci_bridge.c b/hw/pci-bridge/pcie_pci_bridge.c
index 0ffea680d5..d491b40d04 100644
--- a/hw/pci-bridge/pcie_pci_bridge.c
+++ b/hw/pci-bridge/pcie_pci_bridge.c
@@ -154,6 +154,7 @@ static void pcie_pci_bridge_class_init(ObjectClass *klass,
void *data)
dc->reset = &pcie_pci_bridge_reset;
set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
hc->plug = pci_bridge_dev_plug_cb;
+ hc->unplug = pci_bridge_dev_unplug_cb;
hc->unplug_request = pci_bridge_dev_unplug_request_cb;
}
diff --git a/hw/pci/shpc.c b/hw/pci/shpc.c
index 7851bfa8ad..45053b39b9 100644
--- a/hw/pci/shpc.c
+++ b/hw/pci/shpc.c
@@ -238,6 +238,7 @@ static void shpc_invalid_command(SHPCDevice *shpc)
static void shpc_free_devices_in_slot(SHPCDevice *shpc, int slot)
{
+ HotplugHandler *hotplug_ctrl;
int devfn;
int pci_slot = SHPC_IDX_TO_PCI(slot);
for (devfn = PCI_DEVFN(pci_slot, 0);
@@ -245,7 +246,9 @@ static void shpc_free_devices_in_slot(SHPCDevice *shpc, int
slot)
++devfn) {
PCIDevice *affected_dev = shpc->sec_bus->devices[devfn];
if (affected_dev) {
- object_unparent(OBJECT(affected_dev));
+ hotplug_ctrl = qdev_get_hotplug_handler(DEVICE(affected_dev));
+ hotplug_handler_unplug(hotplug_ctrl, DEVICE(affected_dev),
+ &error_abort);
}
}
}
@@ -540,6 +543,12 @@ void shpc_device_plug_cb(HotplugHandler *hotplug_dev,
DeviceState *dev,
shpc_interrupt_update(pci_hotplug_dev);
}
+void shpc_device_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
+ Error **errp)
+{
+ object_unparent(OBJECT(dev));
+}
+
void shpc_device_unplug_request_cb(HotplugHandler *hotplug_dev,
DeviceState *dev, Error **errp)
{
--
MST
- [Qemu-devel] [PULL v3 28/44] hw: acpi: Export and share the ARM RSDP build, (continued)
- [Qemu-devel] [PULL v3 28/44] hw: acpi: Export and share the ARM RSDP build, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 29/44] hw: acpi: Remove AcpiRsdpDescriptor and fix tests, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 25/44] hw: arm: Carry RSDP specific data through AcpiRsdpData, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 33/44] s390x/pci: rename hotplug handler callbacks, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 26/44] hw: arm: Convert the RSDP build to the buid_append_foo() API, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 37/44] pci/pcie: perform unplug via the hotplug handler, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 36/44] pci/pcihp: perform unplug via the hotplug handler, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 30/44] hw/i386: Remove deprecated machines pc-0.10 and pc-0.11, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 35/44] pci/pcihp: overwrite hotplug handler recursively from the start, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 34/44] pci/pcihp: perform check for bus capability in pre_plug handler, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 39/44] pci/shpc: perform unplug via the hotplug handler,
Michael S. Tsirkin <=
- [Qemu-devel] [PULL v3 40/44] spapr_pci: perform unplug via the hotplug handler, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 38/44] pci: Reuse pci-bridge hotplug handler handlers for pcie-pci-bridge, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 41/44] pci: Adjust PCI config limit based on bus topology, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 44/44] x86-iommu: turn on IR by default if proper, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 43/44] x86-iommu: switch intr_supported to OnOffAuto type, Michael S. Tsirkin, 2018/12/20
- [Qemu-devel] [PULL v3 42/44] q35: set split kernel irqchip as default, Michael S. Tsirkin, 2018/12/20
- Re: [Qemu-devel] [PULL v3 00/44] pci, pc, virtio: fixes, features, Peter Maydell, 2018/12/21
- Re: [Qemu-devel] [PULL v3 00/44] pci, pc, virtio: fixes, features, no-reply, 2018/12/26