Lines Matching refs:dev_dax
139 static u64 dev_dax_size(struct dev_dax *dev_dax) in dev_dax_size() argument
144 device_lock_assert(&dev_dax->dev); in dev_dax_size()
146 for (i = 0; i < dev_dax->nr_range; i++) in dev_dax_size()
147 size += range_len(&dev_dax->ranges[i].range); in dev_dax_size()
155 struct dev_dax *dev_dax = to_dev_dax(dev); in dax_bus_probe() local
156 struct dax_region *dax_region = dev_dax->region; in dax_bus_probe()
159 if (dev_dax_size(dev_dax) == 0 || dev_dax->id < 0) in dax_bus_probe()
162 rc = dax_drv->probe(dev_dax); in dax_bus_probe()
180 struct dev_dax *dev_dax = to_dev_dax(dev); in dax_bus_remove() local
182 return dax_drv->remove(dev_dax); in dax_bus_remove()
336 struct dev_dax *dev_dax = devm_create_dev_dax(&data); in create_store() local
338 if (IS_ERR(dev_dax)) in create_store()
339 rc = PTR_ERR(dev_dax); in create_store()
349 dax_region->seed = &dev_dax->dev; in create_store()
350 dax_region->youngest = &dev_dax->dev; in create_store()
360 void kill_dev_dax(struct dev_dax *dev_dax) in kill_dev_dax() argument
362 struct dax_device *dax_dev = dev_dax->dax_dev; in kill_dev_dax()
370 static void free_dev_dax_ranges(struct dev_dax *dev_dax) in free_dev_dax_ranges() argument
372 struct dax_region *dax_region = dev_dax->region; in free_dev_dax_ranges()
376 for (i = 0; i < dev_dax->nr_range; i++) { in free_dev_dax_ranges()
377 struct range *range = &dev_dax->ranges[i].range; in free_dev_dax_ranges()
382 dev_dax->nr_range = 0; in free_dev_dax_ranges()
387 struct dev_dax *dev_dax = to_dev_dax(dev); in unregister_dev_dax() local
391 kill_dev_dax(dev_dax); in unregister_dev_dax()
392 free_dev_dax_ranges(dev_dax); in unregister_dev_dax()
398 static int __free_dev_dax_id(struct dev_dax *dev_dax) in __free_dev_dax_id() argument
400 struct dax_region *dax_region = dev_dax->region; in __free_dev_dax_id()
401 struct device *dev = &dev_dax->dev; in __free_dev_dax_id()
402 int rc = dev_dax->id; in __free_dev_dax_id()
406 if (is_static(dax_region) || dev_dax->id < 0) in __free_dev_dax_id()
408 ida_free(&dax_region->ida, dev_dax->id); in __free_dev_dax_id()
409 dev_dax->id = -1; in __free_dev_dax_id()
413 static int free_dev_dax_id(struct dev_dax *dev_dax) in free_dev_dax_id() argument
415 struct device *dev = &dev_dax->dev; in free_dev_dax_id()
419 rc = __free_dev_dax_id(dev_dax); in free_dev_dax_id()
428 struct dev_dax *dev_dax; in delete_store() local
442 dev_dax = to_dev_dax(victim); in delete_store()
443 if (victim->driver || dev_dax_size(dev_dax)) in delete_store()
452 if (dev_dax->id > 0) { in delete_store()
453 do_del = __free_dev_dax_id(dev_dax) >= 0; in delete_store()
586 struct dev_dax *dev_dax = to_dev_dax(dev->parent); in dax_mapping_release() local
588 ida_free(&dev_dax->ida, mapping->id); in dax_mapping_release()
596 struct dev_dax *dev_dax = to_dev_dax(dev->parent); in unregister_dax_mapping() local
597 struct dax_region *dax_region = dev_dax->region; in unregister_dax_mapping()
603 dev_dax->ranges[mapping->range_id].mapping = NULL; in unregister_dax_mapping()
613 struct dev_dax *dev_dax = to_dev_dax(dev->parent); in get_dax_range() local
614 struct dax_region *dax_region = dev_dax->region; in get_dax_range()
622 return &dev_dax->ranges[mapping->range_id]; in get_dax_range()
628 struct dev_dax *dev_dax = to_dev_dax(mapping->dev.parent); in put_dax_range() local
629 struct dax_region *dax_region = dev_dax->region; in put_dax_range()
703 static int devm_register_dax_mapping(struct dev_dax *dev_dax, int range_id) in devm_register_dax_mapping() argument
705 struct dax_region *dax_region = dev_dax->region; in devm_register_dax_mapping()
712 if (dev_WARN_ONCE(&dev_dax->dev, !dax_region->dev->driver, in devm_register_dax_mapping()
720 mapping->id = ida_alloc(&dev_dax->ida, GFP_KERNEL); in devm_register_dax_mapping()
725 dev_dax->ranges[range_id].mapping = mapping; in devm_register_dax_mapping()
728 dev->parent = &dev_dax->dev; in devm_register_dax_mapping()
744 static int alloc_dev_dax_range(struct dev_dax *dev_dax, u64 start, in alloc_dev_dax_range() argument
747 struct dax_region *dax_region = dev_dax->region; in alloc_dev_dax_range()
749 struct device *dev = &dev_dax->dev; in alloc_dev_dax_range()
759 if (dev_WARN_ONCE(dev, dev_dax->nr_range, in alloc_dev_dax_range()
766 ranges = krealloc(dev_dax->ranges, sizeof(*ranges) in alloc_dev_dax_range()
767 * (dev_dax->nr_range + 1), GFP_KERNEL); in alloc_dev_dax_range()
777 if (!dev_dax->nr_range) { in alloc_dev_dax_range()
781 dev_dax->ranges = ranges; in alloc_dev_dax_range()
785 for (i = 0; i < dev_dax->nr_range; i++) in alloc_dev_dax_range()
787 dev_dax->ranges = ranges; in alloc_dev_dax_range()
788 ranges[dev_dax->nr_range++] = (struct dev_dax_range) { in alloc_dev_dax_range()
796 dev_dbg(dev, "alloc range[%d]: %pa:%pa\n", dev_dax->nr_range - 1, in alloc_dev_dax_range()
803 if (!device_is_registered(&dev_dax->dev)) in alloc_dev_dax_range()
806 rc = devm_register_dax_mapping(dev_dax, dev_dax->nr_range - 1); in alloc_dev_dax_range()
808 dev_dbg(dev, "delete range[%d]: %pa:%pa\n", dev_dax->nr_range - 1, in alloc_dev_dax_range()
810 dev_dax->nr_range--; in alloc_dev_dax_range()
818 static int adjust_dev_dax_range(struct dev_dax *dev_dax, struct resource *res, resource_size_t size) in adjust_dev_dax_range() argument
820 int last_range = dev_dax->nr_range - 1; in adjust_dev_dax_range()
821 struct dev_dax_range *dax_range = &dev_dax->ranges[last_range]; in adjust_dev_dax_range()
822 struct dax_region *dax_region = dev_dax->region; in adjust_dev_dax_range()
825 struct device *dev = &dev_dax->dev; in adjust_dev_dax_range()
852 struct dev_dax *dev_dax = to_dev_dax(dev); in size_show() local
856 size = dev_dax_size(dev_dax); in size_show()
862 static bool alloc_is_aligned(struct dev_dax *dev_dax, resource_size_t size) in alloc_is_aligned() argument
868 return IS_ALIGNED(size, max_t(unsigned long, dev_dax->align, memremap_compat_align())); in alloc_is_aligned()
871 static int dev_dax_shrink(struct dev_dax *dev_dax, resource_size_t size) in dev_dax_shrink() argument
873 resource_size_t to_shrink = dev_dax_size(dev_dax) - size; in dev_dax_shrink()
874 struct dax_region *dax_region = dev_dax->region; in dev_dax_shrink()
875 struct device *dev = &dev_dax->dev; in dev_dax_shrink()
878 for (i = dev_dax->nr_range - 1; i >= 0; i--) { in dev_dax_shrink()
879 struct range *range = &dev_dax->ranges[i].range; in dev_dax_shrink()
880 struct dax_mapping *mapping = dev_dax->ranges[i].mapping; in dev_dax_shrink()
890 dev_dax->nr_range--; in dev_dax_shrink()
907 if (dev_WARN_ONCE(dev, !adjust || i != dev_dax->nr_range - 1, in dev_dax_shrink()
910 return adjust_dev_dax_range(dev_dax, adjust, range_len(range) in dev_dax_shrink()
920 static bool adjust_ok(struct dev_dax *dev_dax, struct resource *res) in adjust_ok() argument
925 if (dev_dax->nr_range == 0) in adjust_ok()
927 if (strcmp(res->name, dev_name(&dev_dax->dev)) != 0) in adjust_ok()
929 last = &dev_dax->ranges[dev_dax->nr_range - 1]; in adjust_ok()
932 for (i = 0; i < dev_dax->nr_range - 1; i++) { in adjust_ok()
933 struct dev_dax_range *dax_range = &dev_dax->ranges[i]; in adjust_ok()
943 struct dev_dax *dev_dax, resource_size_t size) in dev_dax_resize() argument
946 resource_size_t dev_size = dev_dax_size(dev_dax); in dev_dax_resize()
948 struct device *dev = &dev_dax->dev; in dev_dax_resize()
960 return dev_dax_shrink(dev_dax, size); in dev_dax_resize()
963 if (dev_WARN_ONCE(dev, !alloc_is_aligned(dev_dax, to_alloc), in dev_dax_resize()
975 return alloc_dev_dax_range(dev_dax, dax_region->res.start, to_alloc); in dev_dax_resize()
984 rc = alloc_dev_dax_range(dev_dax, dax_region->res.start, alloc); in dev_dax_resize()
1000 if (adjust_ok(dev_dax, res)) { in dev_dax_resize()
1001 rc = adjust_dev_dax_range(dev_dax, res, resource_size(res) + alloc); in dev_dax_resize()
1004 rc = alloc_dev_dax_range(dev_dax, res->end + 1, alloc); in dev_dax_resize()
1020 struct dev_dax *dev_dax = to_dev_dax(dev); in size_store() local
1021 struct dax_region *dax_region = dev_dax->region; in size_store()
1027 if (!alloc_is_aligned(dev_dax, val)) { in size_store()
1038 rc = dev_dax_resize(dax_region, dev_dax, val); in size_store()
1079 struct dev_dax *dev_dax = to_dev_dax(dev); in mapping_store() local
1080 struct dax_region *dax_region = dev_dax->region; in mapping_store()
1098 if (alloc_is_aligned(dev_dax, to_alloc)) in mapping_store()
1099 rc = alloc_dev_dax_range(dev_dax, r.start, to_alloc); in mapping_store()
1110 struct dev_dax *dev_dax = to_dev_dax(dev); in align_show() local
1112 return sprintf(buf, "%d\n", dev_dax->align); in align_show()
1115 static ssize_t dev_dax_validate_align(struct dev_dax *dev_dax) in dev_dax_validate_align() argument
1117 resource_size_t dev_size = dev_dax_size(dev_dax); in dev_dax_validate_align()
1118 struct device *dev = &dev_dax->dev; in dev_dax_validate_align()
1121 if (dev_size > 0 && !alloc_is_aligned(dev_dax, dev_size)) { in dev_dax_validate_align()
1123 __func__, dev_dax->align, &dev_size); in dev_dax_validate_align()
1127 for (i = 0; i < dev_dax->nr_range; i++) { in dev_dax_validate_align()
1128 size_t len = range_len(&dev_dax->ranges[i].range); in dev_dax_validate_align()
1130 if (!alloc_is_aligned(dev_dax, len)) { in dev_dax_validate_align()
1132 __func__, dev_dax->align, i); in dev_dax_validate_align()
1143 struct dev_dax *dev_dax = to_dev_dax(dev); in align_store() local
1144 struct dax_region *dax_region = dev_dax->region; in align_store()
1167 align_save = dev_dax->align; in align_store()
1168 dev_dax->align = val; in align_store()
1169 rc = dev_dax_validate_align(dev_dax); in align_store()
1171 dev_dax->align = align_save; in align_store()
1179 static int dev_dax_target_node(struct dev_dax *dev_dax) in dev_dax_target_node() argument
1181 struct dax_region *dax_region = dev_dax->region; in dev_dax_target_node()
1189 struct dev_dax *dev_dax = to_dev_dax(dev); in target_node_show() local
1191 return sprintf(buf, "%d\n", dev_dax_target_node(dev_dax)); in target_node_show()
1198 struct dev_dax *dev_dax = to_dev_dax(dev); in resource_show() local
1199 struct dax_region *dax_region = dev_dax->region; in resource_show()
1202 if (dev_dax->nr_range < 1) in resource_show()
1205 start = dev_dax->ranges[0].range.start; in resource_show()
1232 struct dev_dax *dev_dax = to_dev_dax(dev); in dev_dax_visible() local
1233 struct dax_region *dax_region = dev_dax->region; in dev_dax_visible()
1235 if (a == &dev_attr_target_node.attr && dev_dax_target_node(dev_dax) < 0) in dev_dax_visible()
1270 struct dev_dax *dev_dax = to_dev_dax(dev); in dev_dax_release() local
1271 struct dax_region *dax_region = dev_dax->region; in dev_dax_release()
1272 struct dax_device *dax_dev = dev_dax->dax_dev; in dev_dax_release()
1275 free_dev_dax_id(dev_dax); in dev_dax_release()
1277 kfree(dev_dax->ranges); in dev_dax_release()
1278 kfree(dev_dax->pgmap); in dev_dax_release()
1279 kfree(dev_dax); in dev_dax_release()
1287 struct dev_dax *devm_create_dev_dax(struct dev_dax_data *data) in devm_create_dev_dax()
1292 struct dev_dax *dev_dax; in devm_create_dev_dax() local
1297 dev_dax = kzalloc(sizeof(*dev_dax), GFP_KERNEL); in devm_create_dev_dax()
1298 if (!dev_dax) in devm_create_dev_dax()
1308 dev_dax->id = data->id; in devm_create_dev_dax()
1319 dev_dax->id = rc; in devm_create_dev_dax()
1322 dev_dax->region = dax_region; in devm_create_dev_dax()
1323 dev = &dev_dax->dev; in devm_create_dev_dax()
1325 dev_set_name(dev, "dax%d.%d", dax_region->id, dev_dax->id); in devm_create_dev_dax()
1327 rc = alloc_dev_dax_range(dev_dax, dax_region->res.start, data->size); in devm_create_dev_dax()
1335 dev_dax->pgmap = kmemdup(data->pgmap, in devm_create_dev_dax()
1337 if (!dev_dax->pgmap) { in devm_create_dev_dax()
1347 dax_dev = alloc_dax(dev_dax, NULL, NULL, DAXDEV_F_SYNC); in devm_create_dev_dax()
1356 dev_dax->dax_dev = dax_dev; in devm_create_dev_dax()
1357 dev_dax->target_node = dax_region->target_node; in devm_create_dev_dax()
1358 dev_dax->align = dax_region->align; in devm_create_dev_dax()
1359 ida_init(&dev_dax->ida); in devm_create_dev_dax()
1373 kill_dev_dax(dev_dax); in devm_create_dev_dax()
1383 if (dev_dax->nr_range && range_len(&dev_dax->ranges[0].range)) { in devm_create_dev_dax()
1384 rc = devm_register_dax_mapping(dev_dax, 0); in devm_create_dev_dax()
1389 return dev_dax; in devm_create_dev_dax()
1392 kfree(dev_dax->pgmap); in devm_create_dev_dax()
1394 free_dev_dax_ranges(dev_dax); in devm_create_dev_dax()
1396 free_dev_dax_id(dev_dax); in devm_create_dev_dax()
1398 kfree(dev_dax); in devm_create_dev_dax()