|
@@ -32,6 +32,7 @@
|
|
|
#include "hw/pci/pci_bridge.h"
|
|
|
#include "hw/pci/pci_host.h"
|
|
|
#include "hw/pci/pcie_port.h"
|
|
|
+#include "hw/pci-bridge/xio3130_downstream.h"
|
|
|
#include "hw/i386/acpi-build.h"
|
|
|
#include "hw/acpi/acpi.h"
|
|
|
#include "hw/pci/pci_bus.h"
|
|
@@ -336,6 +337,8 @@ void acpi_pcihp_device_plug_cb(HotplugHandler *hotplug_dev, AcpiPciHpState *s,
|
|
|
{
|
|
|
PCIDevice *pdev = PCI_DEVICE(dev);
|
|
|
int slot = PCI_SLOT(pdev->devfn);
|
|
|
+ PCIDevice *bridge;
|
|
|
+ PCIBus *bus;
|
|
|
int bsel;
|
|
|
|
|
|
/* Don't send event when device is enabled during qemu machine creation:
|
|
@@ -365,7 +368,14 @@ void acpi_pcihp_device_plug_cb(HotplugHandler *hotplug_dev, AcpiPciHpState *s,
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- bsel = acpi_pcihp_get_bsel(pci_get_bus(pdev));
|
|
|
+ bus = pci_get_bus(pdev);
|
|
|
+ bridge = pci_bridge_get_device(bus);
|
|
|
+ if (object_dynamic_cast(OBJECT(bridge), TYPE_PCIE_ROOT_PORT) ||
|
|
|
+ object_dynamic_cast(OBJECT(bridge), TYPE_XIO3130_DOWNSTREAM)) {
|
|
|
+ pcie_cap_slot_enable_power(bridge);
|
|
|
+ }
|
|
|
+
|
|
|
+ bsel = acpi_pcihp_get_bsel(bus);
|
|
|
g_assert(bsel >= 0);
|
|
|
s->acpi_pcihp_pci_status[bsel].up |= (1U << slot);
|
|
|
acpi_send_event(DEVICE(hotplug_dev), ACPI_PCI_HOTPLUG_STATUS);
|