[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 33/74] pc: acpi: memhp: move MHPD.MCRS method into S
From: |
Igor Mammedov |
Subject: |
[Qemu-devel] [PATCH 33/74] pc: acpi: memhp: move MHPD.MCRS method into SSDT |
Date: |
Thu, 10 Dec 2015 00:41:27 +0100 |
Signed-off-by: Igor Mammedov <address@hidden>
---
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
- [Qemu-devel] [PATCH 10/74] acpi: add aml_call0() helper, (continued)
- [Qemu-devel] [PATCH 10/74] acpi: add aml_call0() helper, Igor Mammedov, 2015/12/09
- [Qemu-devel] [PATCH 14/74] acpi: add aml_sleep(), Igor Mammedov, 2015/12/09
- [Qemu-devel] [PATCH 34/74] pc: acpi: memhp: move MHPD Device into SSDT, Igor Mammedov, 2015/12/09
- [Qemu-devel] [PATCH 13/74] acpi: add aml_alias(), Igor Mammedov, 2015/12/09
- [Qemu-devel] [PATCH 22/74] acpi: extend aml_or() to accept target argument, Igor Mammedov, 2015/12/09
- [Qemu-devel] [PATCH 33/74] pc: acpi: memhp: move MHPD.MCRS method into SSDT,
Igor Mammedov <=
- [Qemu-devel] [PATCH 35/74] pc: acpi: factor out memhp code from build_ssdt() into separate function, Igor Mammedov, 2015/12/09
- [Qemu-devel] [PATCH 38/74] pc: acpi: drop unused CPU_STATUS_LEN from DSDT, Igor Mammedov, 2015/12/09
- [Qemu-devel] [PATCH 40/74] pc: acpi: cpuhp: move CPMA() method into SSDT, Igor Mammedov, 2015/12/09
- [Qemu-devel] [PATCH 41/74] pc: acpi: cpuhp: move CPST() method into SSDT, Igor Mammedov, 2015/12/09
- [Qemu-devel] [PATCH 48/74] pc: acpi: move KBD device from DSDT to SSDT, Igor Mammedov, 2015/12/09
- [Qemu-devel] [PATCH 53/74] pc: acpi: move PIIX4 isa-bridge and pm devices into SSDT, Igor Mammedov, 2015/12/09
- [Qemu-devel] [PATCH 17/74] acpi: add aml_lgreater(), Igor Mammedov, 2015/12/09