|
@@ -536,10 +536,10 @@ static inline DeviceState *create_acpi_ged(VirtMachineState *vms, qemu_irq *pic)
|
|
|
DeviceState *dev;
|
|
|
MachineState *ms = MACHINE(vms);
|
|
|
int irq = vms->irqmap[VIRT_ACPI_GED];
|
|
|
- uint32_t event = 0;
|
|
|
+ uint32_t event = ACPI_GED_PWR_DOWN_EVT;
|
|
|
|
|
|
if (ms->ram_slots) {
|
|
|
- event = ACPI_GED_MEM_HOTPLUG_EVT;
|
|
|
+ event |= ACPI_GED_MEM_HOTPLUG_EVT;
|
|
|
}
|
|
|
|
|
|
dev = qdev_create(NULL, TYPE_ACPI_GED);
|
|
@@ -793,8 +793,14 @@ static void create_rtc(const VirtMachineState *vms, qemu_irq *pic)
|
|
|
static DeviceState *gpio_key_dev;
|
|
|
static void virt_powerdown_req(Notifier *n, void *opaque)
|
|
|
{
|
|
|
- /* use gpio Pin 3 for power button event */
|
|
|
- qemu_set_irq(qdev_get_gpio_in(gpio_key_dev, 0), 1);
|
|
|
+ VirtMachineState *s = container_of(n, VirtMachineState, powerdown_notifier);
|
|
|
+
|
|
|
+ if (s->acpi_dev) {
|
|
|
+ acpi_send_event(s->acpi_dev, ACPI_POWER_DOWN_STATUS);
|
|
|
+ } else {
|
|
|
+ /* use gpio Pin 3 for power button event */
|
|
|
+ qemu_set_irq(qdev_get_gpio_in(gpio_key_dev, 0), 1);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void create_gpio(const VirtMachineState *vms, qemu_irq *pic)
|
|
@@ -1723,10 +1729,10 @@ static void machvirt_init(MachineState *machine)
|
|
|
|
|
|
create_pcie(vms, pic);
|
|
|
|
|
|
- create_gpio(vms, pic);
|
|
|
-
|
|
|
if (has_ged && aarch64 && firmware_loaded && acpi_enabled) {
|
|
|
vms->acpi_dev = create_acpi_ged(vms, pic);
|
|
|
+ } else {
|
|
|
+ create_gpio(vms, pic);
|
|
|
}
|
|
|
|
|
|
/* connect powerdown request */
|