Lines Matching refs:ndd

45 unsigned sizeof_namespace_label(struct nvdimm_drvdata *ndd)  in sizeof_namespace_label()  argument
47 return ndd->nslabel_size; in sizeof_namespace_label()
56 static int __nvdimm_num_label_slots(struct nvdimm_drvdata *ndd, in __nvdimm_num_label_slots() argument
59 return (ndd->nsarea.config_size - index_size * 2) / in __nvdimm_num_label_slots()
60 sizeof_namespace_label(ndd); in __nvdimm_num_label_slots()
63 int nvdimm_num_label_slots(struct nvdimm_drvdata *ndd) in nvdimm_num_label_slots() argument
67 tmp_nslot = ndd->nsarea.config_size / sizeof_namespace_label(ndd); in nvdimm_num_label_slots()
70 return __nvdimm_num_label_slots(ndd, NSINDEX_ALIGN * n); in nvdimm_num_label_slots()
73 size_t sizeof_namespace_index(struct nvdimm_drvdata *ndd) in sizeof_namespace_index() argument
83 nslot = nvdimm_num_label_slots(ndd); in sizeof_namespace_index()
84 space = ndd->nsarea.config_size - nslot * sizeof_namespace_label(ndd); in sizeof_namespace_index()
89 dev_err(ndd->dev, "label area (%d) too small to host (%d byte) labels\n", in sizeof_namespace_index()
90 ndd->nsarea.config_size, sizeof_namespace_label(ndd)); in sizeof_namespace_index()
94 static int __nd_label_validate(struct nvdimm_drvdata *ndd) in __nd_label_validate() argument
124 to_namespace_index(ndd, 0), in __nd_label_validate()
125 to_namespace_index(ndd, 1), in __nd_label_validate()
128 struct device *dev = ndd->dev; in __nd_label_validate()
153 if (labelsize != sizeof_namespace_label(ndd)) { in __nd_label_validate()
161 sum = nd_fletcher64(nsindex[i], sizeof_namespace_index(ndd), 1); in __nd_label_validate()
176 != i * sizeof_namespace_index(ndd)) { in __nd_label_validate()
183 != (!i) * sizeof_namespace_index(ndd)) { in __nd_label_validate()
190 != 2 * sizeof_namespace_index(ndd)) { in __nd_label_validate()
198 if (size > sizeof_namespace_index(ndd) in __nd_label_validate()
205 if (nslot * sizeof_namespace_label(ndd) in __nd_label_validate()
206 + 2 * sizeof_namespace_index(ndd) in __nd_label_validate()
207 > ndd->nsarea.config_size) { in __nd_label_validate()
209 i, nslot, ndd->nsarea.config_size); in __nd_label_validate()
240 static int nd_label_validate(struct nvdimm_drvdata *ndd) in nd_label_validate() argument
254 ndd->nslabel_size = label_size[i]; in nd_label_validate()
255 rc = __nd_label_validate(ndd); in nd_label_validate()
263 static void nd_label_copy(struct nvdimm_drvdata *ndd, in nd_label_copy() argument
271 memcpy(dst, src, sizeof_namespace_index(ndd)); in nd_label_copy()
274 static struct nd_namespace_label *nd_label_base(struct nvdimm_drvdata *ndd) in nd_label_base() argument
276 void *base = to_namespace_index(ndd, 0); in nd_label_base()
278 return base + 2 * sizeof_namespace_index(ndd); in nd_label_base()
281 static int to_slot(struct nvdimm_drvdata *ndd, in to_slot() argument
287 base = (unsigned long) nd_label_base(ndd); in to_slot()
289 return (label - base) / sizeof_namespace_label(ndd); in to_slot()
292 static struct nd_namespace_label *to_label(struct nvdimm_drvdata *ndd, int slot) in to_label() argument
296 base = (unsigned long) nd_label_base(ndd); in to_label()
297 label = base + sizeof_namespace_label(ndd) * slot; in to_label()
315 static bool preamble_index(struct nvdimm_drvdata *ndd, int idx, in preamble_index() argument
321 nsindex = to_namespace_index(ndd, idx); in preamble_index()
341 static bool preamble_current(struct nvdimm_drvdata *ndd, in preamble_current() argument
345 return preamble_index(ndd, ndd->ns_current, nsindex, in preamble_current()
349 static bool preamble_next(struct nvdimm_drvdata *ndd, in preamble_next() argument
353 return preamble_index(ndd, ndd->ns_next, nsindex, in preamble_next()
357 static bool nsl_validate_checksum(struct nvdimm_drvdata *ndd, in nsl_validate_checksum() argument
362 if (!ndd->cxl && !efi_namespace_label_has(ndd, checksum)) in nsl_validate_checksum()
365 sum_save = nsl_get_checksum(ndd, nd_label); in nsl_validate_checksum()
366 nsl_set_checksum(ndd, nd_label, 0); in nsl_validate_checksum()
367 sum = nd_fletcher64(nd_label, sizeof_namespace_label(ndd), 1); in nsl_validate_checksum()
368 nsl_set_checksum(ndd, nd_label, sum_save); in nsl_validate_checksum()
372 static void nsl_calculate_checksum(struct nvdimm_drvdata *ndd, in nsl_calculate_checksum() argument
377 if (!ndd->cxl && !efi_namespace_label_has(ndd, checksum)) in nsl_calculate_checksum()
379 nsl_set_checksum(ndd, nd_label, 0); in nsl_calculate_checksum()
380 sum = nd_fletcher64(nd_label, sizeof_namespace_label(ndd), 1); in nsl_calculate_checksum()
381 nsl_set_checksum(ndd, nd_label, sum); in nsl_calculate_checksum()
384 static bool slot_valid(struct nvdimm_drvdata *ndd, in slot_valid() argument
390 if (slot != nsl_get_slot(ndd, nd_label)) in slot_valid()
392 valid = nsl_validate_checksum(ndd, nd_label); in slot_valid()
394 dev_dbg(ndd->dev, "fail checksum. slot: %d\n", slot); in slot_valid()
398 int nd_label_reserve_dpa(struct nvdimm_drvdata *ndd) in nd_label_reserve_dpa() argument
404 if (!preamble_current(ndd, &nsindex, &free, &nslot)) in nd_label_reserve_dpa()
415 nd_label = to_label(ndd, slot); in nd_label_reserve_dpa()
417 if (!slot_valid(ndd, nd_label, slot)) in nd_label_reserve_dpa()
420 nsl_get_uuid(ndd, nd_label, &label_uuid); in nd_label_reserve_dpa()
421 flags = nsl_get_flags(ndd, nd_label); in nd_label_reserve_dpa()
423 res = nvdimm_allocate_dpa(ndd, &label_id, in nd_label_reserve_dpa()
424 nsl_get_dpa(ndd, nd_label), in nd_label_reserve_dpa()
425 nsl_get_rawsize(ndd, nd_label)); in nd_label_reserve_dpa()
426 nd_dbg_dpa(nd_region, ndd, res, "reserve\n"); in nd_label_reserve_dpa()
434 int nd_label_data_init(struct nvdimm_drvdata *ndd) in nd_label_data_init() argument
442 if (ndd->data) in nd_label_data_init()
445 if (ndd->nsarea.status || ndd->nsarea.max_xfer == 0) { in nd_label_data_init()
446 dev_dbg(ndd->dev, "failed to init config data area: (%u:%u)\n", in nd_label_data_init()
447 ndd->nsarea.max_xfer, ndd->nsarea.config_size); in nd_label_data_init()
461 ndd->nslabel_size = 128; in nd_label_data_init()
462 read_size = sizeof_namespace_index(ndd) * 2; in nd_label_data_init()
467 config_size = ndd->nsarea.config_size; in nd_label_data_init()
468 ndd->data = kvzalloc(config_size, GFP_KERNEL); in nd_label_data_init()
469 if (!ndd->data) in nd_label_data_init()
479 max_xfer = min_t(size_t, ndd->nsarea.max_xfer, config_size); in nd_label_data_init()
494 rc = nvdimm_get_config_data(ndd, ndd->data, 0, read_size); in nd_label_data_init()
499 ndd->ns_current = nd_label_validate(ndd); in nd_label_data_init()
500 if (ndd->ns_current < 0) in nd_label_data_init()
504 ndd->ns_next = nd_label_next_nsindex(ndd->ns_current); in nd_label_data_init()
507 nsindex = to_current_namespace_index(ndd); in nd_label_data_init()
508 nd_label_copy(ndd, to_next_namespace_index(ndd), nsindex); in nd_label_data_init()
515 for (i = 0; i < nslot; i++, offset += ndd->nslabel_size) { in nd_label_data_init()
520 memset(ndd->data + offset, 0, ndd->nslabel_size); in nd_label_data_init()
525 if (offset + ndd->nslabel_size <= read_size) in nd_label_data_init()
533 label_read_size = offset + ndd->nslabel_size - read_size; in nd_label_data_init()
542 rc = nvdimm_get_config_data(ndd, ndd->data + read_size, in nd_label_data_init()
551 dev_dbg(ndd->dev, "len: %zu rc: %d\n", offset, rc); in nd_label_data_init()
556 int nd_label_active_count(struct nvdimm_drvdata *ndd) in nd_label_active_count() argument
563 if (!preamble_current(ndd, &nsindex, &free, &nslot)) in nd_label_active_count()
569 nd_label = to_label(ndd, slot); in nd_label_active_count()
571 if (!slot_valid(ndd, nd_label, slot)) { in nd_label_active_count()
572 u32 label_slot = nsl_get_slot(ndd, nd_label); in nd_label_active_count()
573 u64 size = nsl_get_rawsize(ndd, nd_label); in nd_label_active_count()
574 u64 dpa = nsl_get_dpa(ndd, nd_label); in nd_label_active_count()
576 dev_dbg(ndd->dev, in nd_label_active_count()
586 struct nd_namespace_label *nd_label_active(struct nvdimm_drvdata *ndd, int n) in nd_label_active() argument
592 if (!preamble_current(ndd, &nsindex, &free, &nslot)) in nd_label_active()
598 nd_label = to_label(ndd, slot); in nd_label_active()
599 if (!slot_valid(ndd, nd_label, slot)) in nd_label_active()
603 return to_label(ndd, slot); in nd_label_active()
609 u32 nd_label_alloc_slot(struct nvdimm_drvdata *ndd) in nd_label_alloc_slot() argument
615 if (!preamble_next(ndd, &nsindex, &free, &nslot)) in nd_label_alloc_slot()
618 WARN_ON(!is_nvdimm_bus_locked(ndd->dev)); in nd_label_alloc_slot()
629 bool nd_label_free_slot(struct nvdimm_drvdata *ndd, u32 slot) in nd_label_free_slot() argument
635 if (!preamble_next(ndd, &nsindex, &free, &nslot)) in nd_label_free_slot()
638 WARN_ON(!is_nvdimm_bus_locked(ndd->dev)); in nd_label_free_slot()
645 u32 nd_label_nfree(struct nvdimm_drvdata *ndd) in nd_label_nfree() argument
651 WARN_ON(!is_nvdimm_bus_locked(ndd->dev)); in nd_label_nfree()
653 if (!preamble_next(ndd, &nsindex, &free, &nslot)) in nd_label_nfree()
654 return nvdimm_num_label_slots(ndd); in nd_label_nfree()
659 static int nd_label_write_index(struct nvdimm_drvdata *ndd, int index, u32 seq, in nd_label_write_index() argument
668 nsindex = to_namespace_index(ndd, index); in nd_label_write_index()
670 nslot = nvdimm_num_label_slots(ndd); in nd_label_write_index()
676 nsindex->labelsize = sizeof_namespace_label(ndd) >> 8; in nd_label_write_index()
679 - (unsigned long) to_namespace_index(ndd, 0); in nd_label_write_index()
681 nsindex->mysize = __cpu_to_le64(sizeof_namespace_index(ndd)); in nd_label_write_index()
682 offset = (unsigned long) to_namespace_index(ndd, in nd_label_write_index()
684 - (unsigned long) to_namespace_index(ndd, 0); in nd_label_write_index()
686 offset = (unsigned long) nd_label_base(ndd) in nd_label_write_index()
687 - (unsigned long) to_namespace_index(ndd, 0); in nd_label_write_index()
691 if (sizeof_namespace_label(ndd) < 256) in nd_label_write_index()
705 checksum = nd_fletcher64(nsindex, sizeof_namespace_index(ndd), 1); in nd_label_write_index()
707 rc = nvdimm_set_config_data(ndd, __le64_to_cpu(nsindex->myoff), in nd_label_write_index()
708 nsindex, sizeof_namespace_index(ndd)); in nd_label_write_index()
716 WARN_ON(index != ndd->ns_next); in nd_label_write_index()
717 nd_label_copy(ndd, to_current_namespace_index(ndd), nsindex); in nd_label_write_index()
718 ndd->ns_current = nd_label_next_nsindex(ndd->ns_current); in nd_label_write_index()
719 ndd->ns_next = nd_label_next_nsindex(ndd->ns_next); in nd_label_write_index()
720 WARN_ON(ndd->ns_current == ndd->ns_next); in nd_label_write_index()
725 static unsigned long nd_label_offset(struct nvdimm_drvdata *ndd, in nd_label_offset() argument
729 - (unsigned long) to_namespace_index(ndd, 0); in nd_label_offset()
811 struct nvdimm_drvdata *ndd = to_ndd(nd_mapping); in reap_victim() local
812 u32 slot = to_slot(ndd, victim->label); in reap_victim()
814 dev_dbg(ndd->dev, "free: %d\n", slot); in reap_victim()
815 nd_label_free_slot(ndd, slot); in reap_victim()
819 static void nsl_set_type_guid(struct nvdimm_drvdata *ndd, in nsl_set_type_guid() argument
822 if (efi_namespace_label_has(ndd, type_guid)) in nsl_set_type_guid()
826 bool nsl_validate_type_guid(struct nvdimm_drvdata *ndd, in nsl_validate_type_guid() argument
829 if (ndd->cxl || !efi_namespace_label_has(ndd, type_guid)) in nsl_validate_type_guid()
832 dev_dbg(ndd->dev, "expect type_guid %pUb got %pUb\n", guid, in nsl_validate_type_guid()
839 static void nsl_set_claim_class(struct nvdimm_drvdata *ndd, in nsl_set_claim_class() argument
843 if (ndd->cxl) { in nsl_set_claim_class()
852 if (!efi_namespace_label_has(ndd, abstraction_guid)) in nsl_set_claim_class()
859 enum nvdimm_claim_class nsl_get_claim_class(struct nvdimm_drvdata *ndd, in nsl_get_claim_class() argument
862 if (ndd->cxl) { in nsl_get_claim_class()
868 if (!efi_namespace_label_has(ndd, abstraction_guid)) in nsl_get_claim_class()
879 struct nvdimm_drvdata *ndd = to_ndd(nd_mapping); in __pmem_label_update() local
891 if (!preamble_next(ndd, &nsindex, &free, &nslot)) in __pmem_label_update()
896 for_each_dpa_resource(ndd, res) in __pmem_label_update()
906 slot = nd_label_alloc_slot(ndd); in __pmem_label_update()
909 dev_dbg(ndd->dev, "allocated: %d\n", slot); in __pmem_label_update()
911 nd_label = to_label(ndd, slot); in __pmem_label_update()
912 memset(nd_label, 0, sizeof_namespace_label(ndd)); in __pmem_label_update()
913 nsl_set_uuid(ndd, nd_label, nspm->uuid); in __pmem_label_update()
914 nsl_set_name(ndd, nd_label, nspm->alt_name); in __pmem_label_update()
915 nsl_set_flags(ndd, nd_label, flags); in __pmem_label_update()
916 nsl_set_nlabel(ndd, nd_label, nd_region->ndr_mappings); in __pmem_label_update()
917 nsl_set_nrange(ndd, nd_label, 1); in __pmem_label_update()
918 nsl_set_position(ndd, nd_label, pos); in __pmem_label_update()
919 nsl_set_isetcookie(ndd, nd_label, cookie); in __pmem_label_update()
920 nsl_set_rawsize(ndd, nd_label, resource_size(res)); in __pmem_label_update()
921 nsl_set_lbasize(ndd, nd_label, nspm->lbasize); in __pmem_label_update()
922 nsl_set_dpa(ndd, nd_label, res->start); in __pmem_label_update()
923 nsl_set_slot(ndd, nd_label, slot); in __pmem_label_update()
924 nsl_set_type_guid(ndd, nd_label, &nd_set->type_guid); in __pmem_label_update()
925 nsl_set_claim_class(ndd, nd_label, ndns->claim_class); in __pmem_label_update()
926 nsl_calculate_checksum(ndd, nd_label); in __pmem_label_update()
927 nd_dbg_dpa(nd_region, ndd, res, "\n"); in __pmem_label_update()
930 offset = nd_label_offset(ndd, nd_label); in __pmem_label_update()
931 rc = nvdimm_set_config_data(ndd, offset, nd_label, in __pmem_label_update()
932 sizeof_namespace_label(ndd)); in __pmem_label_update()
942 nsl_uuid_equal(ndd, label_ent->label, nspm->uuid)) in __pmem_label_update()
947 rc = nd_label_write_index(ndd, ndd->ns_next, in __pmem_label_update()
958 to_slot(ndd, nd_label)); in __pmem_label_update()
972 struct nvdimm_drvdata *ndd = to_ndd(nd_mapping); in init_labels() local
992 if (ndd->ns_current == -1 || ndd->ns_next == -1) in init_labels()
997 nsindex = to_namespace_index(ndd, 0); in init_labels()
998 memset(nsindex, 0, ndd->nsarea.config_size); in init_labels()
1000 int rc = nd_label_write_index(ndd, i, 3 - i, ND_NSINDEX_INIT); in init_labels()
1005 ndd->ns_next = 1; in init_labels()
1006 ndd->ns_current = 0; in init_labels()
1013 struct nvdimm_drvdata *ndd = to_ndd(nd_mapping); in del_labels() local
1025 if (!preamble_next(ndd, &nsindex, &free, &nslot)) in del_labels()
1035 if (!nsl_uuid_equal(ndd, nd_label, uuid)) in del_labels()
1038 slot = to_slot(ndd, nd_label); in del_labels()
1039 nd_label_free_slot(ndd, slot); in del_labels()
1040 dev_dbg(ndd->dev, "free: %d\n", slot); in del_labels()
1048 dev_dbg(ndd->dev, "no more active labels\n"); in del_labels()
1052 return nd_label_write_index(ndd, ndd->ns_next, in del_labels()
1063 struct nvdimm_drvdata *ndd = to_ndd(nd_mapping); in nd_pmem_namespace_label_update() local
1074 for_each_dpa_resource(ndd, res) in nd_pmem_namespace_label_update()