From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43101) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a6oNc-0000AR-6S for qemu-devel@nongnu.org; Wed, 09 Dec 2015 18:42:43 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a6oNa-0004qf-Ra for qemu-devel@nongnu.org; Wed, 09 Dec 2015 18:42:40 -0500 Received: from mx1.redhat.com ([209.132.183.28]:42970) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a6oNa-0004qP-Jb for qemu-devel@nongnu.org; Wed, 09 Dec 2015 18:42:38 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 3D8768F298 for ; Wed, 9 Dec 2015 23:42:38 +0000 (UTC) Received: from dell-r430-03.lab.eng.brq.redhat.com (dell-r430-03.lab.eng.brq.redhat.com [10.34.112.60]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id tB9Ng8VU005315 for ; Wed, 9 Dec 2015 18:42:37 -0500 From: Igor Mammedov Date: Thu, 10 Dec 2015 00:41:22 +0100 Message-Id: <1449704528-289297-29-git-send-email-imammedo@redhat.com> In-Reply-To: <1449704528-289297-1-git-send-email-imammedo@redhat.com> References: <1449704528-289297-1-git-send-email-imammedo@redhat.com> Subject: [Qemu-devel] [PATCH 28/74] pc: acpi: memhp: move MHPD.MSCN method into SSDT List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Signed-off-by: Igor Mammedov --- 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 . */ - 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