qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 09/11] ACPI: move PRST OperationRegion into SSDT


From: Igor Mammedov
Subject: Re: [Qemu-devel] [PATCH 09/11] ACPI: move PRST OperationRegion into SSDT
Date: Mon, 16 Dec 2013 21:38:19 +0100

On Mon, 16 Dec 2013 21:30:14 +0200
"Michael S. Tsirkin" <address@hidden> wrote:

> On Fri, Dec 13, 2013 at 05:22:14PM +0100, Igor Mammedov wrote:
> > .. and report range used by it to OSPM via _CRS.
> > PRST is needed in SSDT since its base will depend on
> > chipset and will be dynamically set by QEMU.
> > Also move PRSC() method along with PRST since cross
> > table reference to PRST doesn't work.
> 
> Could you clarify this last sentence?
> I don't mind where it is but I'd like to know
> where does the limitation come from.
It's empiric deduction so far I haven't found such limitation in spec yet.
iasl builds tables just fine but neither linux nor windows were able to find
Operation region from SSDT when loading DSDT, failing whole table loading
process. Decompiling DSDT/SSDT tables in guest shows that region is in
expected scope but OSPM refuses to see it when referenced outside SSDT.
Maybe there is some AML magic to make it work, I'm not aware of.
The same thing I had to do for memory hotplug as well. So I've tried to play
nicely 2 times and I have ended up with this solution both times.

> 
> > 
> > Signed-off-by: Igor Mammedov <address@hidden>
> > ---
> >  hw/i386/acpi-dsdt-cpu-hotplug.dsl | 39 +----------------------
> >  hw/i386/acpi-dsdt.dsl             |  2 +-
> >  hw/i386/q35-acpi-dsdt.dsl         |  2 +-
> >  hw/i386/ssdt-misc.dsl             | 65 
> > +++++++++++++++++++++++++++++++++++++++
> >  4 files changed, 68 insertions(+), 40 deletions(-)
> > 
> > diff --git a/hw/i386/acpi-dsdt-cpu-hotplug.dsl 
> > b/hw/i386/acpi-dsdt-cpu-hotplug.dsl
> > index 995b415..f26f81b 100644
> > --- a/hw/i386/acpi-dsdt-cpu-hotplug.dsl
> > +++ b/hw/i386/acpi-dsdt-cpu-hotplug.dsl
> > @@ -20,6 +20,7 @@
> >  Scope(\_SB) {
> >      /* Objects filled in by run-time generated SSDT */
> >      External(NTFY, MethodObj)
> > +    External(\_SB.CPHD.PRSC, MethodObj)
> >      External(CPON, PkgObj)
> >  
> >      /* Methods called by run-time generated SSDT Processor objects */
> > @@ -51,42 +52,4 @@ Scope(\_SB) {
> >          // _EJ0 method - eject callback
> >          Sleep(200)
> >      }
> > -
> > -    OperationRegion(PRST, SystemIO, 0xaf00, 32)
> > -    Field(PRST, ByteAcc, NoLock, Preserve) {
> > -        PRS, 256
> > -    }
> > -    Method(PRSC, 0) {
> > -        // Local5 = active cpu bitmap
> > -        Store(PRS, Local5)
> > -        // Local2 = last read byte from bitmap
> > -        Store(Zero, Local2)
> > -        // Local0 = Processor ID / APIC ID iterator
> > -        Store(Zero, Local0)
> > -        While (LLess(Local0, SizeOf(CPON))) {
> > -            // Local1 = CPON flag for this cpu
> > -            Store(DerefOf(Index(CPON, Local0)), Local1)
> > -            If (And(Local0, 0x07)) {
> > -                // Shift down previously read bitmap byte
> > -                ShiftRight(Local2, 1, Local2)
> > -            } Else {
> > -                // Read next byte from cpu bitmap
> > -                Store(DerefOf(Index(Local5, ShiftRight(Local0, 3))), 
> > Local2)
> > -            }
> > -            // Local3 = active state for this cpu
> > -            Store(And(Local2, 1), Local3)
> > -
> > -            If (LNotEqual(Local1, Local3)) {
> > -                // State change - update CPON with new state
> > -                Store(Local3, Index(CPON, Local0))
> > -                // Do CPU notify
> > -                If (LEqual(Local3, 1)) {
> > -                    NTFY(Local0, 1)
> > -                } Else {
> > -                    NTFY(Local0, 3)
> > -                }
> > -            }
> > -            Increment(Local0)
> > -        }
> > -    }
> >  }
> > diff --git a/hw/i386/acpi-dsdt.dsl b/hw/i386/acpi-dsdt.dsl
> > index 90efce0..fa9f2d4 100644
> > --- a/hw/i386/acpi-dsdt.dsl
> > +++ b/hw/i386/acpi-dsdt.dsl
> > @@ -311,7 +311,7 @@ DefinitionBlock (
> >          }
> >          Method(_E02) {
> >              // CPU hotplug event
> > -            \_SB.PRSC()
> > +            \_SB.CPHD.PRSC()
> >          }
> >          Method(_L03) {
> >          }
> > diff --git a/hw/i386/q35-acpi-dsdt.dsl b/hw/i386/q35-acpi-dsdt.dsl
> > index 22baa58..9ccc543 100644
> > --- a/hw/i386/q35-acpi-dsdt.dsl
> > +++ b/hw/i386/q35-acpi-dsdt.dsl
> > @@ -420,7 +420,7 @@ DefinitionBlock (
> >          }
> >          Method(_E02) {
> >              // CPU hotplug event
> > -            \_SB.PRSC()
> > +            \_SB.CPHD.PRSC()
> >          }
> >          Method(_L03) {
> >          }
> > diff --git a/hw/i386/ssdt-misc.dsl b/hw/i386/ssdt-misc.dsl
> > index a4484b8..ec8893c 100644
> > --- a/hw/i386/ssdt-misc.dsl
> > +++ b/hw/i386/ssdt-misc.dsl
> > @@ -116,4 +116,69 @@ DefinitionBlock ("ssdt-misc.aml", "SSDT", 0x01, 
> > "BXPC", "BXSSDTSUSP", 0x1)
> >              }
> >          }
> >      }
> > +    Scope(\_SB) {
> > +        External(NTFY, MethodObj)
> > +        External(CPON, PkgObj)
> > +
> > +        Device(CPHD) {
> > +            Name(_HID, EISAID("PNP0C08"))
> > +            Name(CPPL, 32) // cpu-gpe length
> > +            Name(CPHP, 0xaf00)
> > +
> > +            OperationRegion(PRST, SystemIO, CPHP, CPPL)
> > +            Field(PRST, ByteAcc, NoLock, Preserve) {
> > +                PRS, 256
> > +            }
> > +
> > +            Method(PRSC, 0) {
> > +                // Local5 = active cpu bitmap
> > +                Store(PRS, Local5)
> > +                // Local2 = last read byte from bitmap
> > +                Store(Zero, Local2)
> > +                // Local0 = Processor ID / APIC ID iterator
> > +                Store(Zero, Local0)
> > +                While (LLess(Local0, SizeOf(CPON))) {
> > +                    // Local1 = CPON flag for this cpu
> > +                    Store(DerefOf(Index(CPON, Local0)), Local1)
> > +                    If (And(Local0, 0x07)) {
> > +                        // Shift down previously read bitmap byte
> > +                        ShiftRight(Local2, 1, Local2)
> > +                    } Else {
> > +                        // Read next byte from cpu bitmap
> > +                        Store(DerefOf(Index(Local5, ShiftRight(Local0, 
> > 3))), Local2)
> > +                    }
> > +                    // Local3 = active state for this cpu
> > +                    Store(And(Local2, 1), Local3)
> > +
> > +                    If (LNotEqual(Local1, Local3)) {
> > +                        // State change - update CPON with new state
> > +                        Store(Local3, Index(CPON, Local0))
> > +                        // Do CPU notify
> > +                        If (LEqual(Local3, 1)) {
> > +                            NTFY(Local0, 1)
> > +                        } Else {
> > +                            NTFY(Local0, 3)
> > +                        }
> > +                    }
> > +                    Increment(Local0)
> > +                }
> > +            }
> > +
> > +            /* Leave bit 0 cleared to avoid Windows BSOD */
> > +            Name(_STA, 0xA)
> > +
> > +            Method(_CRS, 0) {
> > +                Store(ResourceTemplate() {
> > +                    IO(Decode16, 0x00, 0x00, 0x01, 0x15, IO)
> > +                }, Local0)
> > +
> > +                CreateWordField(Local0, IO._MIN, IOMN)
> > +                CreateWordField(Local0, IO._MAX, IOMX)
> > +
> > +                Store(CPHP, IOMN)
> > +                Subtract(Add(CPHP, CPPL), 1, IOMX)
> > +                Return(Local0)
> > +            }
> > +        } // Device(CPHD)
> > +    } // Scope(\_SB)
> >  }
> > -- 
> > 1.8.3.1


-- 
Regards,
  Igor



reply via email to

[Prev in Thread] Current Thread [Next in Thread]