All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Igor Mammedov <imammedo@redhat.com>
Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>,
	qemu-devel@nongnu.org, Ani Sinha <anisinha@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 04:30:42 -0400	[thread overview]
Message-ID: <20240725042431-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20240725102215.4046ecc2@imammedo.users.ipa.redhat.com>

On Thu, Jul 25, 2024 at 10:22:15AM +0200, Igor Mammedov wrote:
> 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.

In fact if you add comments you do not need defines.
One time use defines are a waste of time and hard to parse.

 slp_typ = (data >> 2 /* x Yz */ ) & 0x07 /* bits 0 to 3 */;

is clearer than

#define ACPI_S3_X_YZ 2
#define ACPI_S3_MASK 7

because that "x Yz" can match spec text *exactly*, you do
text search and you find where it is. With macros
you have to guess.

build_amd_iommu is a nice example I think.

> 
> > -        if (slp_en && slp_typ == 5) {
>                                     ^^^
> ditto

this is deleted code, isn't it?

> > -            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;
> >  };
> > 



  reply	other threads:[~2024-07-25  8:31 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
2024-07-25  8:30     ` Michael S. Tsirkin [this message]
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=20240725042431-mutt-send-email-mst@kernel.org \
    --to=mst@redhat.com \
    --cc=anisinha@redhat.com \
    --cc=eduardo@habkost.net \
    --cc=gaosong@loongson.cn \
    --cc=imammedo@redhat.com \
    --cc=jiaxun.yang@flygoat.com \
    --cc=marcel.apfelbaum@gmail.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.