On Wed, Dec 24, 2014 at 05:07:38PM +0100, Paolo Bonzini wrote: > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com>
This isn't a dependency of patches 5 and on, is it? > --- > hw/i386/acpi-dsdt-common.dsl | 345 > +++++++++++++++++++++++++++++++++++++- > hw/i386/acpi-dsdt-dbug.dsl | 41 ----- > hw/i386/acpi-dsdt-hpet.dsl | 48 ------ > hw/i386/acpi-dsdt-isa.dsl | 132 --------------- > hw/i386/acpi-dsdt-mem-hotplug.dsl | 176 ------------------- > 5 files changed, 341 insertions(+), 401 deletions(-) > delete mode 100644 hw/i386/acpi-dsdt-dbug.dsl > delete mode 100644 hw/i386/acpi-dsdt-hpet.dsl > delete mode 100644 hw/i386/acpi-dsdt-isa.dsl > delete mode 100644 hw/i386/acpi-dsdt-mem-hotplug.dsl > > diff --git a/hw/i386/acpi-dsdt-common.dsl b/hw/i386/acpi-dsdt-common.dsl > index 1929f8f..19e9753 100644 > --- a/hw/i386/acpi-dsdt-common.dsl > +++ b/hw/i386/acpi-dsdt-common.dsl > @@ -24,10 +24,347 @@ DefinitionBlock ("acpi-dsdt-common.aml", "SSDT", 0x01, > "BXPC", "BXSSDTCOMM", 0x1 > External(\_SB.PCI0.PCI, DeviceObj) > > #include "hw/acpi/pc-hotplug.h" > -#include "acpi-dsdt-dbug.dsl" > -#include "acpi-dsdt-hpet.dsl" > -#include "acpi-dsdt-isa.dsl" > -#include "acpi-dsdt-mem-hotplug.dsl" > + > +/**************************************************************** > + * Debugging > + ****************************************************************/ > + > + Scope(\) { > + /* Debug Output */ > + OperationRegion(DBG, SystemIO, 0x0402, 0x01) > + Field(DBG, ByteAcc, NoLock, Preserve) { > + DBGB, 8, > + } > + > + /* Debug method - use this method to send output to the QEMU > + * BIOS debug port. This method handles strings, integers, > + * and buffers. For example: DBUG("abc") DBUG(0x123) */ > + Method(DBUG, 1) { > + ToHexString(Arg0, Local0) > + ToBuffer(Local0, Local0) > + Subtract(SizeOf(Local0), 1, Local1) > + Store(Zero, Local2) > + While (LLess(Local2, Local1)) { > + Store(DerefOf(Index(Local0, Local2)), DBGB) > + Increment(Local2) > + } > + Store(0x0A, DBGB) > + } > + } > + > + /**************************************************************** > + * HPET > + ****************************************************************/ > + > + Scope(\_SB) { > + Device(HPET) { > + Name(_HID, EISAID("PNP0103")) > + Name(_UID, 0) > + OperationRegion(HPTM, SystemMemory, 0xFED00000, 0x400) > + Field(HPTM, DWordAcc, Lock, Preserve) { > + VEND, 32, > + PRD, 32, > + } > + Method(_STA, 0, NotSerialized) { > + Store(VEND, Local0) > + Store(PRD, Local1) > + ShiftRight(Local0, 16, Local0) > + If (LOr(LEqual(Local0, 0), LEqual(Local0, 0xffff))) { > + Return (0x0) > + } > + If (LOr(LEqual(Local1, 0), LGreater(Local1, 100000000))) { > + Return (0x0) > + } > + Return (0x0F) > + } > + Name(_CRS, ResourceTemplate() { > + Memory32Fixed(ReadOnly, > + 0xFED00000, // Address Base > + 0x00000400, // Address Length > + ) > + }) > + } > + } > + > + /* Common legacy ISA style devices. */ > + Scope(\_SB.PCI0.ISA) { > + > + Device (SMC) { > + Name(_HID, EisaId("APP0001")) > + /* _STA will be patched to 0x0B if AppleSMC is present */ > + ACPI_EXTRACT_NAME_BYTE_CONST dsdt_applesmc_sta > + Name(_STA, 0xF0) > + Name(_CRS, ResourceTemplate () { > + IO (Decode16, 0x0300, 0x0300, 0x01, 0x20) > + IRQNoFlags() { 6 } > + }) > + } > + > + Device(RTC) { > + Name(_HID, EisaId("PNP0B00")) > + Name(_CRS, ResourceTemplate() { > + IO(Decode16, 0x0070, 0x0070, 0x10, 0x02) > + IRQNoFlags() { 8 } > + IO(Decode16, 0x0072, 0x0072, 0x02, 0x06) > + }) > + } > + > + Device(KBD) { > + Name(_HID, EisaId("PNP0303")) > + Method(_STA, 0, NotSerialized) { > + Return (0x0f) > + } > + Name(_CRS, ResourceTemplate() { > + IO(Decode16, 0x0060, 0x0060, 0x01, 0x01) > + IO(Decode16, 0x0064, 0x0064, 0x01, 0x01) > + IRQNoFlags() { 1 } > + }) > + } > + > + Device(MOU) { > + Name(_HID, EisaId("PNP0F13")) > + Method(_STA, 0, NotSerialized) { > + Return (0x0f) > + } > + Name(_CRS, ResourceTemplate() { > + IRQNoFlags() { 12 } > + }) > + } > + > + External(FDEN) > + Device(FDC0) { > + Name(_HID, EisaId("PNP0700")) > + Method(_STA, 0, NotSerialized) { > + Store(FDEN, Local0) > + If (LEqual(Local0, 0)) { > + Return (0x00) > + } Else { > + Return (0x0F) > + } > + } > + Name(_CRS, ResourceTemplate() { > + IO(Decode16, 0x03F2, 0x03F2, 0x00, 0x04) > + IO(Decode16, 0x03F7, 0x03F7, 0x00, 0x01) > + IRQNoFlags() { 6 } > + DMA(Compatibility, NotBusMaster, Transfer8) { 2 } > + }) > + } > + > + External(LPEN) > + Device(LPT) { > + Name(_HID, EisaId("PNP0400")) > + Method(_STA, 0, NotSerialized) { > + Store(LPEN, Local0) > + If (LEqual(Local0, 0)) { > + Return (0x00) > + } Else { > + Return (0x0F) > + } > + } > + Name(_CRS, ResourceTemplate() { > + IO(Decode16, 0x0378, 0x0378, 0x08, 0x08) > + IRQNoFlags() { 7 } > + }) > + } > + > + External(CAEN) > + Device(COM1) { > + Name(_HID, EisaId("PNP0501")) > + Name(_UID, 0x01) > + Method(_STA, 0, NotSerialized) { > + Store(CAEN, Local0) > + If (LEqual(Local0, 0)) { > + Return (0x00) > + } Else { > + Return (0x0F) > + } > + } > + Name(_CRS, ResourceTemplate() { > + IO(Decode16, 0x03F8, 0x03F8, 0x00, 0x08) > + IRQNoFlags() { 4 } > + }) > + } > + > + External(CBEN) > + Device(COM2) { > + Name(_HID, EisaId("PNP0501")) > + Name(_UID, 0x02) > + Method(_STA, 0, NotSerialized) { > + Store(CBEN, Local0) > + If (LEqual(Local0, 0)) { > + Return (0x00) > + } Else { > + Return (0x0F) > + } > + } > + Name(_CRS, ResourceTemplate() { > + IO(Decode16, 0x02F8, 0x02F8, 0x00, 0x08) > + IRQNoFlags() { 3 } > + }) > + } > + } > + > + External(MEMORY_SLOT_NOTIFY_METHOD, MethodObj) > + > + Scope(\_SB.PCI0) { > + Device(MEMORY_HOTPLUG_DEVICE) { > + Name(_HID, "PNP0A06") > + Name(_UID, "Memory hotplug resources") > + External(MEMORY_SLOTS_NUMBER, IntObj) > + > + /* Memory hotplug IO registers */ > + OperationRegion(MEMORY_HOTPLUG_IO_REGION, SystemIO, > + ACPI_MEMORY_HOTPLUG_BASE, > + ACPI_MEMORY_HOTPLUG_IO_LEN) > + > + Name(_CRS, ResourceTemplate() { > + IO(Decode16, ACPI_MEMORY_HOTPLUG_BASE, > ACPI_MEMORY_HOTPLUG_BASE, > + 0, ACPI_MEMORY_HOTPLUG_IO_LEN, IO) > + }) > + > + Method(_STA, 0) { > + If (LEqual(MEMORY_SLOTS_NUMBER, Zero)) { > + Return(0x0) > + } > + /* present, functioning, decoding, not shown in UI */ > + Return(0xB) > + } > + > + Field(MEMORY_HOTPLUG_IO_REGION, DWordAcc, NoLock, Preserve) { > + MEMORY_SLOT_ADDR_LOW, 32, // read only > + MEMORY_SLOT_ADDR_HIGH, 32, // read only > + MEMORY_SLOT_SIZE_LOW, 32, // read only > + MEMORY_SLOT_SIZE_HIGH, 32, // read only > + MEMORY_SLOT_PROXIMITY, 32, // read only > + } > + Field(MEMORY_HOTPLUG_IO_REGION, ByteAcc, NoLock, Preserve) { > + Offset(20), > + MEMORY_SLOT_ENABLED, 1, // 1 if enabled, read only > + MEMORY_SLOT_INSERT_EVENT, 1, // (read) 1 if has a insert > event. (write) 1 to clear event > + } > + > + Mutex (MEMORY_SLOT_LOCK, 0) > + Field (MEMORY_HOTPLUG_IO_REGION, DWordAcc, NoLock, Preserve) { > + MEMORY_SLOT_SLECTOR, 32, // DIMM selector, write only > + MEMORY_SLOT_OST_EVENT, 32, // _OST event code, write only > + MEMORY_SLOT_OST_STATUS, 32, // _OST status code, write only > + } > + > + Method(MEMORY_SLOT_SCAN_METHOD, 0) { > + If (LEqual(MEMORY_SLOTS_NUMBER, Zero)) { > + Return(Zero) > + } > + > + Store(Zero, Local0) // Mem devs iterrator > + Acquire(MEMORY_SLOT_LOCK, 0xFFFF) > + while (LLess(Local0, MEMORY_SLOTS_NUMBER)) { > + Store(Local0, MEMORY_SLOT_SLECTOR) // select Local0 DIMM > + If (LEqual(MEMORY_SLOT_INSERT_EVENT, One)) { // Memory > device needs check > + MEMORY_SLOT_NOTIFY_METHOD(Local0, 1) > + Store(1, MEMORY_SLOT_INSERT_EVENT) > + } > + // TODO: handle memory eject request > + Add(Local0, One, Local0) // goto next DIMM > + } > + Release(MEMORY_SLOT_LOCK) > + Return(One) > + } > + > + Method(MEMORY_SLOT_STATUS_METHOD, 1) { > + Store(Zero, Local0) > + > + Acquire(MEMORY_SLOT_LOCK, 0xFFFF) > + Store(ToInteger(Arg0), MEMORY_SLOT_SLECTOR) // select DIMM > + > + If (LEqual(MEMORY_SLOT_ENABLED, One)) { > + Store(0xF, Local0) > + } > + > + Release(MEMORY_SLOT_LOCK) > + Return(Local0) > + } > + > + Method(MEMORY_SLOT_CRS_METHOD, 1, Serialized) { > + Acquire(MEMORY_SLOT_LOCK, 0xFFFF) > + Store(ToInteger(Arg0), MEMORY_SLOT_SLECTOR) // select DIMM > + > + Name(MR64, ResourceTemplate() { > + QWordMemory(ResourceProducer, PosDecode, MinFixed, > MaxFixed, > + Cacheable, ReadWrite, > + 0x0000000000000000, // Address Space Granularity > + 0x0000000000000000, // Address Range Minimum > + 0xFFFFFFFFFFFFFFFE, // Address Range Maximum > + 0x0000000000000000, // Address Translation Offset > + 0xFFFFFFFFFFFFFFFF, // Address Length > + ,, MW64, AddressRangeMemory, TypeStatic) > + }) > + > + CreateDWordField(MR64, 14, MINL) > + CreateDWordField(MR64, 18, MINH) > + CreateDWordField(MR64, 38, LENL) > + CreateDWordField(MR64, 42, LENH) > + CreateDWordField(MR64, 22, MAXL) > + CreateDWordField(MR64, 26, MAXH) > + > + Store(MEMORY_SLOT_ADDR_HIGH, MINH) > + Store(MEMORY_SLOT_ADDR_LOW, MINL) > + Store(MEMORY_SLOT_SIZE_HIGH, LENH) > + Store(MEMORY_SLOT_SIZE_LOW, LENL) > + > + // 64-bit math: MAX = MIN + LEN - 1 > + Add(MINL, LENL, MAXL) > + Add(MINH, LENH, MAXH) > + If (LLess(MAXL, MINL)) { > + Add(MAXH, One, MAXH) > + } > + If (LLess(MAXL, One)) { > + Subtract(MAXH, One, MAXH) > + } > + Subtract(MAXL, One, MAXL) > + > + If (LEqual(MAXH, Zero)){ > + Name(MR32, ResourceTemplate() { > + DWordMemory(ResourceProducer, PosDecode, MinFixed, > MaxFixed, > + Cacheable, ReadWrite, > + 0x00000000, // Address Space Granularity > + 0x00000000, // Address Range Minimum > + 0xFFFFFFFE, // Address Range Maximum > + 0x00000000, // Address Translation Offset > + 0xFFFFFFFF, // Address Length > + ,, MW32, AddressRangeMemory, TypeStatic) > + }) > + CreateDWordField(MR32, MW32._MIN, MIN) > + CreateDWordField(MR32, MW32._MAX, MAX) > + CreateDWordField(MR32, MW32._LEN, LEN) > + Store(MINL, MIN) > + Store(MAXL, MAX) > + Store(LENL, LEN) > + > + Release(MEMORY_SLOT_LOCK) > + Return(MR32) > + } > + > + Release(MEMORY_SLOT_LOCK) > + Return(MR64) > + } > + > + Method(MEMORY_SLOT_PROXIMITY_METHOD, 1) { > + Acquire(MEMORY_SLOT_LOCK, 0xFFFF) > + Store(ToInteger(Arg0), MEMORY_SLOT_SLECTOR) // select DIMM > + Store(MEMORY_SLOT_PROXIMITY, Local0) > + Release(MEMORY_SLOT_LOCK) > + Return(Local0) > + } > + > + Method(MEMORY_SLOT_OST_METHOD, 4) { > + Acquire(MEMORY_SLOT_LOCK, 0xFFFF) > + Store(ToInteger(Arg0), MEMORY_SLOT_SLECTOR) // select DIMM > + Store(Arg1, MEMORY_SLOT_OST_EVENT) > + Store(Arg2, MEMORY_SLOT_OST_STATUS) > + Release(MEMORY_SLOT_LOCK) > + } > + } // Device() > + } // Scope() > > > /**************************************************************** > diff --git a/hw/i386/acpi-dsdt-dbug.dsl b/hw/i386/acpi-dsdt-dbug.dsl > deleted file mode 100644 > index 86230f7..0000000 > --- a/hw/i386/acpi-dsdt-dbug.dsl > +++ /dev/null > @@ -1,41 +0,0 @@ > -/* > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License as published by > - * the Free Software Foundation; either version 2 of the License, or > - * (at your option) any later version. > - > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - * GNU General Public License for more details. > - > - * You should have received a copy of the GNU General Public License along > - * with this program; if not, see <http://www.gnu.org/licenses/>. > - */ > - > -/**************************************************************** > - * Debugging > - ****************************************************************/ > - > -Scope(\) { > - /* Debug Output */ > - OperationRegion(DBG, SystemIO, 0x0402, 0x01) > - Field(DBG, ByteAcc, NoLock, Preserve) { > - DBGB, 8, > - } > - > - /* Debug method - use this method to send output to the QEMU > - * BIOS debug port. This method handles strings, integers, > - * and buffers. For example: DBUG("abc") DBUG(0x123) */ > - Method(DBUG, 1) { > - ToHexString(Arg0, Local0) > - ToBuffer(Local0, Local0) > - Subtract(SizeOf(Local0), 1, Local1) > - Store(Zero, Local2) > - While (LLess(Local2, Local1)) { > - Store(DerefOf(Index(Local0, Local2)), DBGB) > - Increment(Local2) > - } > - Store(0x0A, DBGB) > - } > -} > diff --git a/hw/i386/acpi-dsdt-hpet.dsl b/hw/i386/acpi-dsdt-hpet.dsl > deleted file mode 100644 > index 44961b8..0000000 > --- a/hw/i386/acpi-dsdt-hpet.dsl > +++ /dev/null > @@ -1,48 +0,0 @@ > -/* > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License as published by > - * the Free Software Foundation; either version 2 of the License, or > - * (at your option) any later version. > - > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - * GNU General Public License for more details. > - > - * You should have received a copy of the GNU General Public License along > - * with this program; if not, see <http://www.gnu.org/licenses/>. > - */ > - > -/**************************************************************** > - * HPET > - ****************************************************************/ > - > -Scope(\_SB) { > - Device(HPET) { > - Name(_HID, EISAID("PNP0103")) > - Name(_UID, 0) > - OperationRegion(HPTM, SystemMemory, 0xFED00000, 0x400) > - Field(HPTM, DWordAcc, Lock, Preserve) { > - VEND, 32, > - PRD, 32, > - } > - Method(_STA, 0, NotSerialized) { > - Store(VEND, Local0) > - Store(PRD, Local1) > - ShiftRight(Local0, 16, Local0) > - If (LOr(LEqual(Local0, 0), LEqual(Local0, 0xffff))) { > - Return (0x0) > - } > - If (LOr(LEqual(Local1, 0), LGreater(Local1, 100000000))) { > - Return (0x0) > - } > - Return (0x0F) > - } > - Name(_CRS, ResourceTemplate() { > - Memory32Fixed(ReadOnly, > - 0xFED00000, // Address Base > - 0x00000400, // Address Length > - ) > - }) > - } > -} > diff --git a/hw/i386/acpi-dsdt-isa.dsl b/hw/i386/acpi-dsdt-isa.dsl > deleted file mode 100644 > index a8851b0..0000000 > --- a/hw/i386/acpi-dsdt-isa.dsl > +++ /dev/null > @@ -1,132 +0,0 @@ > -/* > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License as published by > - * the Free Software Foundation; either version 2 of the License, or > - * (at your option) any later version. > - > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - * GNU General Public License for more details. > - > - * You should have received a copy of the GNU General Public License along > - * with this program; if not, see <http://www.gnu.org/licenses/>. > - */ > - > -/* Common legacy ISA style devices. */ > -Scope(\_SB.PCI0.ISA) { > - > - Device (SMC) { > - Name(_HID, EisaId("APP0001")) > - /* _STA will be patched to 0x0B if AppleSMC is present */ > - ACPI_EXTRACT_NAME_BYTE_CONST dsdt_applesmc_sta > - Name(_STA, 0xF0) > - Name(_CRS, ResourceTemplate () { > - IO (Decode16, 0x0300, 0x0300, 0x01, 0x20) > - IRQNoFlags() { 6 } > - }) > - } > - > - Device(RTC) { > - Name(_HID, EisaId("PNP0B00")) > - Name(_CRS, ResourceTemplate() { > - IO(Decode16, 0x0070, 0x0070, 0x10, 0x02) > - IRQNoFlags() { 8 } > - IO(Decode16, 0x0072, 0x0072, 0x02, 0x06) > - }) > - } > - > - Device(KBD) { > - Name(_HID, EisaId("PNP0303")) > - Method(_STA, 0, NotSerialized) { > - Return (0x0f) > - } > - Name(_CRS, ResourceTemplate() { > - IO(Decode16, 0x0060, 0x0060, 0x01, 0x01) > - IO(Decode16, 0x0064, 0x0064, 0x01, 0x01) > - IRQNoFlags() { 1 } > - }) > - } > - > - Device(MOU) { > - Name(_HID, EisaId("PNP0F13")) > - Method(_STA, 0, NotSerialized) { > - Return (0x0f) > - } > - Name(_CRS, ResourceTemplate() { > - IRQNoFlags() { 12 } > - }) > - } > - > - External(FDEN) > - Device(FDC0) { > - Name(_HID, EisaId("PNP0700")) > - Method(_STA, 0, NotSerialized) { > - Store(FDEN, Local0) > - If (LEqual(Local0, 0)) { > - Return (0x00) > - } Else { > - Return (0x0F) > - } > - } > - Name(_CRS, ResourceTemplate() { > - IO(Decode16, 0x03F2, 0x03F2, 0x00, 0x04) > - IO(Decode16, 0x03F7, 0x03F7, 0x00, 0x01) > - IRQNoFlags() { 6 } > - DMA(Compatibility, NotBusMaster, Transfer8) { 2 } > - }) > - } > - > - External(LPEN) > - Device(LPT) { > - Name(_HID, EisaId("PNP0400")) > - Method(_STA, 0, NotSerialized) { > - Store(LPEN, Local0) > - If (LEqual(Local0, 0)) { > - Return (0x00) > - } Else { > - Return (0x0F) > - } > - } > - Name(_CRS, ResourceTemplate() { > - IO(Decode16, 0x0378, 0x0378, 0x08, 0x08) > - IRQNoFlags() { 7 } > - }) > - } > - > - External(CAEN) > - Device(COM1) { > - Name(_HID, EisaId("PNP0501")) > - Name(_UID, 0x01) > - Method(_STA, 0, NotSerialized) { > - Store(CAEN, Local0) > - If (LEqual(Local0, 0)) { > - Return (0x00) > - } Else { > - Return (0x0F) > - } > - } > - Name(_CRS, ResourceTemplate() { > - IO(Decode16, 0x03F8, 0x03F8, 0x00, 0x08) > - IRQNoFlags() { 4 } > - }) > - } > - > - External(CBEN) > - Device(COM2) { > - Name(_HID, EisaId("PNP0501")) > - Name(_UID, 0x02) > - Method(_STA, 0, NotSerialized) { > - Store(CBEN, Local0) > - If (LEqual(Local0, 0)) { > - Return (0x00) > - } Else { > - Return (0x0F) > - } > - } > - Name(_CRS, ResourceTemplate() { > - IO(Decode16, 0x02F8, 0x02F8, 0x00, 0x08) > - IRQNoFlags() { 3 } > - }) > - } > -} > diff --git a/hw/i386/acpi-dsdt-mem-hotplug.dsl > b/hw/i386/acpi-dsdt-mem-hotplug.dsl > deleted file mode 100644 > index 2a36c47..0000000 > --- a/hw/i386/acpi-dsdt-mem-hotplug.dsl > +++ /dev/null > @@ -1,176 +0,0 @@ > -/* > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License as published by > - * the Free Software Foundation; either version 2 of the License, or > - * (at your option) any later version. > - > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - * GNU General Public License for more details. > - > - * You should have received a copy of the GNU General Public License along > - * with this program; if not, see <http://www.gnu.org/licenses/>. > - */ > - > - External(MEMORY_SLOT_NOTIFY_METHOD, MethodObj) > - > - Scope(\_SB.PCI0) { > - Device(MEMORY_HOTPLUG_DEVICE) { > - Name(_HID, "PNP0A06") > - Name(_UID, "Memory hotplug resources") > - External(MEMORY_SLOTS_NUMBER, IntObj) > - > - /* Memory hotplug IO registers */ > - OperationRegion(MEMORY_HOTPLUG_IO_REGION, SystemIO, > - ACPI_MEMORY_HOTPLUG_BASE, > - ACPI_MEMORY_HOTPLUG_IO_LEN) > - > - Name(_CRS, ResourceTemplate() { > - IO(Decode16, ACPI_MEMORY_HOTPLUG_BASE, > ACPI_MEMORY_HOTPLUG_BASE, > - 0, ACPI_MEMORY_HOTPLUG_IO_LEN, IO) > - }) > - > - Method(_STA, 0) { > - If (LEqual(MEMORY_SLOTS_NUMBER, Zero)) { > - Return(0x0) > - } > - /* present, functioning, decoding, not shown in UI */ > - Return(0xB) > - } > - > - Field(MEMORY_HOTPLUG_IO_REGION, DWordAcc, NoLock, Preserve) { > - MEMORY_SLOT_ADDR_LOW, 32, // read only > - MEMORY_SLOT_ADDR_HIGH, 32, // read only > - MEMORY_SLOT_SIZE_LOW, 32, // read only > - MEMORY_SLOT_SIZE_HIGH, 32, // read only > - MEMORY_SLOT_PROXIMITY, 32, // read only > - } > - Field(MEMORY_HOTPLUG_IO_REGION, ByteAcc, NoLock, Preserve) { > - Offset(20), > - MEMORY_SLOT_ENABLED, 1, // 1 if enabled, read only > - MEMORY_SLOT_INSERT_EVENT, 1, // (read) 1 if has a insert > event. (write) 1 to clear event > - } > - > - Mutex (MEMORY_SLOT_LOCK, 0) > - Field (MEMORY_HOTPLUG_IO_REGION, DWordAcc, NoLock, Preserve) { > - MEMORY_SLOT_SLECTOR, 32, // DIMM selector, write only > - MEMORY_SLOT_OST_EVENT, 32, // _OST event code, write only > - MEMORY_SLOT_OST_STATUS, 32, // _OST status code, write only > - } > - > - Method(MEMORY_SLOT_SCAN_METHOD, 0) { > - If (LEqual(MEMORY_SLOTS_NUMBER, Zero)) { > - Return(Zero) > - } > - > - Store(Zero, Local0) // Mem devs iterrator > - Acquire(MEMORY_SLOT_LOCK, 0xFFFF) > - while (LLess(Local0, MEMORY_SLOTS_NUMBER)) { > - Store(Local0, MEMORY_SLOT_SLECTOR) // select Local0 DIMM > - If (LEqual(MEMORY_SLOT_INSERT_EVENT, One)) { // Memory > device needs check > - MEMORY_SLOT_NOTIFY_METHOD(Local0, 1) > - Store(1, MEMORY_SLOT_INSERT_EVENT) > - } > - // TODO: handle memory eject request > - Add(Local0, One, Local0) // goto next DIMM > - } > - Release(MEMORY_SLOT_LOCK) > - Return(One) > - } > - > - Method(MEMORY_SLOT_STATUS_METHOD, 1) { > - Store(Zero, Local0) > - > - Acquire(MEMORY_SLOT_LOCK, 0xFFFF) > - Store(ToInteger(Arg0), MEMORY_SLOT_SLECTOR) // select DIMM > - > - If (LEqual(MEMORY_SLOT_ENABLED, One)) { > - Store(0xF, Local0) > - } > - > - Release(MEMORY_SLOT_LOCK) > - Return(Local0) > - } > - > - Method(MEMORY_SLOT_CRS_METHOD, 1, Serialized) { > - Acquire(MEMORY_SLOT_LOCK, 0xFFFF) > - Store(ToInteger(Arg0), MEMORY_SLOT_SLECTOR) // select DIMM > - > - Name(MR64, ResourceTemplate() { > - QWordMemory(ResourceProducer, PosDecode, MinFixed, > MaxFixed, > - Cacheable, ReadWrite, > - 0x0000000000000000, // Address Space Granularity > - 0x0000000000000000, // Address Range Minimum > - 0xFFFFFFFFFFFFFFFE, // Address Range Maximum > - 0x0000000000000000, // Address Translation Offset > - 0xFFFFFFFFFFFFFFFF, // Address Length > - ,, MW64, AddressRangeMemory, TypeStatic) > - }) > - > - CreateDWordField(MR64, 14, MINL) > - CreateDWordField(MR64, 18, MINH) > - CreateDWordField(MR64, 38, LENL) > - CreateDWordField(MR64, 42, LENH) > - CreateDWordField(MR64, 22, MAXL) > - CreateDWordField(MR64, 26, MAXH) > - > - Store(MEMORY_SLOT_ADDR_HIGH, MINH) > - Store(MEMORY_SLOT_ADDR_LOW, MINL) > - Store(MEMORY_SLOT_SIZE_HIGH, LENH) > - Store(MEMORY_SLOT_SIZE_LOW, LENL) > - > - // 64-bit math: MAX = MIN + LEN - 1 > - Add(MINL, LENL, MAXL) > - Add(MINH, LENH, MAXH) > - If (LLess(MAXL, MINL)) { > - Add(MAXH, One, MAXH) > - } > - If (LLess(MAXL, One)) { > - Subtract(MAXH, One, MAXH) > - } > - Subtract(MAXL, One, MAXL) > - > - If (LEqual(MAXH, Zero)){ > - Name(MR32, ResourceTemplate() { > - DWordMemory(ResourceProducer, PosDecode, MinFixed, > MaxFixed, > - Cacheable, ReadWrite, > - 0x00000000, // Address Space Granularity > - 0x00000000, // Address Range Minimum > - 0xFFFFFFFE, // Address Range Maximum > - 0x00000000, // Address Translation Offset > - 0xFFFFFFFF, // Address Length > - ,, MW32, AddressRangeMemory, TypeStatic) > - }) > - CreateDWordField(MR32, MW32._MIN, MIN) > - CreateDWordField(MR32, MW32._MAX, MAX) > - CreateDWordField(MR32, MW32._LEN, LEN) > - Store(MINL, MIN) > - Store(MAXL, MAX) > - Store(LENL, LEN) > - > - Release(MEMORY_SLOT_LOCK) > - Return(MR32) > - } > - > - Release(MEMORY_SLOT_LOCK) > - Return(MR64) > - } > - > - Method(MEMORY_SLOT_PROXIMITY_METHOD, 1) { > - Acquire(MEMORY_SLOT_LOCK, 0xFFFF) > - Store(ToInteger(Arg0), MEMORY_SLOT_SLECTOR) // select DIMM > - Store(MEMORY_SLOT_PROXIMITY, Local0) > - Release(MEMORY_SLOT_LOCK) > - Return(Local0) > - } > - > - Method(MEMORY_SLOT_OST_METHOD, 4) { > - Acquire(MEMORY_SLOT_LOCK, 0xFFFF) > - Store(ToInteger(Arg0), MEMORY_SLOT_SLECTOR) // select DIMM > - Store(Arg1, MEMORY_SLOT_OST_EVENT) > - Store(Arg2, MEMORY_SLOT_OST_STATUS) > - Release(MEMORY_SLOT_LOCK) > - } > - } // Device() > - } // Scope() > -- > 1.8.3.1 > >