Signed-off-by: Igor Mammedov <imamm...@redhat.com> --- hw/acpi/memory_hotplug_acpi_table.c | 21 +++++++++++++++++++++ hw/i386/acpi-dsdt-mem-hotplug.dsl | 15 --------------- 2 files changed, 21 insertions(+), 15 deletions(-)
diff --git a/hw/acpi/memory_hotplug_acpi_table.c b/hw/acpi/memory_hotplug_acpi_table.c index cda05f4..b76694d 100644 --- a/hw/acpi/memory_hotplug_acpi_table.c +++ b/hw/acpi/memory_hotplug_acpi_table.c @@ -43,6 +43,8 @@ void build_memory_hotplug_aml(Aml *ctx, uint32_t nr_mem, { Aml *a_ctrl_lock = aml_name(stringify(MEMORY_SLOT_LOCK)); Aml *a_slot_selector = aml_name(stringify(MEMORY_SLOT_SLECTOR)); + Aml *a_ret_val = aml_local(0); + Aml *a_slot_arg0 = aml_arg(0); /* MHPD._STA() method */ method = aml_method("_STA", 0, AML_NOTSERIALIZED); @@ -96,6 +98,25 @@ void build_memory_hotplug_aml(Aml *ctx, uint32_t nr_mem, aml_append(method, aml_return(a_one)); } aml_append(ctrl_dev, method); + + method = aml_method(stringify(MEMORY_SLOT_STATUS_METHOD), 1, + AML_NOTSERIALIZED); + { + Aml *a_slot_enabled = aml_name(stringify(MEMORY_SLOT_ENABLED)); + + aml_append(method, aml_store(a_zero, a_ret_val)); + aml_append(method, aml_acquire(a_ctrl_lock, 0xFFFF)); + aml_append(method, aml_store(aml_to_integer(a_slot_arg0), + a_slot_selector)); + + ifctx = aml_if(aml_equal(a_slot_enabled, a_one)); + 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(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 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 -- 1.8.3.1