On Mon, Jun 26, 2023 at 03:20:09PM +0200, Igor Mammedov wrote:
> On Mon, 26 Jun 2023 08:29:19 -0400
> "Michael S. Tsirkin" <m...@redhat.com> wrote:
> 
> > From: BALATON Zoltan <bala...@eik.bme.hu>
> > 
> > On pegasos2 which has ACPI as part of VT8231 south bridge the board
> > firmware writes PM control register by accessing the second byte so
> > addr will be 1. This wasn't handled correctly and the write went to
> > addr 0 instead. Remove the acpi_pm1_cnt_write() function which is used
> > only once and does not take addr into account and handle non-zero
> > address in acpi_pm_cnt_{read|write}. This fixes ACPI shutdown with
> > pegasos2 firmware.
> > 
> > The issue below is possibly related to the same memory core bug.
> > 
> > Link: https://gitlab.com/qemu-project/qemu/-/issues/360
> > Signed-off-by: BALATON Zoltan <bala...@eik.bme.hu>
> > Message-Id: <20230607200125.a9988746...@zero.eik.bme.hu>
> > Reviewed-by: Michael S. Tsirkin <m...@redhat.com>
> > Signed-off-by: Michael S. Tsirkin <m...@redhat.com>
> 
> Somewhere you lost mine
> Reviewed-by: Igor Mammedov <imamm...@redhat.com>

You are right, sorry. fixed now.


> > ---
> >  hw/acpi/core.c | 56 +++++++++++++++++++++++++-------------------------
> >  1 file changed, 28 insertions(+), 28 deletions(-)
> > 
> > diff --git a/hw/acpi/core.c b/hw/acpi/core.c
> > index 6da275c599..00b1e79a30 100644
> > --- a/hw/acpi/core.c
> > +++ b/hw/acpi/core.c
> > @@ -551,8 +551,35 @@ void acpi_pm_tmr_reset(ACPIREGS *ar)
> >  }
> >  
> >  /* ACPI PM1aCNT */
> > -static void acpi_pm1_cnt_write(ACPIREGS *ar, uint16_t val)
> > +void acpi_pm1_cnt_update(ACPIREGS *ar,
> > +                         bool sci_enable, bool sci_disable)
> >  {
> > +    /* ACPI specs 3.0, 4.7.2.5 */
> > +    if (ar->pm1.cnt.acpi_only) {
> > +        return;
> > +    }
> > +
> > +    if (sci_enable) {
> > +        ar->pm1.cnt.cnt |= ACPI_BITMASK_SCI_ENABLE;
> > +    } else if (sci_disable) {
> > +        ar->pm1.cnt.cnt &= ~ACPI_BITMASK_SCI_ENABLE;
> > +    }
> > +}
> > +
> > +static uint64_t acpi_pm_cnt_read(void *opaque, hwaddr addr, unsigned width)
> > +{
> > +    ACPIREGS *ar = opaque;
> > +    return ar->pm1.cnt.cnt >> addr * 8;
> > +}
> > +
> > +static void acpi_pm_cnt_write(void *opaque, hwaddr addr, uint64_t val,
> > +                              unsigned width)
> > +{
> > +    ACPIREGS *ar = opaque;
> > +
> > +    if (addr == 1) {
> > +        val = val << 8 | (ar->pm1.cnt.cnt & 0xff);
> > +    }
> >      ar->pm1.cnt.cnt = val & ~(ACPI_BITMASK_SLEEP_ENABLE);
> >  
> >      if (val & ACPI_BITMASK_SLEEP_ENABLE) {
> > @@ -575,33 +602,6 @@ static void acpi_pm1_cnt_write(ACPIREGS *ar, uint16_t 
> > val)
> >      }
> >  }
> >  
> > -void acpi_pm1_cnt_update(ACPIREGS *ar,
> > -                         bool sci_enable, bool sci_disable)
> > -{
> > -    /* ACPI specs 3.0, 4.7.2.5 */
> > -    if (ar->pm1.cnt.acpi_only) {
> > -        return;
> > -    }
> > -
> > -    if (sci_enable) {
> > -        ar->pm1.cnt.cnt |= ACPI_BITMASK_SCI_ENABLE;
> > -    } else if (sci_disable) {
> > -        ar->pm1.cnt.cnt &= ~ACPI_BITMASK_SCI_ENABLE;
> > -    }
> > -}
> > -
> > -static uint64_t acpi_pm_cnt_read(void *opaque, hwaddr addr, unsigned width)
> > -{
> > -    ACPIREGS *ar = opaque;
> > -    return ar->pm1.cnt.cnt;
> > -}
> > -
> > -static void acpi_pm_cnt_write(void *opaque, hwaddr addr, uint64_t val,
> > -                              unsigned width)
> > -{
> > -    acpi_pm1_cnt_write(opaque, val);
> > -}
> > -
> >  static const MemoryRegionOps acpi_pm_cnt_ops = {
> >      .read = acpi_pm_cnt_read,
> >      .write = acpi_pm_cnt_write,


Reply via email to