From patchwork Sat Jun 21 00:59:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: liu.xuemei1@zte.com.cn X-Patchwork-Id: 2101062 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=patchwork.ozlabs.org) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4bPGH019t4z1ymW for ; Sat, 21 Jun 2025 11:00:26 +1000 (AEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uSmaL-0002VJ-F3; Fri, 20 Jun 2025 20:59:58 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uSmaI-0002SL-0k; Fri, 20 Jun 2025 20:59:54 -0400 Received: from mxct.zte.com.cn ([183.62.165.209]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uSmaE-00061S-E9; Fri, 20 Jun 2025 20:59:53 -0400 Received: from mse-fl2.zte.com.cn (unknown [10.5.228.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mxct.zte.com.cn (FangMail) with ESMTPS id 4bPGG01N32z51STR; Sat, 21 Jun 2025 08:59:36 +0800 (CST) Received: from xaxapp04.zte.com.cn ([10.99.98.157]) by mse-fl2.zte.com.cn with SMTP id 55L0xZ6R014155; Sat, 21 Jun 2025 08:59:35 +0800 (+08) (envelope-from liu.xuemei1@zte.com.cn) Received: from mapi (xaxapp02[null]) by mapi (Zmail) with MAPI id mid32; Sat, 21 Jun 2025 08:59:36 +0800 (CST) Date: Sat, 21 Jun 2025 08:59:36 +0800 (CST) X-Zmail-TransId: 2afa685603f8329-d97b4 X-Mailer: Zmail v1.0 Message-ID: <20250621085936463VQd8P_CrqoYtmrc-U5hJ9@zte.com.cn> Mime-Version: 1.0 From: To: , , , , , , , Cc: , Subject: =?utf-8?q?=5BPATCH_v3=5D_hw/riscv/virt=3A_Add_acpi_ged_and_powerdow?= =?utf-8?q?n_support?= X-MAIL: mse-fl2.zte.com.cn 55L0xZ6R014155 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 685603F8.001/4bPGG01N32z51STR Received-SPF: pass client-ip=183.62.165.209; envelope-from=liu.xuemei1@zte.com.cn; helo=mxct.zte.com.cn X-Spam_score_int: -41 X-Spam_score: -4.2 X-Spam_bar: ---- X-Spam_report: (-4.2 / 5.0 requ) BAYES_00=-1.9, CTE_8BIT_MISMATCH=0.001, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Xuemei Liu This adds powerdown support by implementing the ACPI GED. Signed-off-by: Xuemei Liu Co-authored-by: Björn Töpel --- Changes in v3: - Added missing param to virt_is_acpi_enabled - Fixed failure of bios-tables-test hw/riscv/Kconfig | 1 + hw/riscv/virt-acpi-build.c | 10 +++++++++ hw/riscv/virt.c | 35 ++++++++++++++++++++++++++++++ include/hw/riscv/virt.h | 4 ++++ tests/data/acpi/riscv64/virt/DSDT | Bin 3576 -> 3719 bytes 5 files changed, 50 insertions(+) diff --git a/tests/data/acpi/riscv64/virt/DSDT b/tests/data/acpi/riscv64/virt/DSDT index 6a33f5647ddd6de3a0f000f718b58f6fff44f0fd..b167a850026d392eaa6da85562c442945e238208 100644 GIT binary patch delta 170 zcmew%-7d@J66_Mv&d0#O@j-r!A|k+t}gK$@gANoypGNR zo(2Yn#ta3Krz!;_hT)U}ofGU|^_Zh;DEVa&>3mVGs}y;9`kxUBf~+3qYKN1pacpi_ged) { + build_ged_aml(scope, "\\_SB."GED_DEVICE, + HOTPLUG_HANDLER(s->acpi_ged), + ACPI_GED_IRQ, AML_SYSTEM_MEMORY, + s->memmap[VIRT_ACPI_GED].base); + } + + acpi_dsdt_add_power_button(scope); + aml_append(dsdt, scope); /* copy AML table into ACPI tables blob and patch header there */ diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index cf280a92e5..43b4ab0dc1 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -51,10 +51,12 @@ #include "system/kvm.h" #include "system/tpm.h" #include "system/qtest.h" +#include "system/runstate.h" #include "hw/pci/pci.h" #include "hw/pci-host/gpex.h" #include "hw/display/ramfb.h" #include "hw/acpi/aml-build.h" +#include "hw/acpi/generic_event_device.h" #include "qapi/qapi-visit-common.h" #include "hw/virtio/virtio-iommu.h" #include "hw/uefi/var-service-api.h" @@ -95,6 +97,7 @@ static const MemMapEntry virt_memmap[] = { [VIRT_UART0] = { 0x10000000, 0x100 }, [VIRT_VIRTIO] = { 0x10001000, 0x1000 }, [VIRT_FW_CFG] = { 0x10100000, 0x18 }, + [VIRT_ACPI_GED] = { 0x10101000, ACPI_GED_EVT_SEL_LEN }, [VIRT_FLASH] = { 0x20000000, 0x4000000 }, [VIRT_IMSIC_M] = { 0x24000000, VIRT_IMSIC_MAX_SIZE }, [VIRT_IMSIC_S] = { 0x28000000, VIRT_IMSIC_MAX_SIZE }, @@ -1272,6 +1275,22 @@ static inline DeviceState *gpex_pcie_init(MemoryRegion *sys_mem, return dev; } +static DeviceState *create_acpi_ged(RISCVVirtState *s, DeviceState *irqchip) +{ + DeviceState *dev; + uint32_t event = ACPI_GED_PWR_DOWN_EVT; + + dev = qdev_new(TYPE_ACPI_GED); + qdev_prop_set_uint32(dev, "ged-event", event); + sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); + + sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, s->memmap[VIRT_ACPI_GED].base); + sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, + qdev_get_gpio_in(irqchip, ACPI_GED_IRQ)); + + return dev; +} + static FWCfgState *create_fw_cfg(const MachineState *ms, hwaddr base) { FWCfgState *fw_cfg; @@ -1430,6 +1449,14 @@ static void virt_build_smbios(RISCVVirtState *s) } } +static void virt_powerdown_req(Notifier *notifier, void *opaque) +{ + RISCVVirtState *s; + + s = container_of(notifier, RISCVVirtState, powerdown_notifier); + acpi_send_event(s->acpi_ged, ACPI_POWER_DOWN_STATUS); +} + static void virt_machine_done(Notifier *notifier, void *data) { RISCVVirtState *s = container_of(notifier, RISCVVirtState, @@ -1703,6 +1730,11 @@ static void virt_machine_init(MachineState *machine) create_platform_bus(s, mmio_irqchip); + /* acpi ged */ + if (virt_is_acpi_enabled(s)) { + s->acpi_ged = create_acpi_ged(s, mmio_irqchip); + } + serial_mm_init(system_memory, s->memmap[VIRT_UART0].base, 0, qdev_get_gpio_in(mmio_irqchip, UART0_IRQ), 399193, serial_hd(0), DEVICE_LITTLE_ENDIAN); @@ -1744,6 +1776,9 @@ static void virt_machine_init(MachineState *machine) sysbus_realize_and_unref(SYS_BUS_DEVICE(iommu_sys), &error_fatal); } + s->powerdown_notifier.notify = virt_powerdown_req; + qemu_register_powerdown_notifier(&s->powerdown_notifier); + s->machine_done.notify = virt_machine_done; qemu_add_machine_init_done_notifier(&s->machine_done); } diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h index 7b4c2c8b7d..9422b45d0c 100644 --- a/include/hw/riscv/virt.h +++ b/include/hw/riscv/virt.h @@ -47,6 +47,8 @@ struct RISCVVirtState { /*< public >*/ Notifier machine_done; + Notifier powerdown_notifier; + DeviceState *acpi_ged; DeviceState *platform_bus_dev; RISCVHartArrayState soc[VIRT_SOCKETS_MAX]; DeviceState *irqchip[VIRT_SOCKETS_MAX]; @@ -88,9 +90,11 @@ enum { VIRT_PLATFORM_BUS, VIRT_PCIE_ECAM, VIRT_IOMMU_SYS, + VIRT_ACPI_GED, }; enum { + ACPI_GED_IRQ = 9, UART0_IRQ = 10, RTC_IRQ = 11, VIRTIO_IRQ = 1, /* 1 to 8 */