aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSong Gao <gaosong@loongson.cn>2023-01-10 11:29:16 +0800
committerSong Gao <gaosong@loongson.cn>2023-03-03 09:37:30 +0800
commit0d588c4f999699a430b32c563fe9ccc1710b8fd7 (patch)
tree4f6c295522ceacbac5add653f20714f2e04a0dcf
parentc77432d0efc56273347eb5d8619935052e5ad0a6 (diff)
downloadqemu-0d588c4f999699a430b32c563fe9ccc1710b8fd7.zip
qemu-0d588c4f999699a430b32c563fe9ccc1710b8fd7.tar.gz
qemu-0d588c4f999699a430b32c563fe9ccc1710b8fd7.tar.bz2
hw/loongarch/virt: add system_powerdown hmp command support
For loongarch virt machine, add powerdown notification callback and send ACPI_POWER_DOWN_STATUS event by acpi ged. Also add acpi dsdt table for ACPI_POWER_BUTTON_DEVICE device in this patch. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Song Gao <gaosong@loongson.cn> Message-Id: <20230303010548.295580-1-gaosong@loongson.cn>
-rw-r--r--hw/loongarch/acpi-build.c1
-rw-r--r--hw/loongarch/virt.c12
-rw-r--r--include/hw/loongarch/virt.h1
3 files changed, 14 insertions, 0 deletions
diff --git a/hw/loongarch/acpi-build.c b/hw/loongarch/acpi-build.c
index 8aed50e..6cb2472 100644
--- a/hw/loongarch/acpi-build.c
+++ b/hw/loongarch/acpi-build.c
@@ -260,6 +260,7 @@ build_la_ged_aml(Aml *dsdt, MachineState *machine)
AML_SYSTEM_MEMORY,
VIRT_GED_MEM_ADDR);
}
+ acpi_dsdt_add_power_button(dsdt);
}
static void build_pci_device_aml(Aml *scope, LoongArchMachineState *lams)
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 49d2505..38ef7cc 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -316,6 +316,14 @@ static void virt_machine_done(Notifier *notifier, void *data)
loongarch_acpi_setup(lams);
}
+static void virt_powerdown_req(Notifier *notifier, void *opaque)
+{
+ LoongArchMachineState *s = container_of(notifier,
+ LoongArchMachineState, powerdown_notifier);
+
+ acpi_send_event(s->acpi_ged, ACPI_POWER_DOWN_STATUS);
+}
+
struct memmap_entry {
uint64_t address;
uint64_t length;
@@ -859,6 +867,10 @@ static void loongarch_init(MachineState *machine)
VIRT_PLATFORM_BUS_IRQ);
lams->machine_done.notify = virt_machine_done;
qemu_add_machine_init_done_notifier(&lams->machine_done);
+ /* connect powerdown request */
+ lams->powerdown_notifier.notify = virt_powerdown_req;
+ qemu_register_powerdown_notifier(&lams->powerdown_notifier);
+
fdt_add_pcie_node(lams);
/*
* Since lowmem region starts from 0 and Linux kernel legacy start address
diff --git a/include/hw/loongarch/virt.h b/include/hw/loongarch/virt.h
index f5f8188..7ae8a91 100644
--- a/include/hw/loongarch/virt.h
+++ b/include/hw/loongarch/virt.h
@@ -45,6 +45,7 @@ struct LoongArchMachineState {
/* State for other subsystems/APIs: */
FWCfgState *fw_cfg;
Notifier machine_done;
+ Notifier powerdown_notifier;
OnOffAuto acpi;
char *oem_id;
char *oem_table_id;