Signed-off-by: Igor Mammedov <imamm...@redhat.com> --- hw/acpi/memory_hotplug_acpi_table.c | 48 +++++++++++++++++++++++++++++++++++++ hw/i386/acpi-dsdt-mem-hotplug.dsl | 27 +-------------------- 2 files changed, 49 insertions(+), 26 deletions(-)
diff --git a/hw/acpi/memory_hotplug_acpi_table.c b/hw/acpi/memory_hotplug_acpi_table.c index d389f73..cda05f4 100644 --- a/hw/acpi/memory_hotplug_acpi_table.c +++ b/hw/acpi/memory_hotplug_acpi_table.c @@ -31,13 +31,19 @@ void build_memory_hotplug_aml(Aml *ctx, uint32_t nr_mem, Aml *ctrl_dev; Aml *method; Aml *ifctx; + Aml *else_ctx; + Aml *while_ctx; Aml *a_zero = aml_int(0); + Aml *a_one = aml_int(1); Aml *a_slots_nr = aml_name(stringify(MEMORY_SLOTS_NUMBER)); /* scope for memory hotplug controller device node */ pci_scope = aml_scope("_SB.PCI0"); ctrl_dev = aml_scope(stringify(MEMORY_HOTPLUG_DEVICE)); { + Aml *a_ctrl_lock = aml_name(stringify(MEMORY_SLOT_LOCK)); + Aml *a_slot_selector = aml_name(stringify(MEMORY_SLOT_SLECTOR)); + /* MHPD._STA() method */ method = aml_method("_STA", 0, AML_NOTSERIALIZED); ifctx = aml_if(aml_equal(a_slots_nr, a_zero)); @@ -48,6 +54,48 @@ void build_memory_hotplug_aml(Aml *ctx, uint32_t nr_mem, aml_append(ctrl_dev, method); aml_append(ctrl_dev, aml_mutex(stringify(MEMORY_SLOT_LOCK), 0)); + + method = aml_method(stringify(MEMORY_SLOT_SCAN_METHOD), 0, + AML_NOTSERIALIZED); + { + Aml *a_idx = aml_local(0); + + ifctx = aml_if(aml_equal(a_slots_nr, a_zero)); + aml_append(ifctx, aml_return(a_zero)); + aml_append(method, ifctx); + + aml_append(method, aml_store(aml_int(0), a_idx)); + aml_append(method, aml_acquire(a_ctrl_lock, 0xFFFF)); + while_ctx = aml_while( + aml_lless(a_idx, a_slots_nr)); + { + Aml *a_ins_evt = aml_name(stringify(MEMORY_SLOT_INSERT_EVENT)); + Aml *a_rm_evt = aml_name(stringify(MEMORY_SLOT_REMOVE_EVENT)); + + aml_append(while_ctx, aml_store(a_idx, a_slot_selector)); + ifctx = aml_if(aml_equal(a_ins_evt, a_one)); + aml_append(ifctx, + aml_call2(stringify(MEMORY_SLOT_NOTIFY_METHOD), + a_idx, a_one)); + aml_append(ifctx, aml_store(a_one, a_ins_evt)); + aml_append(while_ctx, ifctx); + + else_ctx = aml_else(); + ifctx = aml_if(aml_equal(a_rm_evt, a_one)); + aml_append(ifctx, + aml_call2(stringify(MEMORY_SLOT_NOTIFY_METHOD), + a_idx, aml_int(3))); + aml_append(ifctx, aml_store(a_one, a_rm_evt)); + aml_append(else_ctx, ifctx); + aml_append(while_ctx, else_ctx); + + aml_append(while_ctx, aml_add(a_idx, a_one, a_idx)); + } + aml_append(method, while_ctx); + aml_append(method, aml_release(a_ctrl_lock)); + aml_append(method, aml_return(a_one)); + } + aml_append(ctrl_dev, method); } aml_append(pci_scope, ctrl_dev); aml_append(ctx, pci_scope); diff --git a/hw/i386/acpi-dsdt-mem-hotplug.dsl b/hw/i386/acpi-dsdt-mem-hotplug.dsl index a1e519b..92baf87 100644 --- a/hw/i386/acpi-dsdt-mem-hotplug.dsl +++ b/hw/i386/acpi-dsdt-mem-hotplug.dsl @@ -13,13 +13,12 @@ * with this program; if not, see <http://www.gnu.org/licenses/>. */ - External(MEMORY_SLOT_NOTIFY_METHOD, MethodObj) + External(\_SB.PCI0.MEMORY_HOTPLUG_DEVICE.MEMORY_SLOT_SCAN_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 */ External(MEMORY_SLOT_ADDR_LOW, FieldUnitObj) // read only @@ -28,36 +27,12 @@ External(MEMORY_SLOT_SIZE_HIGH, FieldUnitObj) // read only External(MEMORY_SLOT_PROXIMITY, FieldUnitObj) // read only External(MEMORY_SLOT_ENABLED, FieldUnitObj) // 1 if enabled, read only - External(MEMORY_SLOT_INSERT_EVENT, FieldUnitObj) // (read) 1 if has a insert event. (write) 1 to clear event - External(MEMORY_SLOT_REMOVE_EVENT, FieldUnitObj) // (read) 1 if has a remove event. (write) 1 to clear event External(MEMORY_SLOT_EJECT, FieldUnitObj) // initiates device eject, write only External(MEMORY_SLOT_SLECTOR, FieldUnitObj) // DIMM selector, write only External(MEMORY_SLOT_OST_EVENT, FieldUnitObj) // _OST event code, write only External(MEMORY_SLOT_OST_STATUS, FieldUnitObj) // _OST status code, write only External(MEMORY_SLOT_LOCK, MutexObj) - 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) - } Elseif (LEqual(MEMORY_SLOT_REMOVE_EVENT, One)) { // Ejection request - MEMORY_SLOT_NOTIFY_METHOD(Local0, 3) - Store(1, MEMORY_SLOT_REMOVE_EVENT) - } - Add(Local0, One, Local0) // goto next DIMM - } - Release(MEMORY_SLOT_LOCK) - Return(One) - } - Method(MEMORY_SLOT_STATUS_METHOD, 1) { Store(Zero, Local0) -- 1.8.3.1