Lines Matching refs:ndd

37 unsigned sizeof_namespace_label(struct nvdimm_drvdata *ndd)  in sizeof_namespace_label()  argument
39 return ndd->nslabel_size; in sizeof_namespace_label()
48 static int __nvdimm_num_label_slots(struct nvdimm_drvdata *ndd, in __nvdimm_num_label_slots() argument
51 return (ndd->nsarea.config_size - index_size * 2) / in __nvdimm_num_label_slots()
52 sizeof_namespace_label(ndd); in __nvdimm_num_label_slots()
55 int nvdimm_num_label_slots(struct nvdimm_drvdata *ndd) in nvdimm_num_label_slots() argument
59 tmp_nslot = ndd->nsarea.config_size / sizeof_namespace_label(ndd); in nvdimm_num_label_slots()
62 return __nvdimm_num_label_slots(ndd, NSINDEX_ALIGN * n); in nvdimm_num_label_slots()
65 size_t sizeof_namespace_index(struct nvdimm_drvdata *ndd) in sizeof_namespace_index() argument
75 nslot = nvdimm_num_label_slots(ndd); in sizeof_namespace_index()
76 space = ndd->nsarea.config_size - nslot * sizeof_namespace_label(ndd); in sizeof_namespace_index()
81 dev_err(ndd->dev, "label area (%d) too small to host (%d byte) labels\n", in sizeof_namespace_index()
82 ndd->nsarea.config_size, sizeof_namespace_label(ndd)); in sizeof_namespace_index()
86 static int __nd_label_validate(struct nvdimm_drvdata *ndd) in __nd_label_validate() argument
116 to_namespace_index(ndd, 0), in __nd_label_validate()
117 to_namespace_index(ndd, 1), in __nd_label_validate()
120 struct device *dev = ndd->dev; in __nd_label_validate()
145 if (labelsize != sizeof_namespace_label(ndd)) { in __nd_label_validate()
153 sum = nd_fletcher64(nsindex[i], sizeof_namespace_index(ndd), 1); in __nd_label_validate()
168 != i * sizeof_namespace_index(ndd)) { in __nd_label_validate()
175 != (!i) * sizeof_namespace_index(ndd)) { in __nd_label_validate()
182 != 2 * sizeof_namespace_index(ndd)) { in __nd_label_validate()
190 if (size > sizeof_namespace_index(ndd) in __nd_label_validate()
197 if (nslot * sizeof_namespace_label(ndd) in __nd_label_validate()
198 + 2 * sizeof_namespace_index(ndd) in __nd_label_validate()
199 > ndd->nsarea.config_size) { in __nd_label_validate()
201 i, nslot, ndd->nsarea.config_size); in __nd_label_validate()
232 static int nd_label_validate(struct nvdimm_drvdata *ndd) in nd_label_validate() argument
246 ndd->nslabel_size = label_size[i]; in nd_label_validate()
247 rc = __nd_label_validate(ndd); in nd_label_validate()
255 static void nd_label_copy(struct nvdimm_drvdata *ndd, in nd_label_copy() argument
263 memcpy(dst, src, sizeof_namespace_index(ndd)); in nd_label_copy()
266 static struct nd_namespace_label *nd_label_base(struct nvdimm_drvdata *ndd) in nd_label_base() argument
268 void *base = to_namespace_index(ndd, 0); in nd_label_base()
270 return base + 2 * sizeof_namespace_index(ndd); in nd_label_base()
273 static int to_slot(struct nvdimm_drvdata *ndd, in to_slot() argument
279 base = (unsigned long) nd_label_base(ndd); in to_slot()
281 return (label - base) / sizeof_namespace_label(ndd); in to_slot()
284 static struct nd_namespace_label *to_label(struct nvdimm_drvdata *ndd, int slot) in to_label() argument
288 base = (unsigned long) nd_label_base(ndd); in to_label()
289 label = base + sizeof_namespace_label(ndd) * slot; in to_label()
307 static bool preamble_index(struct nvdimm_drvdata *ndd, int idx, in preamble_index() argument
313 nsindex = to_namespace_index(ndd, idx); in preamble_index()
333 static bool preamble_current(struct nvdimm_drvdata *ndd, in preamble_current() argument
337 return preamble_index(ndd, ndd->ns_current, nsindex, in preamble_current()
341 static bool preamble_next(struct nvdimm_drvdata *ndd, in preamble_next() argument
345 return preamble_index(ndd, ndd->ns_next, nsindex, in preamble_next()
349 static bool nsl_validate_checksum(struct nvdimm_drvdata *ndd, in nsl_validate_checksum() argument
354 if (!namespace_label_has(ndd, checksum)) in nsl_validate_checksum()
357 sum_save = nsl_get_checksum(ndd, nd_label); in nsl_validate_checksum()
358 nsl_set_checksum(ndd, nd_label, 0); in nsl_validate_checksum()
359 sum = nd_fletcher64(nd_label, sizeof_namespace_label(ndd), 1); in nsl_validate_checksum()
360 nsl_set_checksum(ndd, nd_label, sum_save); in nsl_validate_checksum()
364 static void nsl_calculate_checksum(struct nvdimm_drvdata *ndd, in nsl_calculate_checksum() argument
369 if (!namespace_label_has(ndd, checksum)) in nsl_calculate_checksum()
371 nsl_set_checksum(ndd, nd_label, 0); in nsl_calculate_checksum()
372 sum = nd_fletcher64(nd_label, sizeof_namespace_label(ndd), 1); in nsl_calculate_checksum()
373 nsl_set_checksum(ndd, nd_label, sum); in nsl_calculate_checksum()
376 static bool slot_valid(struct nvdimm_drvdata *ndd, in slot_valid() argument
382 if (slot != nsl_get_slot(ndd, nd_label)) in slot_valid()
384 valid = nsl_validate_checksum(ndd, nd_label); in slot_valid()
386 dev_dbg(ndd->dev, "fail checksum. slot: %d\n", slot); in slot_valid()
390 int nd_label_reserve_dpa(struct nvdimm_drvdata *ndd) in nd_label_reserve_dpa() argument
396 if (!preamble_current(ndd, &nsindex, &free, &nslot)) in nd_label_reserve_dpa()
400 struct nvdimm *nvdimm = to_nvdimm(ndd->dev); in nd_label_reserve_dpa()
408 nd_label = to_label(ndd, slot); in nd_label_reserve_dpa()
410 if (!slot_valid(ndd, nd_label, slot)) in nd_label_reserve_dpa()
414 flags = nsl_get_flags(ndd, nd_label); in nd_label_reserve_dpa()
418 res = nvdimm_allocate_dpa(ndd, &label_id, in nd_label_reserve_dpa()
419 nsl_get_dpa(ndd, nd_label), in nd_label_reserve_dpa()
420 nsl_get_rawsize(ndd, nd_label)); in nd_label_reserve_dpa()
421 nd_dbg_dpa(nd_region, ndd, res, "reserve\n"); in nd_label_reserve_dpa()
429 int nd_label_data_init(struct nvdimm_drvdata *ndd) in nd_label_data_init() argument
437 if (ndd->data) in nd_label_data_init()
440 if (ndd->nsarea.status || ndd->nsarea.max_xfer == 0) { in nd_label_data_init()
441 dev_dbg(ndd->dev, "failed to init config data area: (%u:%u)\n", in nd_label_data_init()
442 ndd->nsarea.max_xfer, ndd->nsarea.config_size); in nd_label_data_init()
456 ndd->nslabel_size = 128; in nd_label_data_init()
457 read_size = sizeof_namespace_index(ndd) * 2; in nd_label_data_init()
462 config_size = ndd->nsarea.config_size; in nd_label_data_init()
463 ndd->data = kvzalloc(config_size, GFP_KERNEL); in nd_label_data_init()
464 if (!ndd->data) in nd_label_data_init()
474 max_xfer = min_t(size_t, ndd->nsarea.max_xfer, config_size); in nd_label_data_init()
489 rc = nvdimm_get_config_data(ndd, ndd->data, 0, read_size); in nd_label_data_init()
494 ndd->ns_current = nd_label_validate(ndd); in nd_label_data_init()
495 if (ndd->ns_current < 0) in nd_label_data_init()
499 ndd->ns_next = nd_label_next_nsindex(ndd->ns_current); in nd_label_data_init()
502 nsindex = to_current_namespace_index(ndd); in nd_label_data_init()
503 nd_label_copy(ndd, to_next_namespace_index(ndd), nsindex); in nd_label_data_init()
510 for (i = 0; i < nslot; i++, offset += ndd->nslabel_size) { in nd_label_data_init()
515 memset(ndd->data + offset, 0, ndd->nslabel_size); in nd_label_data_init()
520 if (offset + ndd->nslabel_size <= read_size) in nd_label_data_init()
528 label_read_size = offset + ndd->nslabel_size - read_size; in nd_label_data_init()
537 rc = nvdimm_get_config_data(ndd, ndd->data + read_size, in nd_label_data_init()
546 dev_dbg(ndd->dev, "len: %zu rc: %d\n", offset, rc); in nd_label_data_init()
551 int nd_label_active_count(struct nvdimm_drvdata *ndd) in nd_label_active_count() argument
558 if (!preamble_current(ndd, &nsindex, &free, &nslot)) in nd_label_active_count()
564 nd_label = to_label(ndd, slot); in nd_label_active_count()
566 if (!slot_valid(ndd, nd_label, slot)) { in nd_label_active_count()
567 u32 label_slot = nsl_get_slot(ndd, nd_label); in nd_label_active_count()
568 u64 size = nsl_get_rawsize(ndd, nd_label); in nd_label_active_count()
569 u64 dpa = nsl_get_dpa(ndd, nd_label); in nd_label_active_count()
571 dev_dbg(ndd->dev, in nd_label_active_count()
581 struct nd_namespace_label *nd_label_active(struct nvdimm_drvdata *ndd, int n) in nd_label_active() argument
587 if (!preamble_current(ndd, &nsindex, &free, &nslot)) in nd_label_active()
593 nd_label = to_label(ndd, slot); in nd_label_active()
594 if (!slot_valid(ndd, nd_label, slot)) in nd_label_active()
598 return to_label(ndd, slot); in nd_label_active()
604 u32 nd_label_alloc_slot(struct nvdimm_drvdata *ndd) in nd_label_alloc_slot() argument
610 if (!preamble_next(ndd, &nsindex, &free, &nslot)) in nd_label_alloc_slot()
613 WARN_ON(!is_nvdimm_bus_locked(ndd->dev)); in nd_label_alloc_slot()
624 bool nd_label_free_slot(struct nvdimm_drvdata *ndd, u32 slot) in nd_label_free_slot() argument
630 if (!preamble_next(ndd, &nsindex, &free, &nslot)) in nd_label_free_slot()
633 WARN_ON(!is_nvdimm_bus_locked(ndd->dev)); in nd_label_free_slot()
640 u32 nd_label_nfree(struct nvdimm_drvdata *ndd) in nd_label_nfree() argument
646 WARN_ON(!is_nvdimm_bus_locked(ndd->dev)); in nd_label_nfree()
648 if (!preamble_next(ndd, &nsindex, &free, &nslot)) in nd_label_nfree()
649 return nvdimm_num_label_slots(ndd); in nd_label_nfree()
654 static int nd_label_write_index(struct nvdimm_drvdata *ndd, int index, u32 seq, in nd_label_write_index() argument
663 nsindex = to_namespace_index(ndd, index); in nd_label_write_index()
665 nslot = nvdimm_num_label_slots(ndd); in nd_label_write_index()
671 nsindex->labelsize = sizeof_namespace_label(ndd) >> 8; in nd_label_write_index()
674 - (unsigned long) to_namespace_index(ndd, 0); in nd_label_write_index()
676 nsindex->mysize = __cpu_to_le64(sizeof_namespace_index(ndd)); in nd_label_write_index()
677 offset = (unsigned long) to_namespace_index(ndd, in nd_label_write_index()
679 - (unsigned long) to_namespace_index(ndd, 0); in nd_label_write_index()
681 offset = (unsigned long) nd_label_base(ndd) in nd_label_write_index()
682 - (unsigned long) to_namespace_index(ndd, 0); in nd_label_write_index()
686 if (sizeof_namespace_label(ndd) < 256) in nd_label_write_index()
700 checksum = nd_fletcher64(nsindex, sizeof_namespace_index(ndd), 1); in nd_label_write_index()
702 rc = nvdimm_set_config_data(ndd, __le64_to_cpu(nsindex->myoff), in nd_label_write_index()
703 nsindex, sizeof_namespace_index(ndd)); in nd_label_write_index()
711 WARN_ON(index != ndd->ns_next); in nd_label_write_index()
712 nd_label_copy(ndd, to_current_namespace_index(ndd), nsindex); in nd_label_write_index()
713 ndd->ns_current = nd_label_next_nsindex(ndd->ns_current); in nd_label_write_index()
714 ndd->ns_next = nd_label_next_nsindex(ndd->ns_next); in nd_label_write_index()
715 WARN_ON(ndd->ns_current == ndd->ns_next); in nd_label_write_index()
720 static unsigned long nd_label_offset(struct nvdimm_drvdata *ndd, in nd_label_offset() argument
724 - (unsigned long) to_namespace_index(ndd, 0); in nd_label_offset()
767 struct nvdimm_drvdata *ndd = to_ndd(nd_mapping); in reap_victim() local
768 u32 slot = to_slot(ndd, victim->label); in reap_victim()
770 dev_dbg(ndd->dev, "free: %d\n", slot); in reap_victim()
771 nd_label_free_slot(ndd, slot); in reap_victim()
775 static void nsl_set_type_guid(struct nvdimm_drvdata *ndd, in nsl_set_type_guid() argument
778 if (namespace_label_has(ndd, type_guid)) in nsl_set_type_guid()
782 bool nsl_validate_type_guid(struct nvdimm_drvdata *ndd, in nsl_validate_type_guid() argument
785 if (!namespace_label_has(ndd, type_guid)) in nsl_validate_type_guid()
788 dev_dbg(ndd->dev, "expect type_guid %pUb got %pUb\n", guid, in nsl_validate_type_guid()
795 static void nsl_set_claim_class(struct nvdimm_drvdata *ndd, in nsl_set_claim_class() argument
799 if (!namespace_label_has(ndd, abstraction_guid)) in nsl_set_claim_class()
806 enum nvdimm_claim_class nsl_get_claim_class(struct nvdimm_drvdata *ndd, in nsl_get_claim_class() argument
809 if (!namespace_label_has(ndd, abstraction_guid)) in nsl_get_claim_class()
820 struct nvdimm_drvdata *ndd = to_ndd(nd_mapping); in __pmem_label_update() local
832 if (!preamble_next(ndd, &nsindex, &free, &nslot)) in __pmem_label_update()
837 for_each_dpa_resource(ndd, res) in __pmem_label_update()
847 slot = nd_label_alloc_slot(ndd); in __pmem_label_update()
850 dev_dbg(ndd->dev, "allocated: %d\n", slot); in __pmem_label_update()
852 nd_label = to_label(ndd, slot); in __pmem_label_update()
853 memset(nd_label, 0, sizeof_namespace_label(ndd)); in __pmem_label_update()
855 nsl_set_name(ndd, nd_label, nspm->alt_name); in __pmem_label_update()
856 nsl_set_flags(ndd, nd_label, flags); in __pmem_label_update()
857 nsl_set_nlabel(ndd, nd_label, nd_region->ndr_mappings); in __pmem_label_update()
858 nsl_set_position(ndd, nd_label, pos); in __pmem_label_update()
859 nsl_set_isetcookie(ndd, nd_label, cookie); in __pmem_label_update()
860 nsl_set_rawsize(ndd, nd_label, resource_size(res)); in __pmem_label_update()
861 nsl_set_lbasize(ndd, nd_label, nspm->lbasize); in __pmem_label_update()
862 nsl_set_dpa(ndd, nd_label, res->start); in __pmem_label_update()
863 nsl_set_slot(ndd, nd_label, slot); in __pmem_label_update()
864 nsl_set_type_guid(ndd, nd_label, &nd_set->type_guid); in __pmem_label_update()
865 nsl_set_claim_class(ndd, nd_label, ndns->claim_class); in __pmem_label_update()
866 nsl_calculate_checksum(ndd, nd_label); in __pmem_label_update()
867 nd_dbg_dpa(nd_region, ndd, res, "\n"); in __pmem_label_update()
870 offset = nd_label_offset(ndd, nd_label); in __pmem_label_update()
871 rc = nvdimm_set_config_data(ndd, offset, nd_label, in __pmem_label_update()
872 sizeof_namespace_label(ndd)); in __pmem_label_update()
888 rc = nd_label_write_index(ndd, ndd->ns_next, in __pmem_label_update()
899 to_slot(ndd, nd_label)); in __pmem_label_update()
920 static struct resource *to_resource(struct nvdimm_drvdata *ndd, in to_resource() argument
925 for_each_dpa_resource(ndd, res) { in to_resource()
926 if (res->start != nsl_get_dpa(ndd, nd_label)) in to_resource()
928 if (resource_size(res) != nsl_get_rawsize(ndd, nd_label)) in to_resource()
940 static void nsl_set_blk_isetcookie(struct nvdimm_drvdata *ndd, in nsl_set_blk_isetcookie() argument
944 if (namespace_label_has(ndd, type_guid)) { in nsl_set_blk_isetcookie()
945 nsl_set_isetcookie(ndd, nd_label, isetcookie); in nsl_set_blk_isetcookie()
948 nsl_set_isetcookie(ndd, nd_label, 0); /* N/A */ in nsl_set_blk_isetcookie()
951 bool nsl_validate_blk_isetcookie(struct nvdimm_drvdata *ndd, in nsl_validate_blk_isetcookie() argument
955 if (!namespace_label_has(ndd, type_guid)) in nsl_validate_blk_isetcookie()
958 if (nsl_get_isetcookie(ndd, nd_label) != isetcookie) { in nsl_validate_blk_isetcookie()
959 dev_dbg(ndd->dev, "expect cookie %#llx got %#llx\n", isetcookie, in nsl_validate_blk_isetcookie()
960 nsl_get_isetcookie(ndd, nd_label)); in nsl_validate_blk_isetcookie()
967 static void nsl_set_blk_nlabel(struct nvdimm_drvdata *ndd, in nsl_set_blk_nlabel() argument
971 if (!namespace_label_has(ndd, type_guid)) { in nsl_set_blk_nlabel()
972 nsl_set_nlabel(ndd, nd_label, 0); /* N/A */ in nsl_set_blk_nlabel()
975 nsl_set_nlabel(ndd, nd_label, first ? nlabel : 0xffff); in nsl_set_blk_nlabel()
978 static void nsl_set_blk_position(struct nvdimm_drvdata *ndd, in nsl_set_blk_position() argument
982 if (!namespace_label_has(ndd, type_guid)) { in nsl_set_blk_position()
983 nsl_set_position(ndd, nd_label, 0); in nsl_set_blk_position()
986 nsl_set_position(ndd, nd_label, first ? 0 : 0xffff); in nsl_set_blk_position()
1001 struct nvdimm_drvdata *ndd = to_ndd(nd_mapping); in __blk_label_update() local
1013 if (!preamble_next(ndd, &nsindex, &free, &nslot)) in __blk_label_update()
1017 nfree = nd_label_nfree(ndd); in __blk_label_update()
1029 for_each_dpa_resource(ndd, res) { in __blk_label_update()
1045 nd_label = to_label(ndd, slot); in __blk_label_update()
1049 res = to_resource(ndd, nd_label); in __blk_label_update()
1053 slot = to_slot(ndd, nd_label); in __blk_label_update()
1071 for_each_dpa_resource(ndd, res) { in __blk_label_update()
1074 if (!nsblk_add_resource(nd_region, ndd, nsblk, res->start)) { in __blk_label_update()
1107 slot = nd_label_alloc_slot(ndd); in __blk_label_update()
1112 dev_dbg(ndd->dev, "allocated: %d\n", slot); in __blk_label_update()
1114 nd_label = to_label(ndd, slot); in __blk_label_update()
1115 memset(nd_label, 0, sizeof_namespace_label(ndd)); in __blk_label_update()
1117 nsl_set_name(ndd, nd_label, nsblk->alt_name); in __blk_label_update()
1118 nsl_set_flags(ndd, nd_label, NSLABEL_FLAG_LOCAL); in __blk_label_update()
1120 nsl_set_blk_nlabel(ndd, nd_label, nsblk->num_resources, in __blk_label_update()
1122 nsl_set_blk_position(ndd, nd_label, i == min_dpa_idx); in __blk_label_update()
1123 nsl_set_blk_isetcookie(ndd, nd_label, nd_set->cookie2); in __blk_label_update()
1125 nsl_set_dpa(ndd, nd_label, res->start); in __blk_label_update()
1126 nsl_set_rawsize(ndd, nd_label, resource_size(res)); in __blk_label_update()
1127 nsl_set_lbasize(ndd, nd_label, nsblk->lbasize); in __blk_label_update()
1128 nsl_set_slot(ndd, nd_label, slot); in __blk_label_update()
1129 nsl_set_type_guid(ndd, nd_label, &nd_set->type_guid); in __blk_label_update()
1130 nsl_set_claim_class(ndd, nd_label, ndns->claim_class); in __blk_label_update()
1131 nsl_calculate_checksum(ndd, nd_label); in __blk_label_update()
1134 offset = nd_label_offset(ndd, nd_label); in __blk_label_update()
1135 rc = nvdimm_set_config_data(ndd, offset, nd_label, in __blk_label_update()
1136 sizeof_namespace_label(ndd)); in __blk_label_update()
1143 dev_dbg(ndd->dev, "free: %d\n", slot); in __blk_label_update()
1144 nd_label_free_slot(ndd, slot); in __blk_label_update()
1148 rc = nd_label_write_index(ndd, ndd->ns_next, in __blk_label_update()
1194 nd_label = to_label(ndd, slot); in __blk_label_update()
1198 res = to_resource(ndd, nd_label); in __blk_label_update()
1224 nd_label_copy(ndd, nsindex, to_current_namespace_index(ndd)); in __blk_label_update()
1237 struct nvdimm_drvdata *ndd = to_ndd(nd_mapping); in init_labels() local
1257 if (ndd->ns_current == -1 || ndd->ns_next == -1) in init_labels()
1262 nsindex = to_namespace_index(ndd, 0); in init_labels()
1263 memset(nsindex, 0, ndd->nsarea.config_size); in init_labels()
1265 int rc = nd_label_write_index(ndd, i, 3 - i, ND_NSINDEX_INIT); in init_labels()
1270 ndd->ns_next = 1; in init_labels()
1271 ndd->ns_current = 0; in init_labels()
1278 struct nvdimm_drvdata *ndd = to_ndd(nd_mapping); in del_labels() local
1291 if (!preamble_next(ndd, &nsindex, &free, &nslot)) in del_labels()
1305 slot = to_slot(ndd, nd_label); in del_labels()
1306 nd_label_free_slot(ndd, slot); in del_labels()
1307 dev_dbg(ndd->dev, "free: %d\n", slot); in del_labels()
1315 dev_dbg(ndd->dev, "no more active labels\n"); in del_labels()
1319 return nd_label_write_index(ndd, ndd->ns_next, in del_labels()
1330 struct nvdimm_drvdata *ndd = to_ndd(nd_mapping); in nd_pmem_namespace_label_update() local
1341 for_each_dpa_resource(ndd, res) in nd_pmem_namespace_label_update()