Lines Matching refs:nd_pfn
19 struct nd_pfn *nd_pfn = to_nd_pfn(dev); in nd_pfn_release() local
22 nd_detach_ndns(&nd_pfn->dev, &nd_pfn->ndns); in nd_pfn_release()
23 ida_simple_remove(&nd_region->pfn_ida, nd_pfn->id); in nd_pfn_release()
24 kfree(nd_pfn->uuid); in nd_pfn_release()
25 kfree(nd_pfn); in nd_pfn_release()
28 struct nd_pfn *to_nd_pfn(struct device *dev) in to_nd_pfn()
30 struct nd_pfn *nd_pfn = container_of(dev, struct nd_pfn, dev); in to_nd_pfn() local
33 return nd_pfn; in to_nd_pfn()
40 struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev); in mode_show() local
42 switch (nd_pfn->mode) { in mode_show()
55 struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev); in mode_store() local
67 nd_pfn->mode = PFN_MODE_PMEM; in mode_store()
70 nd_pfn->mode = PFN_MODE_RAM; in mode_store()
73 nd_pfn->mode = PFN_MODE_NONE; in mode_store()
89 struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev); in align_show() local
91 return sprintf(buf, "%ld\n", nd_pfn->align); in align_show()
122 struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev); in align_store() local
128 rc = nd_size_select_store(dev, buf, &nd_pfn->align, in align_store()
142 struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev); in uuid_show() local
144 if (nd_pfn->uuid) in uuid_show()
145 return sprintf(buf, "%pUb\n", nd_pfn->uuid); in uuid_show()
152 struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev); in uuid_store() local
156 rc = nd_uuid_store(dev, &nd_pfn->uuid, buf, len); in uuid_store()
168 struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev); in namespace_show() local
172 rc = sprintf(buf, "%s\n", nd_pfn->ndns in namespace_show()
173 ? dev_name(&nd_pfn->ndns->dev) : ""); in namespace_show()
181 struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev); in namespace_store() local
186 rc = nd_namespace_store(dev, &nd_pfn->ndns, buf, len); in namespace_store()
199 struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev); in resource_show() local
204 struct nd_pfn_sb *pfn_sb = nd_pfn->pfn_sb; in resource_show()
206 struct nd_namespace_common *ndns = nd_pfn->ndns; in resource_show()
225 struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev); in size_show() local
230 struct nd_pfn_sb *pfn_sb = nd_pfn->pfn_sb; in size_show()
232 struct nd_namespace_common *ndns = nd_pfn->ndns; in size_show()
296 struct device *nd_pfn_devinit(struct nd_pfn *nd_pfn, in nd_pfn_devinit() argument
301 if (!nd_pfn) in nd_pfn_devinit()
304 nd_pfn->mode = PFN_MODE_NONE; in nd_pfn_devinit()
305 nd_pfn->align = nd_pfn_default_alignment(); in nd_pfn_devinit()
306 dev = &nd_pfn->dev; in nd_pfn_devinit()
307 device_initialize(&nd_pfn->dev); in nd_pfn_devinit()
308 lockdep_set_class(&nd_pfn->dev.mutex, &nvdimm_pfn_key); in nd_pfn_devinit()
309 if (ndns && !__nd_attach_ndns(&nd_pfn->dev, ndns, &nd_pfn->ndns)) { in nd_pfn_devinit()
318 static struct nd_pfn *nd_pfn_alloc(struct nd_region *nd_region) in nd_pfn_alloc()
320 struct nd_pfn *nd_pfn; in nd_pfn_alloc() local
323 nd_pfn = kzalloc(sizeof(*nd_pfn), GFP_KERNEL); in nd_pfn_alloc()
324 if (!nd_pfn) in nd_pfn_alloc()
327 nd_pfn->id = ida_simple_get(&nd_region->pfn_ida, 0, 0, GFP_KERNEL); in nd_pfn_alloc()
328 if (nd_pfn->id < 0) { in nd_pfn_alloc()
329 kfree(nd_pfn); in nd_pfn_alloc()
333 dev = &nd_pfn->dev; in nd_pfn_alloc()
334 dev_set_name(dev, "pfn%d.%d", nd_region->id, nd_pfn->id); in nd_pfn_alloc()
338 return nd_pfn; in nd_pfn_alloc()
343 struct nd_pfn *nd_pfn; in nd_pfn_create() local
349 nd_pfn = nd_pfn_alloc(nd_region); in nd_pfn_create()
350 dev = nd_pfn_devinit(nd_pfn, NULL); in nd_pfn_create()
362 static int nd_pfn_clear_memmap_errors(struct nd_pfn *nd_pfn) in nd_pfn_clear_memmap_errors() argument
364 struct nd_region *nd_region = to_nd_region(nd_pfn->dev.parent); in nd_pfn_clear_memmap_errors()
365 struct nd_namespace_common *ndns = nd_pfn->ndns; in nd_pfn_clear_memmap_errors()
367 struct nd_pfn_sb *pfn_sb = nd_pfn->pfn_sb; in nd_pfn_clear_memmap_errors()
372 if (nd_pfn->mode != PFN_MODE_PMEM) in nd_pfn_clear_memmap_errors()
383 devm_namespace_disable(&nd_pfn->dev, ndns); in nd_pfn_clear_memmap_errors()
384 rc = devm_namespace_enable(&nd_pfn->dev, ndns, le64_to_cpu(pfn_sb->dataoff)); in nd_pfn_clear_memmap_errors()
395 dev_dbg(&nd_pfn->dev, "meta: %x badblocks at %llx\n", in nd_pfn_clear_memmap_errors()
413 dev_err(&nd_pfn->dev, in nd_pfn_clear_memmap_errors()
448 int nd_pfn_validate(struct nd_pfn *nd_pfn, const char *sig) in nd_pfn_validate() argument
455 struct nd_pfn_sb *pfn_sb = nd_pfn->pfn_sb; in nd_pfn_validate()
456 struct nd_namespace_common *ndns = nd_pfn->ndns; in nd_pfn_validate()
462 if (!is_memory(nd_pfn->dev.parent)) in nd_pfn_validate()
510 dev_err(&nd_pfn->dev, in nd_pfn_validate()
518 dev_err(&nd_pfn->dev, in nd_pfn_validate()
531 dev_err(&nd_pfn->dev, "init failed, alignment mismatch: " in nd_pfn_validate()
532 "%ld:%ld\n", nd_pfn->align, align); in nd_pfn_validate()
536 if (!nd_pfn->uuid) { in nd_pfn_validate()
542 nd_pfn->uuid = kmemdup(pfn_sb->uuid, 16, GFP_KERNEL); in nd_pfn_validate()
543 if (!nd_pfn->uuid) in nd_pfn_validate()
545 nd_pfn->align = align; in nd_pfn_validate()
546 nd_pfn->mode = mode; in nd_pfn_validate()
552 if (memcmp(nd_pfn->uuid, pfn_sb->uuid, 16) != 0) in nd_pfn_validate()
561 if (nd_pfn->align != align || nd_pfn->mode != mode) { in nd_pfn_validate()
562 dev_err(&nd_pfn->dev, in nd_pfn_validate()
564 dev_dbg(&nd_pfn->dev, "align: %lx:%lx mode: %d:%d\n", in nd_pfn_validate()
565 nd_pfn->align, align, nd_pfn->mode, in nd_pfn_validate()
572 dev_err(&nd_pfn->dev, "alignment: %lx exceeds capacity %llx\n", in nd_pfn_validate()
586 dev_err(&nd_pfn->dev, "pfn array size exceeds capacity of %s\n", in nd_pfn_validate()
593 dev_err(&nd_pfn->dev, in nd_pfn_validate()
601 dev_err(&nd_pfn->dev, "resource start misaligned\n"); in nd_pfn_validate()
607 dev_err(&nd_pfn->dev, "resource end misaligned\n"); in nd_pfn_validate()
618 struct nd_pfn *nd_pfn; in nd_pfn_probe() local
635 nd_pfn = nd_pfn_alloc(nd_region); in nd_pfn_probe()
636 pfn_dev = nd_pfn_devinit(nd_pfn, ndns); in nd_pfn_probe()
641 nd_pfn = to_nd_pfn(pfn_dev); in nd_pfn_probe()
642 nd_pfn->pfn_sb = pfn_sb; in nd_pfn_probe()
643 rc = nd_pfn_validate(nd_pfn, PFN_SIG); in nd_pfn_probe()
646 nd_detach_ndns(pfn_dev, &nd_pfn->ndns); in nd_pfn_probe()
675 static int __nvdimm_setup_pfn(struct nd_pfn *nd_pfn, struct dev_pagemap *pgmap) in __nvdimm_setup_pfn() argument
679 struct nd_pfn_sb *pfn_sb = nd_pfn->pfn_sb; in __nvdimm_setup_pfn()
684 struct nd_namespace_common *ndns = nd_pfn->ndns; in __nvdimm_setup_pfn()
699 if (nd_pfn->mode == PFN_MODE_RAM) { in __nvdimm_setup_pfn()
702 nd_pfn->npfns = le64_to_cpu(pfn_sb->npfns); in __nvdimm_setup_pfn()
703 } else if (nd_pfn->mode == PFN_MODE_PMEM) { in __nvdimm_setup_pfn()
704 nd_pfn->npfns = PHYS_PFN((range_len(range) - offset)); in __nvdimm_setup_pfn()
705 if (le64_to_cpu(nd_pfn->pfn_sb->npfns) > nd_pfn->npfns) in __nvdimm_setup_pfn()
706 dev_info(&nd_pfn->dev, in __nvdimm_setup_pfn()
708 le64_to_cpu(nd_pfn->pfn_sb->npfns), in __nvdimm_setup_pfn()
709 nd_pfn->npfns); in __nvdimm_setup_pfn()
720 static int nd_pfn_init(struct nd_pfn *nd_pfn) in nd_pfn_init() argument
722 struct nd_namespace_common *ndns = nd_pfn->ndns; in nd_pfn_init()
734 pfn_sb = devm_kmalloc(&nd_pfn->dev, sizeof(*pfn_sb), GFP_KERNEL); in nd_pfn_init()
738 nd_pfn->pfn_sb = pfn_sb; in nd_pfn_init()
739 if (is_nd_dax(&nd_pfn->dev)) in nd_pfn_init()
744 rc = nd_pfn_validate(nd_pfn, sig); in nd_pfn_init()
746 return nd_pfn_clear_memmap_errors(nd_pfn); in nd_pfn_init()
753 nd_region = to_nd_region(nd_pfn->dev.parent); in nd_pfn_init()
755 dev_info(&nd_pfn->dev, in nd_pfn_init()
770 align = max(nd_pfn->align, memremap_compat_align()); in nd_pfn_init()
778 dev_err(&nd_pfn->dev, "%s: start %pa misaligned to %#lx\n", in nd_pfn_init()
784 if (nd_pfn->mode == PFN_MODE_PMEM) { in nd_pfn_init()
799 } else if (nd_pfn->mode == PFN_MODE_RAM) in nd_pfn_init()
805 dev_err(&nd_pfn->dev, "%s unable to satisfy requested alignment\n", in nd_pfn_init()
811 pfn_sb->mode = cpu_to_le32(nd_pfn->mode); in nd_pfn_init()
815 memcpy(pfn_sb->uuid, nd_pfn->uuid, 16); in nd_pfn_init()
820 pfn_sb->align = cpu_to_le32(nd_pfn->align); in nd_pfn_init()
826 rc = nd_pfn_clear_memmap_errors(nd_pfn); in nd_pfn_init()
837 int nvdimm_setup_pfn(struct nd_pfn *nd_pfn, struct dev_pagemap *pgmap) in nvdimm_setup_pfn() argument
841 if (!nd_pfn->uuid || !nd_pfn->ndns) in nvdimm_setup_pfn()
844 rc = nd_pfn_init(nd_pfn); in nvdimm_setup_pfn()
849 return __nvdimm_setup_pfn(nd_pfn, pgmap); in nvdimm_setup_pfn()