From: Igor Mammedov <imammedo@redhat.com>
To: Jiaxun Yang <jiaxun.yang@flygoat.com>
Cc: qemu-devel@nongnu.org, Ani Sinha <anisinha@redhat.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
Song Gao <gaosong@loongson.cn>,
Paolo Bonzini <pbonzini@redhat.com>,
Richard Henderson <richard.henderson@linaro.org>,
Eduardo Habkost <eduardo@habkost.net>,
Marcel Apfelbaum <marcel.apfelbaum@gmail.com>,
Sergio Lopez <slp@redhat.com>
Subject: Re: [PATCH 1/3] acpi/ged: Implement S3 and S4 sleep
Date: Thu, 25 Jul 2024 10:22:15 +0200 [thread overview]
Message-ID: <20240725102215.4046ecc2@imammedo.users.ipa.redhat.com> (raw)
In-Reply-To: <20240613-loongarch64-sleep-v1-1-d2ef0aaa543a@flygoat.com>
On Thu, 13 Jun 2024 18:30:15 +0100
Jiaxun Yang <jiaxun.yang@flygoat.com> wrote:
> Implement S3 and S4 sleep with ACPI_GED_REG_SLEEP_CTL.SLP_TYP
> writes.
>
> Implement wakeup callback and WAK_STS register to inform guest
> about current states.
>
> All new functions are gated by "slp-typs" property, it is defaulted
> to S5 only and machines can opt-in for S3 and S4.
subject says S3 + S4 and don't mention S5
the same happens throughout the series, please fix it up
PS:
please reference relevant ACPI portions in the patch below,
so reader could easily find and understand what code does.
>
> Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
> ---
> hw/acpi/generic_event_device.c | 70 ++++++++++++++++++++++++++++++----
> include/hw/acpi/generic_event_device.h | 12 +++++-
> 2 files changed, 73 insertions(+), 9 deletions(-)
>
> diff --git a/hw/acpi/generic_event_device.c b/hw/acpi/generic_event_device.c
> index 2d6e91b124e5..f1fc99c04011 100644
> --- a/hw/acpi/generic_event_device.c
> +++ b/hw/acpi/generic_event_device.c
> @@ -11,6 +11,7 @@
>
> #include "qemu/osdep.h"
> #include "qapi/error.h"
> +#include "qapi/qapi-events-run-state.h"
> #include "hw/acpi/acpi.h"
> #include "hw/acpi/generic_event_device.h"
> #include "hw/irq.h"
> @@ -186,24 +187,53 @@ static const MemoryRegionOps ged_evt_ops = {
>
> static uint64_t ged_regs_read(void *opaque, hwaddr addr, unsigned size)
> {
> + GEDState *ged_st = opaque;
> +
> + switch (addr) {
> + case ACPI_GED_REG_SLEEP_STS:
> + return ged_st->sleep_sts;
> + default:
> + break;
> + }
> +
> return 0;
> }
>
> static void ged_regs_write(void *opaque, hwaddr addr, uint64_t data,
> unsigned int size)
> {
> - bool slp_en;
> - int slp_typ;
> + GEDState *ged_st = opaque;
> + AcpiGedState *s = container_of(ged_st, AcpiGedState, ged_state);
>
> switch (addr) {
> case ACPI_GED_REG_SLEEP_CTL:
> - slp_typ = (data >> 2) & 0x07;
> - slp_en = (data >> 5) & 0x01;
maybe use defines instead of magic numbers, it's also good to add
coments here referring to concrete chapter in APCI spec that describe
what these numbers are.
> - if (slp_en && slp_typ == 5) {
^^^
ditto
> - qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
> + if (data & ACPI_GED_SLP_EN) {
> + switch (extract8(data, 2, 3)) {
> + case ACPI_GED_SLP_TYP_S3:
> + if (s->slp_typs_bitmap & (1 << ACPI_GED_SLP_TYP_S3)) {
why not use existing helpers like test_bit()
the same applies to following bit checks
> + qemu_system_suspend_request();
> + }
> + break;
> + case ACPI_GED_SLP_TYP_S4:
> + if (s->slp_typs_bitmap & (1 << ACPI_GED_SLP_TYP_S4)) {
> + qapi_event_send_suspend_disk();
> + qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
> + }
> + break;
> + case ACPI_GED_SLP_TYP_S5:
> + if (s->slp_typs_bitmap & (1 << ACPI_GED_SLP_TYP_S5)) {
> + qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
> + }
> + break;
> + default:
> + break;
> + }
> }
> return;
> case ACPI_GED_REG_SLEEP_STS:
> + if (data & ACPI_GED_WAK_STS) {
> + ged_st->sleep_sts &= ~ACPI_GED_WAK_STS;
> + }
> return;
> case ACPI_GED_REG_RESET:
> if (data == ACPI_GED_RESET_VALUE) {
> @@ -223,6 +253,14 @@ static const MemoryRegionOps ged_regs_ops = {
> },
> };
>
> +static void acpi_ged_notify_wakeup(Notifier *notifier, void *data)
> +{
> + GEDState *ged_st = container_of(notifier, GEDState, wakeup);
> +
> + ged_st->sleep_sts |= ACPI_GED_WAK_STS;
describe somewhere workflow how it is supposed to work
(commit message or add ged specific doc in docs/specs/
as the 1st patch)
> +}
> +
> +
> static void acpi_ged_device_plug_cb(HotplugHandler *hotplug_dev,
> DeviceState *dev, Error **errp)
> {
> @@ -305,6 +343,8 @@ static void acpi_ged_send_event(AcpiDeviceIf *adev, AcpiEventStatusBits ev)
>
> static Property acpi_ged_properties[] = {
> DEFINE_PROP_UINT32("ged-event", AcpiGedState, ged_event_bitmap, 0),
> + DEFINE_PROP_UINT32("slp-typs", AcpiGedState, slp_typs_bitmap,
> + (1 << ACPI_GED_SLP_TYP_S5)),
I'd default to everything enabled, and use compat mechanism
to disable it on older machine types.
You have to do this as ged is also used by versioned arm/virt machine
> DEFINE_PROP_END_OF_LIST(),
> };
>
> @@ -320,10 +360,11 @@ static const VMStateDescription vmstate_memhp_state = {
>
> static const VMStateDescription vmstate_ged_state = {
> .name = "acpi-ged-state",
> - .version_id = 1,
> - .minimum_version_id = 1,
> + .version_id = 2,
> + .minimum_version_id = 2,
> .fields = (const VMStateField[]) {
> VMSTATE_UINT32(sel, GEDState),
> + VMSTATE_UINT8(sleep_sts, GEDState),
> VMSTATE_END_OF_LIST()
> }
> };
see for example
commit 829600a519386c7b188d5d813e78ba69bf0bd323
hpet: recover timer offset correctly
> @@ -371,6 +412,18 @@ static const VMStateDescription vmstate_acpi_ged = {
> }
> };
>
> +static void acpi_ged_realize(DeviceState *dev, Error **errp)
> +{
> + AcpiGedState *s = ACPI_GED(dev);
> + GEDState *ged_st = &s->ged_state;
> +
> + if (s->slp_typs_bitmap & (1 << ACPI_GED_SLP_TYP_S3)) {
> + ged_st->wakeup.notify = acpi_ged_notify_wakeup;
> + qemu_register_wakeup_notifier(&ged_st->wakeup);
> + qemu_register_wakeup_support();
> + }
> +}
> +
> static void acpi_ged_initfn(Object *obj)
> {
> DeviceState *dev = DEVICE(obj);
> @@ -409,6 +462,7 @@ static void acpi_ged_class_init(ObjectClass *class, void *data)
> AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_CLASS(class);
>
> dc->desc = "ACPI Generic Event Device";
> + dc->realize = acpi_ged_realize;
realize was added recently (currently in master),
please rebase on top of current master tree
> device_class_set_props(dc, acpi_ged_properties);
> dc->vmsd = &vmstate_acpi_ged;
>
> diff --git a/include/hw/acpi/generic_event_device.h b/include/hw/acpi/generic_event_device.h
> index ba84ce021477..1ea3cb848679 100644
> --- a/include/hw/acpi/generic_event_device.h
> +++ b/include/hw/acpi/generic_event_device.h
> @@ -80,9 +80,16 @@ OBJECT_DECLARE_SIMPLE_TYPE(AcpiGedState, ACPI_GED)
> /* ACPI_GED_REG_RESET value for reset*/
> #define ACPI_GED_RESET_VALUE 0x42
>
> -/* ACPI_GED_REG_SLEEP_CTL.SLP_TYP value for S5 (aka poweroff) */
> +/* ACPI_GED_REG_SLEEP_CTL.SLP_EN bit */
> +#define ACPI_GED_SLP_EN (1 << 5)
> +
> +/* ACPI_GED_REG_SLEEP_CTL.SLP_TYP values */
> +#define ACPI_GED_SLP_TYP_S3 0x03
> +#define ACPI_GED_SLP_TYP_S4 0x04
> #define ACPI_GED_SLP_TYP_S5 0x05
>
> +#define ACPI_GED_WAK_STS (1 << 7)
> +
> #define GED_DEVICE "GED"
> #define AML_GED_EVT_REG "EREG"
> #define AML_GED_EVT_SEL "ESEL"
> @@ -99,7 +106,9 @@ OBJECT_DECLARE_SIMPLE_TYPE(AcpiGedState, ACPI_GED)
> typedef struct GEDState {
> MemoryRegion evt;
> MemoryRegion regs;
> + Notifier wakeup;
> uint32_t sel;
> + uint8_t sleep_sts;
> } GEDState;
>
> struct AcpiGedState {
> @@ -108,6 +117,7 @@ struct AcpiGedState {
> MemoryRegion container_memhp;
> GEDState ged_state;
> uint32_t ged_event_bitmap;
> + uint32_t slp_typs_bitmap;
> qemu_irq irq;
> AcpiGhesState ghes_state;
> };
>
next prev parent reply other threads:[~2024-07-25 8:23 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-13 17:30 [PATCH 0/3] S3 and S4 sleep for loongarch/virt & microvm Jiaxun Yang
2024-06-13 17:30 ` [PATCH 1/3] acpi/ged: Implement S3 and S4 sleep Jiaxun Yang
2024-07-01 20:19 ` Michael S. Tsirkin
2024-07-25 8:22 ` Igor Mammedov [this message]
2024-07-25 8:30 ` Michael S. Tsirkin
2024-07-25 8:54 ` Igor Mammedov
2024-06-13 17:30 ` [PATCH 2/3] hw/loongarch/virt: Wire up " Jiaxun Yang
2024-07-25 8:26 ` Igor Mammedov
2024-06-13 17:30 ` [PATCH 3/3] hw/i386/microvm: " Jiaxun Yang
2024-06-14 3:32 ` [PATCH 0/3] S3 and S4 sleep for loongarch/virt & microvm maobibo
2024-06-14 4:27 ` Jiaxun Yang
2024-06-14 5:17 ` maobibo
2024-06-14 13:55 ` Jiaxun Yang
2024-06-14 14:03 ` Daniel P. Berrangé
2024-06-15 1:45 ` maobibo
2024-07-25 7:52 ` Igor Mammedov
2024-07-25 8:29 ` Igor Mammedov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240725102215.4046ecc2@imammedo.users.ipa.redhat.com \
--to=imammedo@redhat.com \
--cc=anisinha@redhat.com \
--cc=eduardo@habkost.net \
--cc=gaosong@loongson.cn \
--cc=jiaxun.yang@flygoat.com \
--cc=marcel.apfelbaum@gmail.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=slp@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.