|
@@ -357,6 +357,16 @@ void acpi_pcihp_device_unplug_request_cb(HotplugHandler *hotplug_dev,
|
|
|
* acpi_pcihp_eject_slot() when the operation is completed.
|
|
|
*/
|
|
|
pdev->qdev.pending_deleted_event = true;
|
|
|
+ /* if unplug was requested before OSPM is initialized,
|
|
|
+ * linux kernel will clear GPE0.sts[] bits during boot, which effectively
|
|
|
+ * hides unplug event. And than followup qmp_device_del() calls remain
|
|
|
+ * blocked by above flag permanently.
|
|
|
+ * Unblock qmp_device_del() by setting expire limit, so user can
|
|
|
+ * repeat unplug request later when OSPM has been booted.
|
|
|
+ */
|
|
|
+ pdev->qdev.pending_deleted_expires_ms =
|
|
|
+ qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL); /* 1 msec */
|
|
|
+
|
|
|
s->acpi_pcihp_pci_status[bsel].down |= (1U << slot);
|
|
|
acpi_send_event(DEVICE(hotplug_dev), ACPI_PCI_HOTPLUG_STATUS);
|
|
|
}
|