diff options
author | Xiao Guangrong | 2016-11-07 12:13:40 +0100 |
---|---|---|
committer | Michael S. Tsirkin | 2016-11-15 16:20:37 +0100 |
commit | 264813cb9d0eea199d48c6ea917060683685d1e0 (patch) | |
tree | 996a41bbdbbf0c62b98d7e1de3406bafd50b9f34 /hw/acpi | |
parent | pc: memhp: stop handling nvdimm hotplug in pc_dimm_unplug (diff) | |
download | qemu-264813cb9d0eea199d48c6ea917060683685d1e0.tar.gz qemu-264813cb9d0eea199d48c6ea917060683685d1e0.tar.xz qemu-264813cb9d0eea199d48c6ea917060683685d1e0.zip |
nvdimm acpi: clean up nvdimm_build_acpi
To make the code more clearer, we
1) check ram_slots first, and build ssdt & nfit only when it is available
2) use nvdimm_get_plugged_device_list() to check if there is nvdimm device
plugged
Suggested-by: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Diffstat (limited to 'hw/acpi')
-rw-r--r-- | hw/acpi/nvdimm.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c index 5156565112..65eb6c9567 100644 --- a/hw/acpi/nvdimm.c +++ b/hw/acpi/nvdimm.c @@ -392,12 +392,6 @@ static void nvdimm_build_nfit(AcpiNVDIMMState *state, GArray *table_offsets, NvdimmFitBuffer *fit_buf = &state->fit_buf; unsigned int header; - - /* NVDIMM device is not plugged? */ - if (!fit_buf->fit->len) { - return; - } - acpi_add_table(table_offsets, table_data); /* NFIT header. */ @@ -1275,14 +1269,22 @@ void nvdimm_build_acpi(GArray *table_offsets, GArray *table_data, BIOSLinker *linker, AcpiNVDIMMState *state, uint32_t ram_slots) { - nvdimm_build_nfit(state, table_offsets, table_data, linker); + GSList *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, state->dsm_mem, - ram_slots); + /* no nvdimm device can be plugged. */ + if (!ram_slots) { + return; } + + nvdimm_build_ssdt(table_offsets, table_data, linker, state->dsm_mem, + ram_slots); + + device_list = nvdimm_get_plugged_device_list(); + /* no NVDIMM device is plugged. */ + if (!device_list) { + return; + } + + nvdimm_build_nfit(state, table_offsets, table_data, linker); + g_slist_free(device_list); } |