Signed-off-by: Igor Mammedov <imamm...@redhat.com> --- hw/acpi/memory_hotplug_acpi_table.c | 53 +++++++++++++++++++++++++++++++------ hw/i386/acpi-dsdt-mem-hotplug.dsl | 27 +------------------ include/hw/acpi/pc-hotplug.h | 4 --- 3 files changed, 46 insertions(+), 38 deletions(-)
diff --git a/hw/acpi/memory_hotplug_acpi_table.c b/hw/acpi/memory_hotplug_acpi_table.c index 8a9bcd9..e702cad 100644 --- a/hw/acpi/memory_hotplug_acpi_table.c +++ b/hw/acpi/memory_hotplug_acpi_table.c @@ -4,13 +4,18 @@ #include "include/hw/acpi/pc-hotplug.h" #include "hw/boards.h" +#define MEMORY_SLOT_INSERT_EVENT "MINS" +#define MEMORY_SLOT_REMOVE_EVENT "MRMV" +#define MEMORY_SLOT_NOTIFY_METHOD "MTFY" + #define BASEPATH "\\_SB.PCI0." stringify(MEMORY_HOTPLUG_DEVICE) "." void build_mhpt(GArray *table_data, GArray *linker, uint32_t nr_mem, uint16_t io_base, uint16_t io_len) { int i; - Aml *table, *sb_scope, *dev, *method, *ifctx, *ctrl_dev; + Aml *table, *sb_scope, *dev, *method, *ifctx, *ctrl_dev, *while_ctx; + Aml *else_ctx; table = init_aml_allocator(); acpi_data_push(table->buf, sizeof(AcpiTableHeader)); @@ -20,10 +25,8 @@ void build_mhpt(GArray *table_data, GArray *linker, uint32_t nr_mem, ctrl_dev = aml_scope("\\_SB.PCI0." stringify(MEMORY_HOTPLUG_DEVICE)); { Aml *crs, *field; - - aml_append(ctrl_dev, - aml_name_decl(stringify(MEMORY_SLOTS_NUMBER), aml_int(nr_mem)) - ); + Aml *a_ctrl_lock = aml_name(stringify(MEMORY_SLOT_LOCK)); + Aml *a_slot_selector = aml_name(stringify(MEMORY_SLOT_SLECTOR)); crs = aml_resource_template(); aml_append(crs, aml_io(AML_DECODE16, io_base, io_base, 0, io_len)); @@ -55,10 +58,10 @@ void build_mhpt(GArray *table_data, GArray *linker, uint32_t nr_mem, aml_named_field(stringify(MEMORY_SLOT_ENABLED), 1)); aml_append(field, /*(read) 1 if has a insert event. (write) 1 to clear event */ - aml_named_field(stringify(MEMORY_SLOT_INSERT_EVENT), 1)); + aml_named_field(MEMORY_SLOT_INSERT_EVENT, 1)); aml_append(field, /* (read) 1 if has a remove event. (write) 1 to clear event */ - aml_named_field(stringify(MEMORY_SLOT_REMOVE_EVENT), 1)); + aml_named_field(MEMORY_SLOT_REMOVE_EVENT, 1)); aml_append(field, /* initiates device eject, write only */ aml_named_field(stringify(MEMORY_SLOT_EJECT), 1)); @@ -78,6 +81,40 @@ void build_mhpt(GArray *table_data, GArray *linker, uint32_t nr_mem, aml_append(ctrl_dev, aml_name_decl("_STA", aml_int(0xB))); aml_append(ctrl_dev, aml_mutex(stringify(MEMORY_SLOT_LOCK), 0)); + + method = aml_method(stringify(MEMORY_SLOT_SCAN_METHOD), 0); + { + Aml *a_idx = aml_local(0); + + 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, aml_int(nr_mem))); + { + Aml *a_ins_evt = aml_name(MEMORY_SLOT_INSERT_EVENT); + Aml *a_rm_evt = aml_name(MEMORY_SLOT_REMOVE_EVENT); + + aml_append(while_ctx, aml_store(a_idx, a_slot_selector)); + ifctx = aml_if(aml_equal(a_ins_evt, aml_int(1))); + aml_append(ifctx, + aml_call2(MEMORY_SLOT_NOTIFY_METHOD, a_idx, aml_int(1))); + aml_append(ifctx, aml_store(aml_int(1), a_ins_evt)); + aml_append(while_ctx, ifctx); + + else_ctx = aml_else(); + ifctx = aml_if(aml_equal(a_rm_evt, aml_int(1))); + aml_append(ifctx, + aml_call2(MEMORY_SLOT_NOTIFY_METHOD, a_idx, aml_int(3))); + aml_append(ifctx, aml_store(aml_int(1), a_rm_evt)); + aml_append(else_ctx, ifctx); + aml_append(while_ctx, else_ctx); + + aml_append(while_ctx, aml_increment(a_idx)); + } + aml_append(method, while_ctx); + aml_append(method, aml_release(a_ctrl_lock)); + aml_append(method, aml_return(aml_int(1))); + } + aml_append(ctrl_dev, method); } aml_append(table, ctrl_dev); @@ -123,7 +160,7 @@ void build_mhpt(GArray *table_data, GArray *linker, uint32_t nr_mem, /* build Method(MEMORY_SLOT_NOTIFY_METHOD, 2) { * If (LEqual(Arg0, 0x00)) {Notify(MP00, Arg1)} ... } */ - method = aml_method(stringify(MEMORY_SLOT_NOTIFY_METHOD), 2); + method = aml_method(MEMORY_SLOT_NOTIFY_METHOD, 2); for (i = 0; i < nr_mem; i++) { ifctx = aml_if(aml_equal(aml_arg(0), aml_int(i))); aml_append(ifctx, 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) diff --git a/include/hw/acpi/pc-hotplug.h b/include/hw/acpi/pc-hotplug.h index 77b1569..9b67a93 100644 --- a/include/hw/acpi/pc-hotplug.h +++ b/include/hw/acpi/pc-hotplug.h @@ -33,7 +33,6 @@ #define ACPI_MEMORY_HOTPLUG_BASE 0x0a00 #define MEMORY_HOTPLUG_DEVICE MHPD -#define MEMORY_SLOTS_NUMBER MDNR #define MEMORY_HOTPLUG_IO_REGION HPMR #define MEMORY_SLOT_ADDR_LOW MRBL #define MEMORY_SLOT_ADDR_HIGH MRBH @@ -41,8 +40,6 @@ #define MEMORY_SLOT_SIZE_HIGH MRLH #define MEMORY_SLOT_PROXIMITY MPX #define MEMORY_SLOT_ENABLED MES -#define MEMORY_SLOT_INSERT_EVENT MINS -#define MEMORY_SLOT_REMOVE_EVENT MRMV #define MEMORY_SLOT_EJECT MEJ #define MEMORY_SLOT_SLECTOR MSEL #define MEMORY_SLOT_OST_EVENT MOEV @@ -53,7 +50,6 @@ #define MEMORY_SLOT_OST_METHOD MOST #define MEMORY_SLOT_PROXIMITY_METHOD MPXM #define MEMORY_SLOT_EJECT_METHOD MEJ0 -#define MEMORY_SLOT_NOTIFY_METHOD MTFY #define MEMORY_SLOT_SCAN_METHOD MSCN #endif -- 1.8.3.1