[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 36/47] nvdimm acpi: prebuild nvdimm devices for avail
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] [PULL 36/47] nvdimm acpi: prebuild nvdimm devices for available slots |
Date: |
Sun, 30 Oct 2016 23:25:00 +0200 |
From: Xiao Guangrong <address@hidden>
For each NVDIMM present or intended to be supported by platform,
platform firmware also exposes an ACPI Namespace Device under
the root device
So it builds nvdimm devices for all slots to support vNVDIMM hotplug
Reviewed-by: Stefan Hajnoczi <address@hidden>
Signed-off-by: Xiao Guangrong <address@hidden>
Reviewed-by: Michael S. Tsirkin <address@hidden>
Signed-off-by: Michael S. Tsirkin <address@hidden>
---
include/hw/mem/nvdimm.h | 3 ++-
hw/acpi/nvdimm.c | 41 ++++++++++++++++++++++++-----------------
hw/i386/acpi-build.c | 2 +-
3 files changed, 27 insertions(+), 19 deletions(-)
diff --git a/include/hw/mem/nvdimm.h b/include/hw/mem/nvdimm.h
index 1cfe9e0..63a2b20 100644
--- a/include/hw/mem/nvdimm.h
+++ b/include/hw/mem/nvdimm.h
@@ -112,5 +112,6 @@ typedef struct AcpiNVDIMMState AcpiNVDIMMState;
void nvdimm_init_acpi_state(AcpiNVDIMMState *state, MemoryRegion *io,
FWCfgState *fw_cfg, Object *owner);
void nvdimm_build_acpi(GArray *table_offsets, GArray *table_data,
- BIOSLinker *linker, GArray *dsm_dma_arrea);
+ BIOSLinker *linker, GArray *dsm_dma_arrea,
+ uint32_t ram_slots);
#endif
diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c
index bb896c9..b8a2e62 100644
--- a/hw/acpi/nvdimm.c
+++ b/hw/acpi/nvdimm.c
@@ -961,12 +961,11 @@ static void nvdimm_build_device_dsm(Aml *dev, uint32_t
handle)
aml_append(dev, method);
}
-static void nvdimm_build_nvdimm_devices(GSList *device_list, Aml *root_dev)
+static void nvdimm_build_nvdimm_devices(Aml *root_dev, uint32_t ram_slots)
{
- for (; device_list; device_list = device_list->next) {
- DeviceState *dev = device_list->data;
- int slot = object_property_get_int(OBJECT(dev), PC_DIMM_SLOT_PROP,
- NULL);
+ uint32_t slot;
+
+ for (slot = 0; slot < ram_slots; slot++) {
uint32_t handle = nvdimm_slot_to_handle(slot);
Aml *nvdimm_dev;
@@ -987,9 +986,9 @@ static void nvdimm_build_nvdimm_devices(GSList
*device_list, Aml *root_dev)
}
}
-static void nvdimm_build_ssdt(GSList *device_list, GArray *table_offsets,
- GArray *table_data, BIOSLinker *linker,
- GArray *dsm_dma_arrea)
+static void nvdimm_build_ssdt(GArray *table_offsets, GArray *table_data,
+ BIOSLinker *linker, GArray *dsm_dma_arrea,
+ uint32_t ram_slots)
{
Aml *ssdt, *sb_scope, *dev;
int mem_addr_offset, nvdimm_ssdt;
@@ -1021,7 +1020,7 @@ static void nvdimm_build_ssdt(GSList *device_list, GArray
*table_offsets,
/* 0 is reserved for root device. */
nvdimm_build_device_dsm(dev, 0);
- nvdimm_build_nvdimm_devices(device_list, dev);
+ nvdimm_build_nvdimm_devices(dev, ram_slots);
aml_append(sb_scope, dev);
aml_append(ssdt, sb_scope);
@@ -1046,17 +1045,25 @@ static void nvdimm_build_ssdt(GSList *device_list,
GArray *table_offsets,
}
void nvdimm_build_acpi(GArray *table_offsets, GArray *table_data,
- BIOSLinker *linker, GArray *dsm_dma_arrea)
+ BIOSLinker *linker, GArray *dsm_dma_arrea,
+ uint32_t ram_slots)
{
GSList *device_list;
- /* no NVDIMM device is plugged. */
device_list = nvdimm_get_plugged_device_list();
- if (!device_list) {
- return;
+
+ /* NVDIMM device is plugged. */
+ if (device_list) {
+ nvdimm_build_nfit(device_list, table_offsets, table_data, linker);
+ g_slist_free(device_list);
+ }
+
+ /*
+ * NVDIMM device is allowed to be plugged only if there is available
+ * slot.
+ */
+ if (ram_slots) {
+ nvdimm_build_ssdt(table_offsets, table_data, linker, dsm_dma_arrea,
+ ram_slots);
}
- nvdimm_build_nfit(device_list, table_offsets, table_data, linker);
- nvdimm_build_ssdt(device_list, table_offsets, table_data, linker,
- dsm_dma_arrea);
- g_slist_free(device_list);
}
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 93be96f..cec4b4e 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -2811,7 +2811,7 @@ void acpi_build(AcpiBuildTables *tables, MachineState
*machine)
}
if (pcms->acpi_nvdimm_state.is_enabled) {
nvdimm_build_acpi(table_offsets, tables_blob, tables->linker,
- pcms->acpi_nvdimm_state.dsm_mem);
+ pcms->acpi_nvdimm_state.dsm_mem, machine->ram_slots);
}
/* Add tables supplied by user (if any) */
--
MST
- Re: [Qemu-devel] [PULL 30/47] acpi nvdimm: fix device physical address base, (continued)
[Qemu-devel] [PULL 31/47] acpi nvdimm: fix ARG3 conflict, Michael S. Tsirkin, 2016/10/30
[Qemu-devel] [PULL 32/47] acpi nvdimm: fix Arg6 usage, Michael S. Tsirkin, 2016/10/30
[Qemu-devel] [PULL 34/47] acpi nvdimm: rename result_size to dsm_out_buf_siz, Michael S. Tsirkin, 2016/10/30
[Qemu-devel] [PULL 33/47] nvdimm acpi: compile nvdimm acpi code arch-independently, Michael S. Tsirkin, 2016/10/30
[Qemu-devel] [PULL 35/47] nvdimm acpi: use common macros instead of magic names, Michael S. Tsirkin, 2016/10/30
[Qemu-devel] [PULL 36/47] nvdimm acpi: prebuild nvdimm devices for available slots,
Michael S. Tsirkin <=
[Qemu-devel] [PULL 37/47] nvdimm acpi: introduce fit buffer, Michael S. Tsirkin, 2016/10/30
[Qemu-devel] [PULL 38/47] nvdimm acpi: introduce _FIT, Michael S. Tsirkin, 2016/10/30
[Qemu-devel] [PULL 39/47] pc: memhp: enable nvdimm device hotplug, Michael S. Tsirkin, 2016/10/30
[Qemu-devel] [PULL 40/47] ipmi: Remove hotplug from IPMI BMCs, Michael S. Tsirkin, 2016/10/30
[Qemu-devel] [PULL 41/47] ipmi_bmc_sim: Remove an unnecessary mutex, Michael S. Tsirkin, 2016/10/30
[Qemu-devel] [PULL 42/47] ipmi: chassis poweroff should use qemu_system_shutdown_request(), Michael S. Tsirkin, 2016/10/30