Signed-off-by: Igor Mammedov <imamm...@redhat.com> --- hw/acpi/memory_hotplug_acpi_table.c | 85 +++++++++++++++++++++++++++++++++++++ hw/i386/acpi-dsdt-mem-hotplug.dsl | 72 ------------------------------- 2 files changed, 85 insertions(+), 72 deletions(-)
diff --git a/hw/acpi/memory_hotplug_acpi_table.c b/hw/acpi/memory_hotplug_acpi_table.c index 9795a9f..622cd5c 100644 --- a/hw/acpi/memory_hotplug_acpi_table.c +++ b/hw/acpi/memory_hotplug_acpi_table.c @@ -118,6 +118,91 @@ void build_memory_hotplug_aml(Aml *ctx, uint32_t nr_mem, } aml_append(ctrl_dev, method); + method = aml_method(stringify(MEMORY_SLOT_CRS_METHOD), 1, + AML_SERIALIZED); + { + Aml *a_mr64 = aml_name("MR64"); + Aml *a_mr32 = aml_name("MR32"); + Aml *a_crs_tmpl = aml_resource_template(); + Aml *a_minl = aml_name("MINL"); + Aml *a_minh = aml_name("MINH"); + Aml *a_maxl = aml_name("MAXL"); + Aml *a_maxh = aml_name("MAXH"); + Aml *a_lenl = aml_name("LENL"); + Aml *a_lenh = aml_name("LENH"); + + aml_append(method, aml_acquire(a_ctrl_lock, 0xFFFF)); + aml_append(method, aml_store(aml_to_integer(a_slot_arg0), + a_slot_selector)); + + aml_append(a_crs_tmpl, + aml_qword_memory(AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED, + AML_CACHEABLE, AML_READ_WRITE, + 0, 0x0, 0xFFFFFFFFFFFFFFFE, 0, + 0xFFFFFFFFFFFFFFFF)); + aml_append(method, aml_name_decl("MR64", a_crs_tmpl)); + aml_append(method, + aml_create_dword_field(a_mr64, aml_int(14), "MINL")); + aml_append(method, + aml_create_dword_field(a_mr64, aml_int(18), "MINH")); + aml_append(method, + aml_create_dword_field(a_mr64, aml_int(38), "LENL")); + aml_append(method, + aml_create_dword_field(a_mr64, aml_int(42), "LENH")); + aml_append(method, + aml_create_dword_field(a_mr64, aml_int(22), "MAXL")); + aml_append(method, + aml_create_dword_field(a_mr64, aml_int(26), "MAXH")); + + aml_append(method, + aml_store(aml_name(stringify(MEMORY_SLOT_ADDR_HIGH)), a_minh)); + aml_append(method, + aml_store(aml_name(stringify(MEMORY_SLOT_ADDR_LOW)), a_minl)); + aml_append(method, + aml_store(aml_name(stringify(MEMORY_SLOT_SIZE_HIGH)), a_lenh)); + aml_append(method, + aml_store(aml_name(stringify(MEMORY_SLOT_SIZE_LOW)), a_lenl)); + + /* 64-bit math: MAX = MIN + LEN - 1 */ + aml_append(method, aml_add(a_minl, a_lenl, a_maxl)); + aml_append(method, aml_add(a_minh, a_lenh, a_maxh)); + ifctx = aml_if(aml_lless(a_maxl, a_minl)); + aml_append(ifctx, aml_add(a_maxh, a_one, a_maxh)); + aml_append(method, ifctx); + ifctx = aml_if(aml_lless(a_maxl, a_one)); + aml_append(ifctx, aml_subtract(a_maxh, a_one, a_maxh)); + aml_append(method, ifctx); + aml_append(method, aml_subtract(a_maxl, a_one, a_maxl)); + + /* return 32-bit _CRS if addr/size is in low mem */ + /* TODO: remove it since all hotplugged DIMMs are in high mem */ + ifctx = aml_if(aml_equal(a_maxh, a_zero)); + a_crs_tmpl = aml_resource_template(); + aml_append(a_crs_tmpl, + aml_dword_memory(AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED, + AML_CACHEABLE, AML_READ_WRITE, + 0, 0x0, 0xFFFFFFFE, 0, + 0xFFFFFFFF)); + aml_append(ifctx, aml_name_decl("MR32", a_crs_tmpl)); + aml_append(ifctx, + aml_create_dword_field(a_mr32, aml_int(10), "MIN")); + aml_append(ifctx, + aml_create_dword_field(a_mr32, aml_int(14), "MAX")); + aml_append(ifctx, + aml_create_dword_field(a_mr32, aml_int(22), "LEN")); + aml_append(ifctx, aml_store(a_minl, aml_name("MIN"))); + aml_append(ifctx, aml_store(a_maxl, aml_name("MAX"))); + aml_append(ifctx, aml_store(a_lenl, aml_name("LEN"))); + + aml_append(ifctx, aml_release(a_ctrl_lock)); + aml_append(ifctx, aml_return(a_mr32)); + aml_append(method, ifctx); + + aml_append(method, aml_release(a_ctrl_lock)); + aml_append(method, aml_return(a_mr64)); + } + aml_append(ctrl_dev, method); + method = aml_method(stringify(MEMORY_SLOT_PROXIMITY_METHOD), 1, AML_NOTSERIALIZED); { diff --git a/hw/i386/acpi-dsdt-mem-hotplug.dsl b/hw/i386/acpi-dsdt-mem-hotplug.dsl index 87d8d66..50b7541 100644 --- a/hw/i386/acpi-dsdt-mem-hotplug.dsl +++ b/hw/i386/acpi-dsdt-mem-hotplug.dsl @@ -19,77 +19,5 @@ Device(MEMORY_HOTPLUG_DEVICE) { Name(_HID, "PNP0A06") Name(_UID, "Memory hotplug resources") - - /* Memory hotplug IO registers */ - External(MEMORY_SLOT_ADDR_LOW, FieldUnitObj) // read only - External(MEMORY_SLOT_ADDR_HIGH, FieldUnitObj) // read only - External(MEMORY_SLOT_SIZE_LOW, FieldUnitObj) // read only - External(MEMORY_SLOT_SIZE_HIGH, FieldUnitObj) // read only - External(MEMORY_SLOT_SLECTOR, FieldUnitObj) // DIMM selector, write only - External(MEMORY_SLOT_LOCK, MutexObj) - - Method(MEMORY_SLOT_CRS_METHOD, 1, Serialized) { - Acquire(MEMORY_SLOT_LOCK, 0xFFFF) - Store(ToInteger(Arg0), MEMORY_SLOT_SLECTOR) // select DIMM - - Name(MR64, ResourceTemplate() { - QWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed, - Cacheable, ReadWrite, - 0x0000000000000000, // Address Space Granularity - 0x0000000000000000, // Address Range Minimum - 0xFFFFFFFFFFFFFFFE, // Address Range Maximum - 0x0000000000000000, // Address Translation Offset - 0xFFFFFFFFFFFFFFFF, // Address Length - ,, MW64, AddressRangeMemory, TypeStatic) - }) - - CreateDWordField(MR64, 14, MINL) - CreateDWordField(MR64, 18, MINH) - CreateDWordField(MR64, 38, LENL) - CreateDWordField(MR64, 42, LENH) - CreateDWordField(MR64, 22, MAXL) - CreateDWordField(MR64, 26, MAXH) - - Store(MEMORY_SLOT_ADDR_HIGH, MINH) - Store(MEMORY_SLOT_ADDR_LOW, MINL) - Store(MEMORY_SLOT_SIZE_HIGH, LENH) - Store(MEMORY_SLOT_SIZE_LOW, LENL) - - // 64-bit math: MAX = MIN + LEN - 1 - Add(MINL, LENL, MAXL) - Add(MINH, LENH, MAXH) - If (LLess(MAXL, MINL)) { - Add(MAXH, One, MAXH) - } - If (LLess(MAXL, One)) { - Subtract(MAXH, One, MAXH) - } - Subtract(MAXL, One, MAXL) - - If (LEqual(MAXH, Zero)){ - Name(MR32, ResourceTemplate() { - DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed, - Cacheable, ReadWrite, - 0x00000000, // Address Space Granularity - 0x00000000, // Address Range Minimum - 0xFFFFFFFE, // Address Range Maximum - 0x00000000, // Address Translation Offset - 0xFFFFFFFF, // Address Length - ,, MW32, AddressRangeMemory, TypeStatic) - }) - CreateDWordField(MR32, MW32._MIN, MIN) - CreateDWordField(MR32, MW32._MAX, MAX) - CreateDWordField(MR32, MW32._LEN, LEN) - Store(MINL, MIN) - Store(MAXL, MAX) - Store(LENL, LEN) - - Release(MEMORY_SLOT_LOCK) - Return(MR32) - } - - Release(MEMORY_SLOT_LOCK) - Return(MR64) - } } // Device() } // Scope() -- 1.8.3.1