Signed-off-by: Igor Mammedov <imamm...@redhat.com> --- hw/acpi/memory_hotplug_acpi_table.c | 25 +++++++++++++++++++++++-- hw/i386/acpi-dsdt-mem-hotplug.dsl | 15 --------------- include/hw/acpi/pc-hotplug.h | 2 -- 3 files changed, 23 insertions(+), 19 deletions(-)
diff --git a/hw/acpi/memory_hotplug_acpi_table.c b/hw/acpi/memory_hotplug_acpi_table.c index 3eb1780..7ca3c7d 100644 --- a/hw/acpi/memory_hotplug_acpi_table.c +++ b/hw/acpi/memory_hotplug_acpi_table.c @@ -7,6 +7,8 @@ #define MEMORY_SLOT_INSERT_EVENT "MINS" #define MEMORY_SLOT_REMOVE_EVENT "MRMV" #define MEMORY_SLOT_NOTIFY_METHOD "MTFY" +#define MEMORY_SLOT_STATUS_METHOD "MRST" +#define MEMORY_SLOT_ENABLED "MES" #define BASEPATH "\\_SB.PCI0." stringify(MEMORY_HOTPLUG_DEVICE) "." @@ -25,6 +27,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 *a_slot_arg = aml_arg(0); + Aml *a_ret_val = aml_local(0); Aml *a_ctrl_lock = aml_name(stringify(MEMORY_SLOT_LOCK)); Aml *a_slot_selector = aml_name(stringify(MEMORY_SLOT_SLECTOR)); @@ -55,7 +59,7 @@ void build_mhpt(GArray *table_data, GArray *linker, uint32_t nr_mem, AML_WRITE_AS_ZEROS); aml_append(field, aml_reserved_field(160 /* bits, Offset(20) */)); aml_append(field, /* 1 if enabled, read only */ - aml_named_field(stringify(MEMORY_SLOT_ENABLED), 1)); + aml_named_field(MEMORY_SLOT_ENABLED, 1)); aml_append(field, /*(read) 1 if has a insert event. (write) 1 to clear event */ aml_named_field(MEMORY_SLOT_INSERT_EVENT, 1)); @@ -115,6 +119,23 @@ void build_mhpt(GArray *table_data, GArray *linker, uint32_t nr_mem, aml_append(method, aml_return(aml_int(1))); } aml_append(ctrl_dev, method); + + method = aml_method(MEMORY_SLOT_STATUS_METHOD, 1); + { + Aml *a_slot_enabled = aml_name(MEMORY_SLOT_ENABLED); + + aml_append(method, aml_acquire(a_ctrl_lock, 0xFFFF)); + aml_append(method, aml_store(aml_int(0), a_ret_val)); + aml_append(method, aml_store(a_slot_arg, a_slot_selector)); + + ifctx = aml_if(aml_equal(a_slot_enabled, aml_int(1))); + aml_append(ifctx, aml_store(aml_int(0xF), a_ret_val)); + aml_append(method, ifctx); + + aml_append(method, aml_release(a_ctrl_lock)); + aml_append(method, aml_return(a_ret_val)); + } + aml_append(ctrl_dev, method); } aml_append(table, ctrl_dev); @@ -132,7 +153,7 @@ void build_mhpt(GArray *table_data, GArray *linker, uint32_t nr_mem, aml_append(dev, method); method = aml_method("_STA", 0); - s = BASEPATH stringify(MEMORY_SLOT_STATUS_METHOD); + s = BASEPATH MEMORY_SLOT_STATUS_METHOD; aml_append(method, aml_return(aml_call1(s, aml_name("_UID")))); aml_append(dev, method); diff --git a/hw/i386/acpi-dsdt-mem-hotplug.dsl b/hw/i386/acpi-dsdt-mem-hotplug.dsl index 92baf87..13e93dc 100644 --- a/hw/i386/acpi-dsdt-mem-hotplug.dsl +++ b/hw/i386/acpi-dsdt-mem-hotplug.dsl @@ -26,27 +26,12 @@ External(MEMORY_SLOT_SIZE_LOW, FieldUnitObj) // read only 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_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_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 diff --git a/include/hw/acpi/pc-hotplug.h b/include/hw/acpi/pc-hotplug.h index 9b67a93..47efa99 100644 --- a/include/hw/acpi/pc-hotplug.h +++ b/include/hw/acpi/pc-hotplug.h @@ -39,13 +39,11 @@ #define MEMORY_SLOT_SIZE_LOW MRLL #define MEMORY_SLOT_SIZE_HIGH MRLH #define MEMORY_SLOT_PROXIMITY MPX -#define MEMORY_SLOT_ENABLED MES #define MEMORY_SLOT_EJECT MEJ #define MEMORY_SLOT_SLECTOR MSEL #define MEMORY_SLOT_OST_EVENT MOEV #define MEMORY_SLOT_OST_STATUS MOSC #define MEMORY_SLOT_LOCK MLCK -#define MEMORY_SLOT_STATUS_METHOD MRST #define MEMORY_SLOT_CRS_METHOD MCRS #define MEMORY_SLOT_OST_METHOD MOST #define MEMORY_SLOT_PROXIMITY_METHOD MPXM -- 1.8.3.1