diff options
| author | David Hildenbrand <david@redhat.com> | 2018-12-12 10:16:18 +0100 |
|---|---|---|
| committer | Michael S. Tsirkin <mst@redhat.com> | 2018-12-20 11:19:12 -0500 |
| commit | 3e5209265798af396b9f20bac58f203a743cc3f4 (patch) | |
| tree | 1ce76635d74e8dfca50897b86a27b940fb4437c6 /hw/acpi/piix4.c | |
| parent | ec266f408882fd38475f72c4e864ed576228643b (diff) | |
| download | focaccia-qemu-3e5209265798af396b9f20bac58f203a743cc3f4.tar.gz focaccia-qemu-3e5209265798af396b9f20bac58f203a743cc3f4.zip | |
pci/pcihp: overwrite hotplug handler recursively from the start
For now, the hotplug handler is not called for devices that are being cold plugged. The hotplug handler is setup when the machine initialization is fully done. Only bridges that were cold plugged are considered. Set the hotplug handler for the root piix bus directly when realizing. Overwrite the hotplug handler of bridges when coldplugging them. This will now make sure that the ACPI PCI hotplug handler is also called for cold plugged devices (also on bridges) but not for bridges that were hotplugged (keeping the current behavior). Reviewed-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: David Hildenbrand <david@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'hw/acpi/piix4.c')
| -rw-r--r-- | hw/acpi/piix4.c | 16 |
1 files changed, 1 insertions, 15 deletions
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c index f68e62d36c..07dfeb0e3d 100644 --- a/hw/acpi/piix4.c +++ b/hw/acpi/piix4.c @@ -447,15 +447,6 @@ static void piix4_device_unplug_cb(HotplugHandler *hotplug_dev, } } -static void piix4_update_bus_hotplug(PCIBus *pci_bus, void *opaque) -{ - PIIX4PMState *s = opaque; - - /* pci_bus cannot outlive PIIX4PMState, because /machine keeps it alive - * and it's not hot-unpluggable */ - qbus_set_hotplug_handler(BUS(pci_bus), DEVICE(s), &error_abort); -} - static void piix4_pm_machine_ready(Notifier *n, void *opaque) { PIIX4PMState *s = container_of(n, PIIX4PMState, machine_ready); @@ -469,12 +460,6 @@ static void piix4_pm_machine_ready(Notifier *n, void *opaque) pci_conf[0x63] = 0x60; pci_conf[0x67] = (memory_region_present(io_as, 0x3f8) ? 0x08 : 0) | (memory_region_present(io_as, 0x2f8) ? 0x90 : 0); - - if (s->use_acpi_pci_hotplug) { - pci_for_each_bus(pci_get_bus(d), piix4_update_bus_hotplug, s); - } else { - piix4_update_bus_hotplug(pci_get_bus(d), s); - } } static void piix4_pm_add_propeties(PIIX4PMState *s) @@ -548,6 +533,7 @@ static void piix4_pm_realize(PCIDevice *dev, Error **errp) piix4_acpi_system_hot_add_init(pci_address_space_io(dev), pci_get_bus(dev), s); + qbus_set_hotplug_handler(BUS(pci_get_bus(dev)), DEVICE(s), &error_abort); piix4_pm_add_propeties(s); } |