Lines Matching +full:- +full:- +full:enable +full:- +full:fdt

4  * Copyright (c) 2019-2020, IBM Corporation.
30 #include "qemu/nvdimm-utils.h"
31 #include "hw/ppc/fdt.h"
34 #include "block/thread-pool.h"
37 #include "hw/qdev-properties.h"
55 #define TYPE_SPAPR_NVDIMM "spapr-nvdimm"
73 MemoryRegion *mr = host_memory_backend_get_memory(dimm->hostmem); in spapr_nvdimm_validate()
78 if (!mc->nvdimm_supported) { in spapr_nvdimm_validate()
83 if (!ms->nvdimms_state->is_enabled) { in spapr_nvdimm_validate()
90 error_setg(errp, "PAPR requires NVDIMM devices to have label-size set"); in spapr_nvdimm_validate()
113 error_setg(errp, "spapr-nvdimm device requires the " in spapr_nvdimm_validate()
114 "memdev %s to be of memory-backend-file type", in spapr_nvdimm_validate()
115 object_get_canonical_path_component(OBJECT(dimm->hostmem))); in spapr_nvdimm_validate()
132 * pc_dimm_get_free_slot() provided a free slot at pre-plug. The in spapr_add_nvdimm()
142 static int spapr_dt_nvdimm(SpaprMachineState *spapr, void *fdt, in spapr_dt_nvdimm() argument
153 uint64_t lsize = nvdimm->label_size; in spapr_dt_nvdimm()
163 child_offset = fdt_add_subnode(fdt, parent_offset, buf); in spapr_dt_nvdimm()
168 _FDT((fdt_setprop_cell(fdt, child_offset, "reg", drc_idx))); in spapr_dt_nvdimm()
169 _FDT((fdt_setprop_string(fdt, child_offset, "compatible", "ibm,pmemory"))); in spapr_dt_nvdimm()
170 _FDT((fdt_setprop_string(fdt, child_offset, "device_type", "ibm,pmemory"))); in spapr_dt_nvdimm()
172 spapr_numa_write_associativity_dt(spapr, fdt, child_offset, node); in spapr_dt_nvdimm()
174 buf = qemu_uuid_unparse_strdup(&nvdimm->uuid); in spapr_dt_nvdimm()
175 _FDT((fdt_setprop_string(fdt, child_offset, "ibm,unit-guid", buf))); in spapr_dt_nvdimm()
178 _FDT((fdt_setprop_cell(fdt, child_offset, "ibm,my-drc-index", drc_idx))); in spapr_dt_nvdimm()
180 _FDT((fdt_setprop_u64(fdt, child_offset, "ibm,block-size", in spapr_dt_nvdimm()
182 _FDT((fdt_setprop_u64(fdt, child_offset, "ibm,number-of-blocks", in spapr_dt_nvdimm()
184 _FDT((fdt_setprop_cell(fdt, child_offset, "ibm,metadata-size", lsize))); in spapr_dt_nvdimm()
186 _FDT((fdt_setprop_string(fdt, child_offset, "ibm,pmem-application", in spapr_dt_nvdimm()
187 "operating-system"))); in spapr_dt_nvdimm()
188 _FDT(fdt_setprop(fdt, child_offset, "ibm,cache-flush-required", NULL, 0)); in spapr_dt_nvdimm()
193 HostMemoryBackend *hostmem = dimm->hostmem; in spapr_dt_nvdimm()
197 "pmem-override", NULL); in spapr_dt_nvdimm()
199 _FDT(fdt_setprop(fdt, child_offset, "ibm,hcall-flush-required", in spapr_dt_nvdimm()
208 void *fdt, int *fdt_start_offset, Error **errp) in spapr_pmem_dt_populate() argument
210 NVDIMMDevice *nvdimm = NVDIMM(drc->dev); in spapr_pmem_dt_populate()
212 *fdt_start_offset = spapr_dt_nvdimm(spapr, fdt, 0, nvdimm); in spapr_pmem_dt_populate()
217 void spapr_dt_persistent_memory(SpaprMachineState *spapr, void *fdt) in spapr_dt_persistent_memory() argument
219 int offset = fdt_subnode_offset(fdt, 0, "ibm,persistent-memory"); in spapr_dt_persistent_memory()
223 offset = fdt_add_subnode(fdt, 0, "ibm,persistent-memory"); in spapr_dt_persistent_memory()
225 _FDT((fdt_setprop_cell(fdt, offset, "#address-cells", 0x1))); in spapr_dt_persistent_memory()
226 _FDT((fdt_setprop_cell(fdt, offset, "#size-cells", 0x0))); in spapr_dt_persistent_memory()
227 _FDT((fdt_setprop_string(fdt, offset, "device_type", in spapr_dt_persistent_memory()
228 "ibm,persistent-memory"))); in spapr_dt_persistent_memory()
232 for (iter = nvdimms; iter; iter = iter->next) { in spapr_dt_persistent_memory()
233 NVDIMMDevice *nvdimm = iter->data; in spapr_dt_persistent_memory()
235 spapr_dt_nvdimm(spapr, fdt, offset, nvdimm); in spapr_dt_persistent_memory()
254 if (!drc || !drc->dev || in h_scm_read_metadata()
264 nvdimm = NVDIMM(drc->dev); in h_scm_read_metadata()
266 (nvdimm->label_size < len + offset)) { in h_scm_read_metadata()
271 ddc->read_label_data(nvdimm, buf, len, offset); in h_scm_read_metadata()
309 if (!drc || !drc->dev || in h_scm_write_metadata()
319 nvdimm = NVDIMM(drc->dev); in h_scm_write_metadata()
321 (nvdimm->label_size < len + offset) || in h_scm_write_metadata()
322 nvdimm->readonly) { in h_scm_write_metadata()
353 ddc->write_label_data(nvdimm, buf, len, offset); in h_scm_write_metadata()
372 if (!drc || !drc->dev || in h_scm_bind_mem()
390 nvdimm = NVDIMM(drc->dev); in h_scm_bind_mem()
439 * The 'on' value for this property forced the qemu to enable the hcall
448 SpaprDrc *drc = spapr_drc_by_index(state->drcidx); in flush_worker_cb()
455 dimm = PC_DIMM(drc->dev); in flush_worker_cb()
456 backend = MEMORY_BACKEND(dimm->hostmem); in flush_worker_cb()
457 backend_fd = memory_region_get_fd(&backend->mr); in flush_worker_cb()
460 MemoryRegion *mr = host_memory_backend_get_memory(dimm->hostmem); in flush_worker_cb()
482 SpaprDrc *drc = spapr_drc_by_index(state->drcidx); in spapr_nvdimm_flush_completion_cb()
487 s_nvdimm = SPAPR_NVDIMM(drc->dev); in spapr_nvdimm_flush_completion_cb()
489 state->hcall_ret = hcall_ret; in spapr_nvdimm_flush_completion_cb()
491 QLIST_INSERT_HEAD(&s_nvdimm->completed_nvdimm_flush_states, state, node); in spapr_nvdimm_flush_completion_cb()
498 HostMemoryBackend *backend = MEMORY_BACKEND(PC_DIMM(s_nvdimm)->hostmem); in spapr_nvdimm_flush_post_load()
501 "pmem-override", NULL); in spapr_nvdimm_flush_post_load()
504 if (!s_nvdimm->hcall_flush_required && dest_hcall_flush_required) { in spapr_nvdimm_flush_post_load()
505 error_report("The file backend for the spapr-nvdimm device %s at " in spapr_nvdimm_flush_post_load()
506 "source is a pmem, use pmem=on and pmem-override=off to " in spapr_nvdimm_flush_post_load()
507 "continue.", DEVICE(s_nvdimm)->id); in spapr_nvdimm_flush_post_load()
508 return -EINVAL; in spapr_nvdimm_flush_post_load()
510 if (s_nvdimm->hcall_flush_required && !dest_hcall_flush_required) { in spapr_nvdimm_flush_post_load()
511 error_report("The guest expects hcall-flush support for the " in spapr_nvdimm_flush_post_load()
512 "spapr-nvdimm device %s, use pmem_override=on to " in spapr_nvdimm_flush_post_load()
513 "continue.", DEVICE(s_nvdimm)->id); in spapr_nvdimm_flush_post_load()
514 return -EINVAL; in spapr_nvdimm_flush_post_load()
517 QLIST_FOREACH(state, &s_nvdimm->pending_nvdimm_flush_states, node) { in spapr_nvdimm_flush_post_load()
565 spapr_nvdimm->nvdimm_flush_token++; in spapr_nvdimm_init_new_flush_state()
567 g_assert(spapr_nvdimm->nvdimm_flush_token != 0); in spapr_nvdimm_init_new_flush_state()
569 state->continue_token = spapr_nvdimm->nvdimm_flush_token; in spapr_nvdimm_init_new_flush_state()
571 QLIST_INSERT_HEAD(&spapr_nvdimm->pending_nvdimm_flush_states, state, node); in spapr_nvdimm_init_new_flush_state()
593 for (list = nvdimms; list; list = list->next) { in spapr_nvdimm_finish_flushes()
594 NVDIMMDevice *nvdimm = list->data; in spapr_nvdimm_finish_flushes()
597 while (!QLIST_EMPTY(&s_nvdimm->pending_nvdimm_flush_states)) { in spapr_nvdimm_finish_flushes()
601 QLIST_FOREACH_SAFE(state, &s_nvdimm->completed_nvdimm_flush_states, in spapr_nvdimm_finish_flushes()
621 QLIST_FOREACH(state, &s_nvdimm->pending_nvdimm_flush_states, node) { in spapr_nvdimm_get_flush_status()
622 if (state->continue_token == token) { in spapr_nvdimm_get_flush_status()
627 QLIST_FOREACH_SAFE(state, &s_nvdimm->completed_nvdimm_flush_states, in spapr_nvdimm_get_flush_status()
629 if (state->continue_token == token) { in spapr_nvdimm_get_flush_status()
630 int ret = state->hcall_ret; in spapr_nvdimm_get_flush_status()
643 * Input: drc_index, continue-token
644 * Out: continue-token
651 * continue-token from the output to be passed in the argument list of
667 if (!drc || !drc->dev || in h_scm_flush()
672 dimm = PC_DIMM(drc->dev); in h_scm_flush()
678 backend = MEMORY_BACKEND(dimm->hostmem); in h_scm_flush()
679 fd = memory_region_get_fd(&backend->mr); in h_scm_flush()
687 "pmem-override", NULL); in h_scm_flush()
697 state->drcidx = drc_index; in h_scm_flush()
702 continue_token = state->continue_token; in h_scm_flush()
727 if (!drc || !drc->dev || in h_scm_unbind_mem()
749 nvdimm = NVDIMM(drc->dev); in h_scm_unbind_mem()
789 if (!drc || !drc->dev || in h_scm_unbind_all()
794 nvdimm = NVDIMM(drc->dev); in h_scm_unbind_all()
803 for (list = nvdimms; list; list = list->next) { in h_scm_unbind_all()
804 nvdimm = list->data; in h_scm_unbind_all()
833 if (!drc || !drc->dev || in h_scm_health()
838 nvdimm = NVDIMM(drc->dev); in h_scm_health()
869 HostMemoryBackend *backend = MEMORY_BACKEND(PC_DIMM(dimm)->hostmem); in type_init()
871 bool pmem_override = object_property_get_bool(OBJECT(dimm), "pmem-override", in type_init()
874 s_nvdimm->hcall_flush_required = true; in type_init()
887 DEFINE_PROP_BOOL("pmem-override", SpaprNVDIMMDevice, pmem_override, false),
895 nvc->realize = spapr_nvdimm_realize; in spapr_nvdimm_class_init()
896 nvc->unrealize = spapr_nvdimm_unrealize; in spapr_nvdimm_class_init()
907 s_nvdimm->hcall_flush_required = false; in spapr_nvdimm_init()
908 QLIST_INIT(&s_nvdimm->pending_nvdimm_flush_states); in spapr_nvdimm_init()
909 QLIST_INIT(&s_nvdimm->completed_nvdimm_flush_states); in spapr_nvdimm_init()