1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
5 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
6 #include <linux/libnvdimm.h>
7 #include <linux/sched/mm.h>
8 #include <linux/vmalloc.h>
9 #include <linux/uaccess.h>
10 #include <linux/module.h>
11 #include <linux/blkdev.h>
12 #include <linux/fcntl.h>
13 #include <linux/async.h>
14 #include <linux/ndctl.h>
15 #include <linux/sched.h>
16 #include <linux/slab.h>
17 #include <linux/cpu.h>
27 static int nvdimm_bus_major
;
28 static DEFINE_IDA(nd_ida
);
30 static const struct class nd_class
= {
34 static int to_nd_device_type(const struct device
*dev
)
37 return ND_DEVICE_DIMM
;
38 else if (is_memory(dev
))
39 return ND_DEVICE_REGION_PMEM
;
40 else if (is_nd_dax(dev
))
41 return ND_DEVICE_DAX_PMEM
;
42 else if (is_nd_region(dev
->parent
))
43 return nd_region_to_nstype(to_nd_region(dev
->parent
));
48 static int nvdimm_bus_uevent(const struct device
*dev
, struct kobj_uevent_env
*env
)
50 return add_uevent_var(env
, "MODALIAS=" ND_DEVICE_MODALIAS_FMT
,
51 to_nd_device_type(dev
));
54 static struct module
*to_bus_provider(struct device
*dev
)
56 /* pin bus providers while regions are enabled */
57 if (is_nd_region(dev
)) {
58 struct nvdimm_bus
*nvdimm_bus
= walk_to_nvdimm_bus(dev
);
60 return nvdimm_bus
->nd_desc
->module
;
65 static void nvdimm_bus_probe_start(struct nvdimm_bus
*nvdimm_bus
)
67 nvdimm_bus_lock(&nvdimm_bus
->dev
);
68 nvdimm_bus
->probe_active
++;
69 nvdimm_bus_unlock(&nvdimm_bus
->dev
);
72 static void nvdimm_bus_probe_end(struct nvdimm_bus
*nvdimm_bus
)
74 nvdimm_bus_lock(&nvdimm_bus
->dev
);
75 if (--nvdimm_bus
->probe_active
== 0)
76 wake_up(&nvdimm_bus
->wait
);
77 nvdimm_bus_unlock(&nvdimm_bus
->dev
);
80 static int nvdimm_bus_probe(struct device
*dev
)
82 struct nd_device_driver
*nd_drv
= to_nd_device_driver(dev
->driver
);
83 struct module
*provider
= to_bus_provider(dev
);
84 struct nvdimm_bus
*nvdimm_bus
= walk_to_nvdimm_bus(dev
);
87 if (!try_module_get(provider
))
90 dev_dbg(&nvdimm_bus
->dev
, "START: %s.probe(%s)\n",
91 dev
->driver
->name
, dev_name(dev
));
93 nvdimm_bus_probe_start(nvdimm_bus
);
94 rc
= nd_drv
->probe(dev
);
95 if ((rc
== 0 || rc
== -EOPNOTSUPP
) &&
96 dev
->parent
&& is_nd_region(dev
->parent
))
97 nd_region_advance_seeds(to_nd_region(dev
->parent
), dev
);
98 nvdimm_bus_probe_end(nvdimm_bus
);
100 dev_dbg(&nvdimm_bus
->dev
, "END: %s.probe(%s) = %d\n", dev
->driver
->name
,
104 module_put(provider
);
108 static void nvdimm_bus_remove(struct device
*dev
)
110 struct nd_device_driver
*nd_drv
= to_nd_device_driver(dev
->driver
);
111 struct module
*provider
= to_bus_provider(dev
);
112 struct nvdimm_bus
*nvdimm_bus
= walk_to_nvdimm_bus(dev
);
117 dev_dbg(&nvdimm_bus
->dev
, "%s.remove(%s)\n", dev
->driver
->name
,
119 module_put(provider
);
122 static void nvdimm_bus_shutdown(struct device
*dev
)
124 struct nvdimm_bus
*nvdimm_bus
= walk_to_nvdimm_bus(dev
);
125 struct nd_device_driver
*nd_drv
= NULL
;
128 nd_drv
= to_nd_device_driver(dev
->driver
);
130 if (nd_drv
&& nd_drv
->shutdown
) {
131 nd_drv
->shutdown(dev
);
132 dev_dbg(&nvdimm_bus
->dev
, "%s.shutdown(%s)\n",
133 dev
->driver
->name
, dev_name(dev
));
137 void nd_device_notify(struct device
*dev
, enum nvdimm_event event
)
141 struct nd_device_driver
*nd_drv
;
143 nd_drv
= to_nd_device_driver(dev
->driver
);
145 nd_drv
->notify(dev
, event
);
149 EXPORT_SYMBOL(nd_device_notify
);
151 void nvdimm_region_notify(struct nd_region
*nd_region
, enum nvdimm_event event
)
153 struct nvdimm_bus
*nvdimm_bus
= walk_to_nvdimm_bus(&nd_region
->dev
);
158 /* caller is responsible for holding a reference on the device */
159 nd_device_notify(&nd_region
->dev
, event
);
161 EXPORT_SYMBOL_GPL(nvdimm_region_notify
);
163 struct clear_badblocks_context
{
164 resource_size_t phys
, cleared
;
167 static int nvdimm_clear_badblocks_region(struct device
*dev
, void *data
)
169 struct clear_badblocks_context
*ctx
= data
;
170 struct nd_region
*nd_region
;
171 resource_size_t ndr_end
;
174 /* make sure device is a region */
178 nd_region
= to_nd_region(dev
);
179 ndr_end
= nd_region
->ndr_start
+ nd_region
->ndr_size
- 1;
181 /* make sure we are in the region */
182 if (ctx
->phys
< nd_region
->ndr_start
||
183 (ctx
->phys
+ ctx
->cleared
- 1) > ndr_end
)
186 sector
= (ctx
->phys
- nd_region
->ndr_start
) / 512;
187 badblocks_clear(&nd_region
->bb
, sector
, ctx
->cleared
/ 512);
189 if (nd_region
->bb_state
)
190 sysfs_notify_dirent(nd_region
->bb_state
);
195 static void nvdimm_clear_badblocks_regions(struct nvdimm_bus
*nvdimm_bus
,
196 phys_addr_t phys
, u64 cleared
)
198 struct clear_badblocks_context ctx
= {
203 device_for_each_child(&nvdimm_bus
->dev
, &ctx
,
204 nvdimm_clear_badblocks_region
);
207 static void nvdimm_account_cleared_poison(struct nvdimm_bus
*nvdimm_bus
,
208 phys_addr_t phys
, u64 cleared
)
211 badrange_forget(&nvdimm_bus
->badrange
, phys
, cleared
);
213 if (cleared
> 0 && cleared
/ 512)
214 nvdimm_clear_badblocks_regions(nvdimm_bus
, phys
, cleared
);
217 long nvdimm_clear_poison(struct device
*dev
, phys_addr_t phys
,
220 struct nvdimm_bus
*nvdimm_bus
= walk_to_nvdimm_bus(dev
);
221 struct nvdimm_bus_descriptor
*nd_desc
;
222 struct nd_cmd_clear_error clear_err
;
223 struct nd_cmd_ars_cap ars_cap
;
224 u32 clear_err_unit
, mask
;
225 unsigned int noio_flag
;
231 nd_desc
= nvdimm_bus
->nd_desc
;
233 * if ndctl does not exist, it's PMEM_LEGACY and
234 * we want to just pretend everything is handled.
239 memset(&ars_cap
, 0, sizeof(ars_cap
));
240 ars_cap
.address
= phys
;
241 ars_cap
.length
= len
;
242 noio_flag
= memalloc_noio_save();
243 rc
= nd_desc
->ndctl(nd_desc
, NULL
, ND_CMD_ARS_CAP
, &ars_cap
,
244 sizeof(ars_cap
), &cmd_rc
);
245 memalloc_noio_restore(noio_flag
);
250 clear_err_unit
= ars_cap
.clear_err_unit
;
251 if (!clear_err_unit
|| !is_power_of_2(clear_err_unit
))
254 mask
= clear_err_unit
- 1;
255 if ((phys
| len
) & mask
)
257 memset(&clear_err
, 0, sizeof(clear_err
));
258 clear_err
.address
= phys
;
259 clear_err
.length
= len
;
260 noio_flag
= memalloc_noio_save();
261 rc
= nd_desc
->ndctl(nd_desc
, NULL
, ND_CMD_CLEAR_ERROR
, &clear_err
,
262 sizeof(clear_err
), &cmd_rc
);
263 memalloc_noio_restore(noio_flag
);
269 nvdimm_account_cleared_poison(nvdimm_bus
, phys
, clear_err
.cleared
);
271 return clear_err
.cleared
;
273 EXPORT_SYMBOL_GPL(nvdimm_clear_poison
);
275 static int nvdimm_bus_match(struct device
*dev
, const struct device_driver
*drv
);
277 static const struct bus_type nvdimm_bus_type
= {
279 .uevent
= nvdimm_bus_uevent
,
280 .match
= nvdimm_bus_match
,
281 .probe
= nvdimm_bus_probe
,
282 .remove
= nvdimm_bus_remove
,
283 .shutdown
= nvdimm_bus_shutdown
,
286 static void nvdimm_bus_release(struct device
*dev
)
288 struct nvdimm_bus
*nvdimm_bus
;
290 nvdimm_bus
= container_of(dev
, struct nvdimm_bus
, dev
);
291 ida_free(&nd_ida
, nvdimm_bus
->id
);
295 static const struct device_type nvdimm_bus_dev_type
= {
296 .release
= nvdimm_bus_release
,
297 .groups
= nvdimm_bus_attribute_groups
,
300 bool is_nvdimm_bus(struct device
*dev
)
302 return dev
->type
== &nvdimm_bus_dev_type
;
305 struct nvdimm_bus
*walk_to_nvdimm_bus(struct device
*nd_dev
)
309 for (dev
= nd_dev
; dev
; dev
= dev
->parent
)
310 if (is_nvdimm_bus(dev
))
312 dev_WARN_ONCE(nd_dev
, !dev
, "invalid dev, not on nd bus\n");
314 return to_nvdimm_bus(dev
);
318 struct nvdimm_bus
*to_nvdimm_bus(struct device
*dev
)
320 struct nvdimm_bus
*nvdimm_bus
;
322 nvdimm_bus
= container_of(dev
, struct nvdimm_bus
, dev
);
323 WARN_ON(!is_nvdimm_bus(dev
));
326 EXPORT_SYMBOL_GPL(to_nvdimm_bus
);
328 struct nvdimm_bus
*nvdimm_to_bus(struct nvdimm
*nvdimm
)
330 return to_nvdimm_bus(nvdimm
->dev
.parent
);
332 EXPORT_SYMBOL_GPL(nvdimm_to_bus
);
334 static struct lock_class_key nvdimm_bus_key
;
336 struct nvdimm_bus
*nvdimm_bus_register(struct device
*parent
,
337 struct nvdimm_bus_descriptor
*nd_desc
)
339 struct nvdimm_bus
*nvdimm_bus
;
342 nvdimm_bus
= kzalloc(sizeof(*nvdimm_bus
), GFP_KERNEL
);
345 INIT_LIST_HEAD(&nvdimm_bus
->list
);
346 INIT_LIST_HEAD(&nvdimm_bus
->mapping_list
);
347 init_waitqueue_head(&nvdimm_bus
->wait
);
348 nvdimm_bus
->id
= ida_alloc(&nd_ida
, GFP_KERNEL
);
349 if (nvdimm_bus
->id
< 0) {
353 mutex_init(&nvdimm_bus
->reconfig_mutex
);
354 badrange_init(&nvdimm_bus
->badrange
);
355 nvdimm_bus
->nd_desc
= nd_desc
;
356 nvdimm_bus
->dev
.parent
= parent
;
357 nvdimm_bus
->dev
.type
= &nvdimm_bus_dev_type
;
358 nvdimm_bus
->dev
.groups
= nd_desc
->attr_groups
;
359 nvdimm_bus
->dev
.bus
= &nvdimm_bus_type
;
360 nvdimm_bus
->dev
.of_node
= nd_desc
->of_node
;
361 device_initialize(&nvdimm_bus
->dev
);
362 lockdep_set_class(&nvdimm_bus
->dev
.mutex
, &nvdimm_bus_key
);
363 device_set_pm_not_required(&nvdimm_bus
->dev
);
364 rc
= dev_set_name(&nvdimm_bus
->dev
, "ndbus%d", nvdimm_bus
->id
);
368 rc
= device_add(&nvdimm_bus
->dev
);
370 dev_dbg(&nvdimm_bus
->dev
, "registration failed: %d\n", rc
);
376 put_device(&nvdimm_bus
->dev
);
379 EXPORT_SYMBOL_GPL(nvdimm_bus_register
);
381 void nvdimm_bus_unregister(struct nvdimm_bus
*nvdimm_bus
)
385 device_unregister(&nvdimm_bus
->dev
);
387 EXPORT_SYMBOL_GPL(nvdimm_bus_unregister
);
389 static int child_unregister(struct device
*dev
, void *data
)
392 * the singular ndctl class device per bus needs to be
393 * "device_destroy"ed, so skip it here
395 * i.e. remove classless children
401 nvdimm_delete(to_nvdimm(dev
));
403 nd_device_unregister(dev
, ND_SYNC
);
408 static void free_badrange_list(struct list_head
*badrange_list
)
410 struct badrange_entry
*bre
, *next
;
412 list_for_each_entry_safe(bre
, next
, badrange_list
, list
) {
413 list_del(&bre
->list
);
416 list_del_init(badrange_list
);
419 static void nd_bus_remove(struct device
*dev
)
421 struct nvdimm_bus
*nvdimm_bus
= to_nvdimm_bus(dev
);
423 mutex_lock(&nvdimm_bus_list_mutex
);
424 list_del_init(&nvdimm_bus
->list
);
425 mutex_unlock(&nvdimm_bus_list_mutex
);
427 wait_event(nvdimm_bus
->wait
,
428 atomic_read(&nvdimm_bus
->ioctl_active
) == 0);
431 device_for_each_child(&nvdimm_bus
->dev
, NULL
, child_unregister
);
433 spin_lock(&nvdimm_bus
->badrange
.lock
);
434 free_badrange_list(&nvdimm_bus
->badrange
.list
);
435 spin_unlock(&nvdimm_bus
->badrange
.lock
);
437 nvdimm_bus_destroy_ndctl(nvdimm_bus
);
440 static int nd_bus_probe(struct device
*dev
)
442 struct nvdimm_bus
*nvdimm_bus
= to_nvdimm_bus(dev
);
445 rc
= nvdimm_bus_create_ndctl(nvdimm_bus
);
449 mutex_lock(&nvdimm_bus_list_mutex
);
450 list_add_tail(&nvdimm_bus
->list
, &nvdimm_bus_list
);
451 mutex_unlock(&nvdimm_bus_list_mutex
);
453 /* enable bus provider attributes to look up their local context */
454 dev_set_drvdata(dev
, nvdimm_bus
->nd_desc
);
459 static struct nd_device_driver nd_bus_driver
= {
460 .probe
= nd_bus_probe
,
461 .remove
= nd_bus_remove
,
464 .suppress_bind_attrs
= true,
465 .bus
= &nvdimm_bus_type
,
466 .owner
= THIS_MODULE
,
467 .mod_name
= KBUILD_MODNAME
,
471 static int nvdimm_bus_match(struct device
*dev
, const struct device_driver
*drv
)
473 const struct nd_device_driver
*nd_drv
= to_nd_device_driver(drv
);
475 if (is_nvdimm_bus(dev
) && nd_drv
== &nd_bus_driver
)
478 return !!test_bit(to_nd_device_type(dev
), &nd_drv
->type
);
481 static ASYNC_DOMAIN_EXCLUSIVE(nd_async_domain
);
483 void nd_synchronize(void)
485 async_synchronize_full_domain(&nd_async_domain
);
487 EXPORT_SYMBOL_GPL(nd_synchronize
);
489 static void nd_async_device_register(void *d
, async_cookie_t cookie
)
491 struct device
*dev
= d
;
493 if (device_add(dev
) != 0) {
494 dev_err(dev
, "%s: failed\n", __func__
);
499 put_device(dev
->parent
);
502 static void nd_async_device_unregister(void *d
, async_cookie_t cookie
)
504 struct device
*dev
= d
;
506 /* flush bus operations before delete */
507 nvdimm_bus_lock(dev
);
508 nvdimm_bus_unlock(dev
);
510 device_unregister(dev
);
514 static void __nd_device_register(struct device
*dev
, bool sync
)
520 * Ensure that region devices always have their NUMA node set as
521 * early as possible. This way we are able to make certain that
522 * any memory associated with the creation and the creation
523 * itself of the region is associated with the correct node.
525 if (is_nd_region(dev
))
526 set_dev_node(dev
, to_nd_region(dev
)->numa_node
);
528 dev
->bus
= &nvdimm_bus_type
;
529 device_set_pm_not_required(dev
);
531 get_device(dev
->parent
);
532 if (dev_to_node(dev
) == NUMA_NO_NODE
)
533 set_dev_node(dev
, dev_to_node(dev
->parent
));
538 nd_async_device_register(dev
, 0);
540 async_schedule_dev_domain(nd_async_device_register
, dev
,
544 void nd_device_register(struct device
*dev
)
546 __nd_device_register(dev
, false);
548 EXPORT_SYMBOL(nd_device_register
);
550 void nd_device_register_sync(struct device
*dev
)
552 __nd_device_register(dev
, true);
555 void nd_device_unregister(struct device
*dev
, enum nd_async_mode mode
)
562 * In the async case this is being triggered with the
563 * device lock held and the unregistration work needs to
564 * be moved out of line iff this is thread has won the
565 * race to schedule the deletion.
567 if (!kill_device(dev
))
571 async_schedule_domain(nd_async_device_unregister
, dev
,
576 * In the sync case the device is being unregistered due
577 * to a state change of the parent. Claim the kill state
578 * to synchronize against other unregistration requests,
579 * or otherwise let the async path handle it if the
580 * unregistration was already queued.
583 killed
= kill_device(dev
);
590 device_unregister(dev
);
594 EXPORT_SYMBOL(nd_device_unregister
);
597 * __nd_driver_register() - register a region or a namespace driver
598 * @nd_drv: driver to register
599 * @owner: automatically set by nd_driver_register() macro
600 * @mod_name: automatically set by nd_driver_register() macro
602 int __nd_driver_register(struct nd_device_driver
*nd_drv
, struct module
*owner
,
603 const char *mod_name
)
605 struct device_driver
*drv
= &nd_drv
->drv
;
608 pr_debug("driver type bitmask not set (%ps)\n",
609 __builtin_return_address(0));
613 if (!nd_drv
->probe
) {
614 pr_debug("%s ->probe() must be specified\n", mod_name
);
618 drv
->bus
= &nvdimm_bus_type
;
620 drv
->mod_name
= mod_name
;
622 return driver_register(drv
);
624 EXPORT_SYMBOL(__nd_driver_register
);
626 void nvdimm_check_and_set_ro(struct gendisk
*disk
)
628 struct device
*dev
= disk_to_dev(disk
)->parent
;
629 struct nd_region
*nd_region
= to_nd_region(dev
->parent
);
630 int disk_ro
= get_disk_ro(disk
);
632 /* catch the disk up with the region ro state */
633 if (disk_ro
== nd_region
->ro
)
636 dev_info(dev
, "%s read-%s, marking %s read-%s\n",
637 dev_name(&nd_region
->dev
), nd_region
->ro
? "only" : "write",
638 disk
->disk_name
, nd_region
->ro
? "only" : "write");
639 set_disk_ro(disk
, nd_region
->ro
);
641 EXPORT_SYMBOL(nvdimm_check_and_set_ro
);
643 static ssize_t
modalias_show(struct device
*dev
, struct device_attribute
*attr
,
646 return sprintf(buf
, ND_DEVICE_MODALIAS_FMT
"\n",
647 to_nd_device_type(dev
));
649 static DEVICE_ATTR_RO(modalias
);
651 static ssize_t
devtype_show(struct device
*dev
, struct device_attribute
*attr
,
654 return sprintf(buf
, "%s\n", dev
->type
->name
);
656 static DEVICE_ATTR_RO(devtype
);
658 static struct attribute
*nd_device_attributes
[] = {
659 &dev_attr_modalias
.attr
,
660 &dev_attr_devtype
.attr
,
665 * nd_device_attribute_group - generic attributes for all devices on an nd bus
667 const struct attribute_group nd_device_attribute_group
= {
668 .attrs
= nd_device_attributes
,
671 static ssize_t
numa_node_show(struct device
*dev
,
672 struct device_attribute
*attr
, char *buf
)
674 return sprintf(buf
, "%d\n", dev_to_node(dev
));
676 static DEVICE_ATTR_RO(numa_node
);
678 static int nvdimm_dev_to_target_node(struct device
*dev
)
680 struct device
*parent
= dev
->parent
;
681 struct nd_region
*nd_region
= NULL
;
683 if (is_nd_region(dev
))
684 nd_region
= to_nd_region(dev
);
685 else if (parent
&& is_nd_region(parent
))
686 nd_region
= to_nd_region(parent
);
690 return nd_region
->target_node
;
693 static ssize_t
target_node_show(struct device
*dev
,
694 struct device_attribute
*attr
, char *buf
)
696 return sprintf(buf
, "%d\n", nvdimm_dev_to_target_node(dev
));
698 static DEVICE_ATTR_RO(target_node
);
700 static struct attribute
*nd_numa_attributes
[] = {
701 &dev_attr_numa_node
.attr
,
702 &dev_attr_target_node
.attr
,
706 static umode_t
nd_numa_attr_visible(struct kobject
*kobj
, struct attribute
*a
,
709 struct device
*dev
= container_of(kobj
, typeof(*dev
), kobj
);
711 if (!IS_ENABLED(CONFIG_NUMA
))
714 if (a
== &dev_attr_target_node
.attr
&&
715 nvdimm_dev_to_target_node(dev
) == NUMA_NO_NODE
)
722 * nd_numa_attribute_group - NUMA attributes for all devices on an nd bus
724 const struct attribute_group nd_numa_attribute_group
= {
725 .attrs
= nd_numa_attributes
,
726 .is_visible
= nd_numa_attr_visible
,
729 static void ndctl_release(struct device
*dev
)
734 static struct lock_class_key nvdimm_ndctl_key
;
736 int nvdimm_bus_create_ndctl(struct nvdimm_bus
*nvdimm_bus
)
738 dev_t devt
= MKDEV(nvdimm_bus_major
, nvdimm_bus
->id
);
742 dev
= kzalloc(sizeof(*dev
), GFP_KERNEL
);
745 device_initialize(dev
);
746 lockdep_set_class(&dev
->mutex
, &nvdimm_ndctl_key
);
747 device_set_pm_not_required(dev
);
748 dev
->class = &nd_class
;
749 dev
->parent
= &nvdimm_bus
->dev
;
751 dev
->release
= ndctl_release
;
752 rc
= dev_set_name(dev
, "ndctl%d", nvdimm_bus
->id
);
756 rc
= device_add(dev
);
758 dev_dbg(&nvdimm_bus
->dev
, "failed to register ndctl%d: %d\n",
769 void nvdimm_bus_destroy_ndctl(struct nvdimm_bus
*nvdimm_bus
)
771 device_destroy(&nd_class
, MKDEV(nvdimm_bus_major
, nvdimm_bus
->id
));
774 static const struct nd_cmd_desc __nd_cmd_dimm_descs
[] = {
775 [ND_CMD_IMPLEMENTED
] = { },
778 .out_sizes
= { 4, 128, },
780 [ND_CMD_SMART_THRESHOLD
] = {
782 .out_sizes
= { 4, 8, },
784 [ND_CMD_DIMM_FLAGS
] = {
786 .out_sizes
= { 4, 4 },
788 [ND_CMD_GET_CONFIG_SIZE
] = {
790 .out_sizes
= { 4, 4, 4, },
792 [ND_CMD_GET_CONFIG_DATA
] = {
794 .in_sizes
= { 4, 4, },
796 .out_sizes
= { 4, UINT_MAX
, },
798 [ND_CMD_SET_CONFIG_DATA
] = {
800 .in_sizes
= { 4, 4, UINT_MAX
, },
806 .in_sizes
= { 4, 4, UINT_MAX
, },
808 .out_sizes
= { 4, 4, UINT_MAX
, },
812 .in_sizes
= { sizeof(struct nd_cmd_pkg
), UINT_MAX
, },
814 .out_sizes
= { UINT_MAX
, },
818 const struct nd_cmd_desc
*nd_cmd_dimm_desc(int cmd
)
820 if (cmd
< ARRAY_SIZE(__nd_cmd_dimm_descs
))
821 return &__nd_cmd_dimm_descs
[cmd
];
824 EXPORT_SYMBOL_GPL(nd_cmd_dimm_desc
);
826 static const struct nd_cmd_desc __nd_cmd_bus_descs
[] = {
827 [ND_CMD_IMPLEMENTED
] = { },
830 .in_sizes
= { 8, 8, },
832 .out_sizes
= { 4, 4, 4, 4, },
834 [ND_CMD_ARS_START
] = {
836 .in_sizes
= { 8, 8, 2, 1, 5, },
838 .out_sizes
= { 4, 4, },
840 [ND_CMD_ARS_STATUS
] = {
842 .out_sizes
= { 4, 4, UINT_MAX
, },
844 [ND_CMD_CLEAR_ERROR
] = {
846 .in_sizes
= { 8, 8, },
848 .out_sizes
= { 4, 4, 8, },
852 .in_sizes
= { sizeof(struct nd_cmd_pkg
), UINT_MAX
, },
854 .out_sizes
= { UINT_MAX
, },
858 const struct nd_cmd_desc
*nd_cmd_bus_desc(int cmd
)
860 if (cmd
< ARRAY_SIZE(__nd_cmd_bus_descs
))
861 return &__nd_cmd_bus_descs
[cmd
];
864 EXPORT_SYMBOL_GPL(nd_cmd_bus_desc
);
866 u32
nd_cmd_in_size(struct nvdimm
*nvdimm
, int cmd
,
867 const struct nd_cmd_desc
*desc
, int idx
, void *buf
)
869 if (idx
>= desc
->in_num
)
872 if (desc
->in_sizes
[idx
] < UINT_MAX
)
873 return desc
->in_sizes
[idx
];
875 if (nvdimm
&& cmd
== ND_CMD_SET_CONFIG_DATA
&& idx
== 2) {
876 struct nd_cmd_set_config_hdr
*hdr
= buf
;
878 return hdr
->in_length
;
879 } else if (nvdimm
&& cmd
== ND_CMD_VENDOR
&& idx
== 2) {
880 struct nd_cmd_vendor_hdr
*hdr
= buf
;
882 return hdr
->in_length
;
883 } else if (cmd
== ND_CMD_CALL
) {
884 struct nd_cmd_pkg
*pkg
= buf
;
886 return pkg
->nd_size_in
;
891 EXPORT_SYMBOL_GPL(nd_cmd_in_size
);
893 u32
nd_cmd_out_size(struct nvdimm
*nvdimm
, int cmd
,
894 const struct nd_cmd_desc
*desc
, int idx
, const u32
*in_field
,
895 const u32
*out_field
, unsigned long remainder
)
897 if (idx
>= desc
->out_num
)
900 if (desc
->out_sizes
[idx
] < UINT_MAX
)
901 return desc
->out_sizes
[idx
];
903 if (nvdimm
&& cmd
== ND_CMD_GET_CONFIG_DATA
&& idx
== 1)
905 else if (nvdimm
&& cmd
== ND_CMD_VENDOR
&& idx
== 2)
907 else if (!nvdimm
&& cmd
== ND_CMD_ARS_STATUS
&& idx
== 2) {
909 * Per table 9-276 ARS Data in ACPI 6.1, out_field[1] is
910 * "Size of Output Buffer in bytes, including this
913 if (out_field
[1] < 4)
916 * ACPI 6.1 is ambiguous if 'status' is included in the
917 * output size. If we encounter an output size that
918 * overshoots the remainder by 4 bytes, assume it was
919 * including 'status'.
921 if (out_field
[1] - 4 == remainder
)
923 return out_field
[1] - 8;
924 } else if (cmd
== ND_CMD_CALL
) {
925 struct nd_cmd_pkg
*pkg
= (struct nd_cmd_pkg
*) in_field
;
927 return pkg
->nd_size_out
;
933 EXPORT_SYMBOL_GPL(nd_cmd_out_size
);
935 void wait_nvdimm_bus_probe_idle(struct device
*dev
)
937 struct nvdimm_bus
*nvdimm_bus
= walk_to_nvdimm_bus(dev
);
940 if (nvdimm_bus
->probe_active
== 0)
942 nvdimm_bus_unlock(dev
);
944 wait_event(nvdimm_bus
->wait
,
945 nvdimm_bus
->probe_active
== 0);
947 nvdimm_bus_lock(dev
);
951 static int nd_pmem_forget_poison_check(struct device
*dev
, void *data
)
953 struct nd_cmd_clear_error
*clear_err
=
954 (struct nd_cmd_clear_error
*)data
;
955 struct nd_btt
*nd_btt
= is_nd_btt(dev
) ? to_nd_btt(dev
) : NULL
;
956 struct nd_pfn
*nd_pfn
= is_nd_pfn(dev
) ? to_nd_pfn(dev
) : NULL
;
957 struct nd_dax
*nd_dax
= is_nd_dax(dev
) ? to_nd_dax(dev
) : NULL
;
958 struct nd_namespace_common
*ndns
= NULL
;
959 struct nd_namespace_io
*nsio
;
960 resource_size_t offset
= 0, end_trunc
= 0, start
, end
, pstart
, pend
;
962 if (nd_dax
|| !dev
->driver
)
965 start
= clear_err
->address
;
966 end
= clear_err
->address
+ clear_err
->cleared
- 1;
968 if (nd_btt
|| nd_pfn
|| nd_dax
) {
974 ndns
= nd_dax
->nd_pfn
.ndns
;
981 nsio
= to_nd_namespace_io(&ndns
->dev
);
982 pstart
= nsio
->res
.start
+ offset
;
983 pend
= nsio
->res
.end
- end_trunc
;
985 if ((pstart
>= start
) && (pend
<= end
))
992 static int nd_ns_forget_poison_check(struct device
*dev
, void *data
)
994 return device_for_each_child(dev
, data
, nd_pmem_forget_poison_check
);
997 /* set_config requires an idle interleave set */
998 static int nd_cmd_clear_to_send(struct nvdimm_bus
*nvdimm_bus
,
999 struct nvdimm
*nvdimm
, unsigned int cmd
, void *data
)
1001 struct nvdimm_bus_descriptor
*nd_desc
= nvdimm_bus
->nd_desc
;
1003 /* ask the bus provider if it would like to block this request */
1004 if (nd_desc
->clear_to_send
) {
1005 int rc
= nd_desc
->clear_to_send(nd_desc
, nvdimm
, cmd
, data
);
1011 /* require clear error to go through the pmem driver */
1012 if (!nvdimm
&& cmd
== ND_CMD_CLEAR_ERROR
)
1013 return device_for_each_child(&nvdimm_bus
->dev
, data
,
1014 nd_ns_forget_poison_check
);
1016 if (!nvdimm
|| cmd
!= ND_CMD_SET_CONFIG_DATA
)
1019 /* prevent label manipulation while the kernel owns label updates */
1020 wait_nvdimm_bus_probe_idle(&nvdimm_bus
->dev
);
1021 if (atomic_read(&nvdimm
->busy
))
1026 static int __nd_ioctl(struct nvdimm_bus
*nvdimm_bus
, struct nvdimm
*nvdimm
,
1027 int read_only
, unsigned int ioctl_cmd
, unsigned long arg
)
1029 struct nvdimm_bus_descriptor
*nd_desc
= nvdimm_bus
->nd_desc
;
1030 const struct nd_cmd_desc
*desc
= NULL
;
1031 unsigned int cmd
= _IOC_NR(ioctl_cmd
);
1032 struct device
*dev
= &nvdimm_bus
->dev
;
1033 void __user
*p
= (void __user
*) arg
;
1034 char *out_env
= NULL
, *in_env
= NULL
;
1035 const char *cmd_name
, *dimm_name
;
1036 u32 in_len
= 0, out_len
= 0;
1037 unsigned int func
= cmd
;
1038 unsigned long cmd_mask
;
1039 struct nd_cmd_pkg pkg
;
1045 desc
= nd_cmd_dimm_desc(cmd
);
1046 cmd_name
= nvdimm_cmd_name(cmd
);
1047 cmd_mask
= nvdimm
->cmd_mask
;
1048 dimm_name
= dev_name(&nvdimm
->dev
);
1050 desc
= nd_cmd_bus_desc(cmd
);
1051 cmd_name
= nvdimm_bus_cmd_name(cmd
);
1052 cmd_mask
= nd_desc
->cmd_mask
;
1056 /* Validate command family support against bus declared support */
1057 if (cmd
== ND_CMD_CALL
) {
1058 unsigned long *mask
;
1060 if (copy_from_user(&pkg
, p
, sizeof(pkg
)))
1064 if (pkg
.nd_family
> NVDIMM_FAMILY_MAX
)
1066 mask
= &nd_desc
->dimm_family_mask
;
1068 if (pkg
.nd_family
> NVDIMM_BUS_FAMILY_MAX
)
1070 mask
= &nd_desc
->bus_family_mask
;
1073 if (!test_bit(pkg
.nd_family
, mask
))
1078 (desc
->out_num
+ desc
->in_num
== 0) ||
1079 cmd
> ND_CMD_CALL
||
1080 !test_bit(cmd
, &cmd_mask
))
1083 /* fail write commands (when read-only) */
1087 case ND_CMD_SET_CONFIG_DATA
:
1088 case ND_CMD_ARS_START
:
1089 case ND_CMD_CLEAR_ERROR
:
1091 dev_dbg(dev
, "'%s' command while read-only.\n",
1092 nvdimm
? nvdimm_cmd_name(cmd
)
1093 : nvdimm_bus_cmd_name(cmd
));
1099 /* process an input envelope */
1100 in_env
= kzalloc(ND_CMD_MAX_ENVELOPE
, GFP_KERNEL
);
1103 for (i
= 0; i
< desc
->in_num
; i
++) {
1106 in_size
= nd_cmd_in_size(nvdimm
, cmd
, desc
, i
, in_env
);
1107 if (in_size
== UINT_MAX
) {
1108 dev_err(dev
, "%s:%s unknown input size cmd: %s field: %d\n",
1109 __func__
, dimm_name
, cmd_name
, i
);
1113 if (in_len
< ND_CMD_MAX_ENVELOPE
)
1114 copy
= min_t(u32
, ND_CMD_MAX_ENVELOPE
- in_len
, in_size
);
1117 if (copy
&& copy_from_user(&in_env
[in_len
], p
+ in_len
, copy
)) {
1124 if (cmd
== ND_CMD_CALL
) {
1125 func
= pkg
.nd_command
;
1126 dev_dbg(dev
, "%s, idx: %llu, in: %u, out: %u, len %llu\n",
1127 dimm_name
, pkg
.nd_command
,
1128 in_len
, out_len
, buf_len
);
1131 /* process an output envelope */
1132 out_env
= kzalloc(ND_CMD_MAX_ENVELOPE
, GFP_KERNEL
);
1138 for (i
= 0; i
< desc
->out_num
; i
++) {
1139 u32 out_size
= nd_cmd_out_size(nvdimm
, cmd
, desc
, i
,
1140 (u32
*) in_env
, (u32
*) out_env
, 0);
1143 if (out_size
== UINT_MAX
) {
1144 dev_dbg(dev
, "%s unknown output size cmd: %s field: %d\n",
1145 dimm_name
, cmd_name
, i
);
1149 if (out_len
< ND_CMD_MAX_ENVELOPE
)
1150 copy
= min_t(u32
, ND_CMD_MAX_ENVELOPE
- out_len
, out_size
);
1153 if (copy
&& copy_from_user(&out_env
[out_len
],
1154 p
+ in_len
+ out_len
, copy
)) {
1158 out_len
+= out_size
;
1161 buf_len
= (u64
) out_len
+ (u64
) in_len
;
1162 if (buf_len
> ND_IOCTL_MAX_BUFLEN
) {
1163 dev_dbg(dev
, "%s cmd: %s buf_len: %llu > %d\n", dimm_name
,
1164 cmd_name
, buf_len
, ND_IOCTL_MAX_BUFLEN
);
1169 buf
= vmalloc(buf_len
);
1175 if (copy_from_user(buf
, p
, buf_len
)) {
1181 nvdimm_bus_lock(dev
);
1182 rc
= nd_cmd_clear_to_send(nvdimm_bus
, nvdimm
, func
, buf
);
1186 rc
= nd_desc
->ndctl(nd_desc
, nvdimm
, cmd
, buf
, buf_len
, &cmd_rc
);
1190 if (!nvdimm
&& cmd
== ND_CMD_CLEAR_ERROR
&& cmd_rc
>= 0) {
1191 struct nd_cmd_clear_error
*clear_err
= buf
;
1193 nvdimm_account_cleared_poison(nvdimm_bus
, clear_err
->address
,
1194 clear_err
->cleared
);
1197 if (copy_to_user(p
, buf
, buf_len
))
1201 nvdimm_bus_unlock(dev
);
1210 enum nd_ioctl_mode
{
1215 static int match_dimm(struct device
*dev
, void *data
)
1217 long id
= (long) data
;
1219 if (is_nvdimm(dev
)) {
1220 struct nvdimm
*nvdimm
= to_nvdimm(dev
);
1222 return nvdimm
->id
== id
;
1228 static long nd_ioctl(struct file
*file
, unsigned int cmd
, unsigned long arg
,
1229 enum nd_ioctl_mode mode
)
1232 struct nvdimm_bus
*nvdimm_bus
, *found
= NULL
;
1233 long id
= (long) file
->private_data
;
1234 struct nvdimm
*nvdimm
= NULL
;
1237 ro
= ((file
->f_flags
& O_ACCMODE
) == O_RDONLY
);
1238 mutex_lock(&nvdimm_bus_list_mutex
);
1239 list_for_each_entry(nvdimm_bus
, &nvdimm_bus_list
, list
) {
1240 if (mode
== DIMM_IOCTL
) {
1243 dev
= device_find_child(&nvdimm_bus
->dev
,
1244 file
->private_data
, match_dimm
);
1247 nvdimm
= to_nvdimm(dev
);
1249 } else if (nvdimm_bus
->id
== id
) {
1254 atomic_inc(&nvdimm_bus
->ioctl_active
);
1258 mutex_unlock(&nvdimm_bus_list_mutex
);
1264 rc
= __nd_ioctl(nvdimm_bus
, nvdimm
, ro
, cmd
, arg
);
1267 put_device(&nvdimm
->dev
);
1268 if (atomic_dec_and_test(&nvdimm_bus
->ioctl_active
))
1269 wake_up(&nvdimm_bus
->wait
);
1274 static long bus_ioctl(struct file
*file
, unsigned int cmd
, unsigned long arg
)
1276 return nd_ioctl(file
, cmd
, arg
, BUS_IOCTL
);
1279 static long dimm_ioctl(struct file
*file
, unsigned int cmd
, unsigned long arg
)
1281 return nd_ioctl(file
, cmd
, arg
, DIMM_IOCTL
);
1284 static int nd_open(struct inode
*inode
, struct file
*file
)
1286 long minor
= iminor(inode
);
1288 file
->private_data
= (void *) minor
;
1292 static const struct file_operations nvdimm_bus_fops
= {
1293 .owner
= THIS_MODULE
,
1295 .unlocked_ioctl
= bus_ioctl
,
1296 .compat_ioctl
= compat_ptr_ioctl
,
1297 .llseek
= noop_llseek
,
1300 static const struct file_operations nvdimm_fops
= {
1301 .owner
= THIS_MODULE
,
1303 .unlocked_ioctl
= dimm_ioctl
,
1304 .compat_ioctl
= compat_ptr_ioctl
,
1305 .llseek
= noop_llseek
,
1308 int __init
nvdimm_bus_init(void)
1312 rc
= bus_register(&nvdimm_bus_type
);
1316 rc
= register_chrdev(0, "ndctl", &nvdimm_bus_fops
);
1318 goto err_bus_chrdev
;
1319 nvdimm_bus_major
= rc
;
1321 rc
= register_chrdev(0, "dimmctl", &nvdimm_fops
);
1323 goto err_dimm_chrdev
;
1326 rc
= class_register(&nd_class
);
1330 rc
= driver_register(&nd_bus_driver
.drv
);
1337 class_unregister(&nd_class
);
1339 unregister_chrdev(nvdimm_major
, "dimmctl");
1341 unregister_chrdev(nvdimm_bus_major
, "ndctl");
1343 bus_unregister(&nvdimm_bus_type
);
1348 void nvdimm_bus_exit(void)
1350 driver_unregister(&nd_bus_driver
.drv
);
1351 class_unregister(&nd_class
);
1352 unregister_chrdev(nvdimm_bus_major
, "ndctl");
1353 unregister_chrdev(nvdimm_major
, "dimmctl");
1354 bus_unregister(&nvdimm_bus_type
);
1355 ida_destroy(&nd_ida
);