[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC 37/47] pc: acpi-build: create memory hotplug IO region
From: |
Igor Mammedov |
Subject: |
[Qemu-devel] [RFC 37/47] pc: acpi-build: create memory hotplug IO region dynamically |
Date: |
Fri, 19 Dec 2014 02:02:32 +0000 |
it replaces a static complied in DSDT MMIO region
for memory hotplug with one created at runtime
leaving only truly static memory hotplug related
ASL bits in DSDT. And replaces template patching
of MEMORY_SLOTS_NUMBER value with ASL API created
named value.
Later it also would make easier to reuse current
ACPI memory hotplug on other targets.
Also later it would be possible to move remaining
memory hotplug ASL methods into build_ssdt() and
add all memory hotplug related AML into SSDT only
when memory hotplug is enabled, further reducing
ACPI tables blob if memory hotplug isn't used.
Signed-off-by: Igor Mammedov <address@hidden>
---
hw/i386/acpi-build.c | 57 ++++++++++++++++++++++++++++++++++++---
hw/i386/acpi-dsdt-mem-hotplug.dsl | 36 +++++++------------------
hw/i386/ssdt-misc.dsl | 2 --
3 files changed, 64 insertions(+), 31 deletions(-)
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 241bb2a..ec0aac6 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -100,6 +100,8 @@ typedef struct AcpiPmInfo {
uint32_t io_base;
uint16_t cpu_hp_io_base;
uint16_t cpu_hp_io_len;
+ uint16_t mem_hp_io_base;
+ uint16_t mem_hp_io_len;
} AcpiPmInfo;
typedef struct AcpiMiscInfo {
@@ -185,6 +187,9 @@ static void acpi_get_pm_info(AcpiPmInfo *pm)
assert(obj);
pm->cpu_hp_io_len = ACPI_GPE_PROC_LEN;
+ pm->mem_hp_io_base = ACPI_MEMORY_HOTPLUG_BASE;
+ pm->mem_hp_io_len = ACPI_MEMORY_HOTPLUG_IO_LEN;
+
/* Fill in optional s3/s4 related properties */
o = object_property_get_qobject(obj, ACPI_PM_PROP_S3_DISABLED, NULL);
if (o) {
@@ -689,9 +694,6 @@ build_ssdt(GArray *table_data, GArray *linker,
patch_pci_windows(pci, ssdt_ptr, sizeof(ssdp_misc_aml));
- ACPI_BUILD_SET_LE(ssdt_ptr, sizeof(ssdp_misc_aml),
- ssdt_mctrl_nr_slots[0], 32, nr_mem);
-
/* create S3_ / S4_ / S5_ packages if necessary */
scope = acpi_scope("\\");
if (!pm->s3_disabled) {
@@ -829,6 +831,55 @@ build_ssdt(GArray *table_data, GArray *linker,
/* build memory devices */
assert(nr_mem <= ACPI_MAX_RAM_SLOTS);
+ scope = acpi_scope("\\_SB.PCI0." stringify(MEMORY_HOTPLUG_DEVICE));
+ aml_append(&scope,
+ acpi_name_decl(stringify(MEMORY_SLOTS_NUMBER), acpi_int(nr_mem))
+ );
+
+ crs = acpi_resource_template();
+ aml_append(&crs,
+ acpi_io(acpi_decode16, pm->mem_hp_io_base, pm->mem_hp_io_base,
+ 0, pm->mem_hp_io_len)
+ );
+ aml_append(&scope, acpi_name_decl("_CRS", crs));
+
+ aml_append(&scope, acpi_operation_region(
+ stringify(MEMORY_HOTPLUG_IO_REGION), acpi_system_io,
+ pm->mem_hp_io_base, pm->mem_hp_io_len)
+ );
+
+ field = acpi_field(stringify(MEMORY_HOTPLUG_IO_REGION),
acpi_dword_acc);
+ aml_append(&field, /* read only */
+ acpi_named_field(stringify(MEMORY_SLOT_ADDR_LOW), 32));
+ aml_append(&field, /* read only */
+ acpi_named_field(stringify(MEMORY_SLOT_ADDR_HIGH), 32));
+ aml_append(&field, /* read only */
+ acpi_named_field(stringify(MEMORY_SLOT_SIZE_LOW), 32));
+ aml_append(&field, /* read only */
+ acpi_named_field(stringify(MEMORY_SLOT_SIZE_HIGH), 32));
+ aml_append(&field, /* read only */
+ acpi_named_field(stringify(MEMORY_SLOT_PROXIMITY), 32));
+ aml_append(&scope, field);
+
+ field = acpi_field(stringify(MEMORY_HOTPLUG_IO_REGION), acpi_byte_acc);
+ aml_append(&field, acpi_reserved_field(160 /* Offset(20) */));
+ aml_append(&field, /* 1 if enabled, read only */
+ acpi_named_field(stringify(MEMORY_SLOT_ENABLED), 1));
+ aml_append(&field,
+ /*(read) 1 if has a insert event. (write) 1 to clear event */
+ acpi_named_field(stringify(MEMORY_SLOT_INSERT_EVENT), 1));
+ aml_append(&scope, field);
+
+ field = acpi_field(stringify(MEMORY_HOTPLUG_IO_REGION),
acpi_dword_acc);
+ aml_append(&field, /* DIMM selector, write only */
+ acpi_named_field(stringify(MEMORY_SLOT_SLECTOR), 32));
+ aml_append(&field, /* _OST event code, write only */
+ acpi_named_field(stringify(MEMORY_SLOT_OST_EVENT), 32));
+ aml_append(&field, /* _OST status code, write only */
+ acpi_named_field(stringify(MEMORY_SLOT_OST_STATUS), 32));
+ aml_append(&scope, field);
+
+ aml_append(&sb_scope, scope);
for (i = 0; i < nr_mem; i++) {
#define BASEPATH "\\_SB.PCI0." stringify(MEMORY_HOTPLUG_DEVICE) "."
diff --git a/hw/i386/acpi-dsdt-mem-hotplug.dsl
b/hw/i386/acpi-dsdt-mem-hotplug.dsl
index 2a36c47..1e9ec39 100644
--- a/hw/i386/acpi-dsdt-mem-hotplug.dsl
+++ b/hw/i386/acpi-dsdt-mem-hotplug.dsl
@@ -22,14 +22,16 @@
External(MEMORY_SLOTS_NUMBER, IntObj)
/* Memory hotplug IO registers */
- OperationRegion(MEMORY_HOTPLUG_IO_REGION, SystemIO,
- ACPI_MEMORY_HOTPLUG_BASE,
- ACPI_MEMORY_HOTPLUG_IO_LEN)
-
- Name(_CRS, ResourceTemplate() {
- IO(Decode16, ACPI_MEMORY_HOTPLUG_BASE,
ACPI_MEMORY_HOTPLUG_BASE,
- 0, ACPI_MEMORY_HOTPLUG_IO_LEN, IO)
- })
+ 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_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_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
Method(_STA, 0) {
If (LEqual(MEMORY_SLOTS_NUMBER, Zero)) {
@@ -39,25 +41,7 @@
Return(0xB)
}
- Field(MEMORY_HOTPLUG_IO_REGION, DWordAcc, NoLock, Preserve) {
- MEMORY_SLOT_ADDR_LOW, 32, // read only
- MEMORY_SLOT_ADDR_HIGH, 32, // read only
- MEMORY_SLOT_SIZE_LOW, 32, // read only
- MEMORY_SLOT_SIZE_HIGH, 32, // read only
- MEMORY_SLOT_PROXIMITY, 32, // read only
- }
- Field(MEMORY_HOTPLUG_IO_REGION, ByteAcc, NoLock, Preserve) {
- Offset(20),
- MEMORY_SLOT_ENABLED, 1, // 1 if enabled, read only
- MEMORY_SLOT_INSERT_EVENT, 1, // (read) 1 if has a insert
event. (write) 1 to clear event
- }
-
Mutex (MEMORY_SLOT_LOCK, 0)
- Field (MEMORY_HOTPLUG_IO_REGION, DWordAcc, NoLock, Preserve) {
- MEMORY_SLOT_SLECTOR, 32, // DIMM selector, write only
- MEMORY_SLOT_OST_EVENT, 32, // _OST event code, write only
- MEMORY_SLOT_OST_STATUS, 32, // _OST status code, write only
- }
Method(MEMORY_SLOT_SCAN_METHOD, 0) {
If (LEqual(MEMORY_SLOTS_NUMBER, Zero)) {
diff --git a/hw/i386/ssdt-misc.dsl b/hw/i386/ssdt-misc.dsl
index 81be858..2588e30 100644
--- a/hw/i386/ssdt-misc.dsl
+++ b/hw/i386/ssdt-misc.dsl
@@ -36,7 +36,5 @@ DefinitionBlock ("ssdt-misc.aml", "SSDT", 0x01, "BXPC",
"BXSSDTSUSP", 0x1)
Name(P1E, Buffer() { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 })
ACPI_EXTRACT_NAME_BUFFER8 acpi_pci64_length
Name(P1L, Buffer() { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 })
- ACPI_EXTRACT_NAME_DWORD_CONST ssdt_mctrl_nr_slots
- Name(MEMORY_SLOTS_NUMBER, 0x12345678)
}
}
--
1.8.3.1
- [Qemu-devel] [RFC 23/47] acpi: include PkgLength size only when requested, (continued)
- [Qemu-devel] [RFC 23/47] acpi: include PkgLength size only when requested, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 30/47] acpi: add acpi_equal() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 29/47] acpi: add acpi_varpackage() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 33/47] pc: acpi-build: drop template patching and CPU hotplug objects dynamically, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 31/47] acpi: add acpi_processor() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 32/47] acpi: add acpi_eisaid() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 27/47] acpi: add acpi_string() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 36/47] pc: acpi-build: drop template patching and memory hotplug objects dynamically, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 35/47] acpi: add acpi_reserved_field() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 34/47] pc: acpi-build: create CPU hotplug IO region dynamically, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 37/47] pc: acpi-build: create memory hotplug IO region dynamically,
Igor Mammedov <=
- [Qemu-devel] [RFC 39/47] pc: pcihp: expose MMIO base and len as properties, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 41/47] pc: acpi-build: create PCI0._CRS dynamically, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 40/47] pc: acpi-build: reserve PCIHP MMIO resources, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 38/47] acpi: add acpi_word_bus_number(), acpi_word_io(), acpi_dword_memory(), acpi_qword_memory() terms, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 42/47] acpi: make tables linker-loader available to other targets, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 43/47] acpi: add acpi_def_block() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 45/47] pc: acpi-build: drop remaining ssdt_misc template and use acpi_def_block(), Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 44/47] pc: acpi-build: prepare to make ACPI tables blob opaque for table building functions, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 47/47] tests: acpi: update reference DSDT/SSDT tables, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 46/47] pc: acpi: update DSTD blobs, Igor Mammedov, 2014/12/18