diff options
author | hyokeun <hyokeun.jeon@samsung.com> | 2016-12-27 17:29:09 +0900 |
---|---|---|
committer | hyokeun <hyokeun.jeon@samsung.com> | 2016-12-27 17:29:09 +0900 |
commit | 2a84d37c88d606fda46a565bcc80e173b4d0a80a (patch) | |
tree | 8b755bb78271e76e13fb7db38b670dbc443479e7 /hw/mem | |
parent | bd54c25035217800f3b1d39f6472d599cd602d5a (diff) | |
download | qemu-upstream.tar.gz qemu-upstream.tar.bz2 qemu-upstream.zip |
Imported Upstream version 2.6.1upstream/2.6.1upstream
Diffstat (limited to 'hw/mem')
-rw-r--r-- | hw/mem/nvdimm.c | 133 | ||||
-rw-r--r-- | hw/mem/pc-dimm.c | 40 |
2 files changed, 10 insertions, 163 deletions
diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c index 7895805a2..0a602f28b 100644 --- a/hw/mem/nvdimm.c +++ b/hw/mem/nvdimm.c @@ -23,153 +23,20 @@ */ #include "qemu/osdep.h" -#include "qapi/error.h" -#include "qapi/visitor.h" #include "hw/mem/nvdimm.h" -static void nvdimm_get_label_size(Object *obj, Visitor *v, const char *name, - void *opaque, Error **errp) -{ - NVDIMMDevice *nvdimm = NVDIMM(obj); - uint64_t value = nvdimm->label_size; - - visit_type_size(v, name, &value, errp); -} - -static void nvdimm_set_label_size(Object *obj, Visitor *v, const char *name, - void *opaque, Error **errp) -{ - NVDIMMDevice *nvdimm = NVDIMM(obj); - Error *local_err = NULL; - uint64_t value; - - if (memory_region_size(&nvdimm->nvdimm_mr)) { - error_setg(&local_err, "cannot change property value"); - goto out; - } - - visit_type_size(v, name, &value, &local_err); - if (local_err) { - goto out; - } - if (value < MIN_NAMESPACE_LABEL_SIZE) { - error_setg(&local_err, "Property '%s.%s' (0x%" PRIx64 ") is required" - " at least 0x%lx", object_get_typename(obj), - name, value, MIN_NAMESPACE_LABEL_SIZE); - goto out; - } - - nvdimm->label_size = value; -out: - error_propagate(errp, local_err); -} - -static void nvdimm_init(Object *obj) -{ - object_property_add(obj, "label-size", "int", - nvdimm_get_label_size, nvdimm_set_label_size, NULL, - NULL, NULL); -} - -static MemoryRegion *nvdimm_get_memory_region(PCDIMMDevice *dimm) -{ - NVDIMMDevice *nvdimm = NVDIMM(dimm); - - return &nvdimm->nvdimm_mr; -} - -static void nvdimm_realize(PCDIMMDevice *dimm, Error **errp) -{ - MemoryRegion *mr = host_memory_backend_get_memory(dimm->hostmem, errp); - NVDIMMDevice *nvdimm = NVDIMM(dimm); - uint64_t align, pmem_size, size = memory_region_size(mr); - - align = memory_region_get_alignment(mr); - - pmem_size = size - nvdimm->label_size; - nvdimm->label_data = memory_region_get_ram_ptr(mr) + pmem_size; - pmem_size = QEMU_ALIGN_DOWN(pmem_size, align); - - if (size <= nvdimm->label_size || !pmem_size) { - HostMemoryBackend *hostmem = dimm->hostmem; - char *path = object_get_canonical_path_component(OBJECT(hostmem)); - - error_setg(errp, "the size of memdev %s (0x%" PRIx64 ") is too " - "small to contain nvdimm label (0x%" PRIx64 ") and " - "aligned PMEM (0x%" PRIx64 ")", - path, memory_region_size(mr), nvdimm->label_size, align); - g_free(path); - return; - } - - memory_region_init_alias(&nvdimm->nvdimm_mr, OBJECT(dimm), - "nvdimm-memory", mr, 0, pmem_size); - nvdimm->nvdimm_mr.align = align; -} - -/* - * the caller should check the input parameters before calling - * label read/write functions. - */ -static void nvdimm_validate_rw_label_data(NVDIMMDevice *nvdimm, uint64_t size, - uint64_t offset) -{ - assert((nvdimm->label_size >= size + offset) && (offset + size > offset)); -} - -static void nvdimm_read_label_data(NVDIMMDevice *nvdimm, void *buf, - uint64_t size, uint64_t offset) -{ - nvdimm_validate_rw_label_data(nvdimm, size, offset); - - memcpy(buf, nvdimm->label_data + offset, size); -} - -static void nvdimm_write_label_data(NVDIMMDevice *nvdimm, const void *buf, - uint64_t size, uint64_t offset) -{ - MemoryRegion *mr; - PCDIMMDevice *dimm = PC_DIMM(nvdimm); - uint64_t backend_offset; - - nvdimm_validate_rw_label_data(nvdimm, size, offset); - - memcpy(nvdimm->label_data + offset, buf, size); - - mr = host_memory_backend_get_memory(dimm->hostmem, &error_abort); - backend_offset = memory_region_size(mr) - nvdimm->label_size + offset; - memory_region_set_dirty(mr, backend_offset, size); -} - -static MemoryRegion *nvdimm_get_vmstate_memory_region(PCDIMMDevice *dimm) -{ - return host_memory_backend_get_memory(dimm->hostmem, &error_abort); -} - static void nvdimm_class_init(ObjectClass *oc, void *data) { DeviceClass *dc = DEVICE_CLASS(oc); - PCDIMMDeviceClass *ddc = PC_DIMM_CLASS(oc); - NVDIMMClass *nvc = NVDIMM_CLASS(oc); /* nvdimm hotplug has not been supported yet. */ dc->hotpluggable = false; - - ddc->realize = nvdimm_realize; - ddc->get_memory_region = nvdimm_get_memory_region; - ddc->get_vmstate_memory_region = nvdimm_get_vmstate_memory_region; - - nvc->read_label_data = nvdimm_read_label_data; - nvc->write_label_data = nvdimm_write_label_data; } static TypeInfo nvdimm_info = { .name = TYPE_NVDIMM, .parent = TYPE_PC_DIMM, - .class_size = sizeof(NVDIMMClass), .class_init = nvdimm_class_init, - .instance_size = sizeof(NVDIMMDevice), - .instance_init = nvdimm_init, }; static void nvdimm_register_types(void) diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c index 9e8dab0e8..9e7de5682 100644 --- a/hw/mem/pc-dimm.c +++ b/hw/mem/pc-dimm.c @@ -40,8 +40,6 @@ void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms, int slot; MachineState *machine = MACHINE(qdev_get_machine()); PCDIMMDevice *dimm = PC_DIMM(dev); - PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm); - MemoryRegion *vmstate_mr = ddc->get_vmstate_memory_region(dimm); Error *local_err = NULL; uint64_t existing_dimms_capacity = 0; uint64_t addr; @@ -107,7 +105,7 @@ void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms, } memory_region_add_subregion(&hpms->mr, addr - hpms->base, mr); - vmstate_register_ram(vmstate_mr, dev); + vmstate_register_ram(mr, dev); numa_set_mem_node_id(addr, memory_region_size(mr), dimm->node); out: @@ -118,12 +116,10 @@ void pc_dimm_memory_unplug(DeviceState *dev, MemoryHotplugState *hpms, MemoryRegion *mr) { PCDIMMDevice *dimm = PC_DIMM(dev); - PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm); - MemoryRegion *vmstate_mr = ddc->get_vmstate_memory_region(dimm); numa_unset_mem_node_id(dimm->addr, memory_region_size(mr), dimm->node); memory_region_del_subregion(&hpms->mr, mr); - vmstate_unregister_ram(vmstate_mr, dev); + vmstate_unregister_ram(mr, dev); } static int pc_existing_dimms_capacity_internal(Object *obj, void *opaque) @@ -358,9 +354,8 @@ static void pc_dimm_get_size(Object *obj, Visitor *v, const char *name, int64_t value; MemoryRegion *mr; PCDIMMDevice *dimm = PC_DIMM(obj); - PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(obj); - mr = ddc->get_memory_region(dimm); + mr = host_memory_backend_get_memory(dimm->hostmem, errp); value = memory_region_size(mr); visit_type_int(v, name, &value, errp); @@ -369,9 +364,14 @@ static void pc_dimm_get_size(Object *obj, Visitor *v, const char *name, static void pc_dimm_check_memdev_is_busy(Object *obj, const char *name, Object *val, Error **errp) { + MemoryRegion *mr; Error *local_err = NULL; - if (host_memory_backend_is_mapped(MEMORY_BACKEND(val))) { + mr = host_memory_backend_get_memory(MEMORY_BACKEND(val), &local_err); + if (local_err) { + goto out; + } + if (memory_region_is_mapped(mr)) { char *path = object_get_canonical_path_component(val); error_setg(&local_err, "can't use already busy memdev: %s", path); g_free(path); @@ -379,6 +379,7 @@ static void pc_dimm_check_memdev_is_busy(Object *obj, const char *name, qdev_prop_allow_set_link_before_realize(obj, name, val, &local_err); } +out: error_propagate(errp, local_err); } @@ -398,7 +399,6 @@ static void pc_dimm_init(Object *obj) static void pc_dimm_realize(DeviceState *dev, Error **errp) { PCDIMMDevice *dimm = PC_DIMM(dev); - PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm); if (!dimm->hostmem) { error_setg(errp, "'" PC_DIMM_MEMDEV_PROP "' property is not set"); @@ -411,19 +411,6 @@ static void pc_dimm_realize(DeviceState *dev, Error **errp) dimm->node, nb_numa_nodes ? nb_numa_nodes : 1); return; } - - if (ddc->realize) { - ddc->realize(dimm, errp); - } - - host_memory_backend_set_mapped(dimm->hostmem, true); -} - -static void pc_dimm_unrealize(DeviceState *dev, Error **errp) -{ - PCDIMMDevice *dimm = PC_DIMM(dev); - - host_memory_backend_set_mapped(dimm->hostmem, false); } static MemoryRegion *pc_dimm_get_memory_region(PCDIMMDevice *dimm) @@ -431,23 +418,16 @@ static MemoryRegion *pc_dimm_get_memory_region(PCDIMMDevice *dimm) return host_memory_backend_get_memory(dimm->hostmem, &error_abort); } -static MemoryRegion *pc_dimm_get_vmstate_memory_region(PCDIMMDevice *dimm) -{ - return host_memory_backend_get_memory(dimm->hostmem, &error_abort); -} - static void pc_dimm_class_init(ObjectClass *oc, void *data) { DeviceClass *dc = DEVICE_CLASS(oc); PCDIMMDeviceClass *ddc = PC_DIMM_CLASS(oc); dc->realize = pc_dimm_realize; - dc->unrealize = pc_dimm_unrealize; dc->props = pc_dimm_properties; dc->desc = "DIMM memory module"; ddc->get_memory_region = pc_dimm_get_memory_region; - ddc->get_vmstate_memory_region = pc_dimm_get_vmstate_memory_region; } static TypeInfo pc_dimm_info = { |