Merge tag 'io_uring-5.11-2020-12-23' of git://git.kernel.dk/linux-block
[linux-block.git] / drivers / nvdimm / bus.c
CommitLineData
5b497af4 1// SPDX-License-Identifier: GPL-2.0-only
45def22c
DW
2/*
3 * Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
45def22c
DW
4 */
5#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
aa9ad44a 6#include <linux/libnvdimm.h>
0930a750 7#include <linux/sched/mm.h>
62232e45 8#include <linux/vmalloc.h>
45def22c 9#include <linux/uaccess.h>
3d88002e 10#include <linux/module.h>
8c2f7e86 11#include <linux/blkdev.h>
45def22c 12#include <linux/fcntl.h>
e6dfb2de 13#include <linux/async.h>
8c2f7e86 14#include <linux/genhd.h>
62232e45 15#include <linux/ndctl.h>
4d88a97a 16#include <linux/sched.h>
45def22c 17#include <linux/slab.h>
af87b9a7 18#include <linux/cpu.h>
45def22c
DW
19#include <linux/fs.h>
20#include <linux/io.h>
62232e45 21#include <linux/mm.h>
4d88a97a 22#include <linux/nd.h>
45def22c 23#include "nd-core.h"
4d88a97a 24#include "nd.h"
006358b3 25#include "pfn.h"
45def22c 26
62232e45 27int nvdimm_major;
45def22c 28static int nvdimm_bus_major;
87a30e1f 29struct class *nd_class;
18515942 30static DEFINE_IDA(nd_ida);
45def22c 31
4d88a97a
DW
32static int to_nd_device_type(struct device *dev)
33{
34 if (is_nvdimm(dev))
35 return ND_DEVICE_DIMM;
c9e582aa 36 else if (is_memory(dev))
3d88002e
DW
37 return ND_DEVICE_REGION_PMEM;
38 else if (is_nd_blk(dev))
39 return ND_DEVICE_REGION_BLK;
cd03412a
DW
40 else if (is_nd_dax(dev))
41 return ND_DEVICE_DAX_PMEM;
c9e582aa 42 else if (is_nd_region(dev->parent))
3d88002e 43 return nd_region_to_nstype(to_nd_region(dev->parent));
4d88a97a
DW
44
45 return 0;
46}
47
48static int nvdimm_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
49{
50 return add_uevent_var(env, "MODALIAS=" ND_DEVICE_MODALIAS_FMT,
51 to_nd_device_type(dev));
52}
53
3d88002e
DW
54static struct module *to_bus_provider(struct device *dev)
55{
56 /* pin bus providers while regions are enabled */
c9e582aa 57 if (is_nd_region(dev)) {
3d88002e
DW
58 struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(dev);
59
bc9775d8 60 return nvdimm_bus->nd_desc->module;
3d88002e
DW
61 }
62 return NULL;
63}
64
eaf96153
DW
65static void nvdimm_bus_probe_start(struct nvdimm_bus *nvdimm_bus)
66{
67 nvdimm_bus_lock(&nvdimm_bus->dev);
68 nvdimm_bus->probe_active++;
69 nvdimm_bus_unlock(&nvdimm_bus->dev);
70}
71
72static void nvdimm_bus_probe_end(struct nvdimm_bus *nvdimm_bus)
73{
74 nvdimm_bus_lock(&nvdimm_bus->dev);
75 if (--nvdimm_bus->probe_active == 0)
b70d31d0 76 wake_up(&nvdimm_bus->wait);
eaf96153
DW
77 nvdimm_bus_unlock(&nvdimm_bus->dev);
78}
79
4d88a97a
DW
80static int nvdimm_bus_probe(struct device *dev)
81{
82 struct nd_device_driver *nd_drv = to_nd_device_driver(dev->driver);
3d88002e 83 struct module *provider = to_bus_provider(dev);
4d88a97a
DW
84 struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(dev);
85 int rc;
86
3d88002e
DW
87 if (!try_module_get(provider))
88 return -ENXIO;
89
3f46833d
DW
90 dev_dbg(&nvdimm_bus->dev, "START: %s.probe(%s)\n",
91 dev->driver->name, dev_name(dev));
92
eaf96153 93 nvdimm_bus_probe_start(nvdimm_bus);
87a30e1f 94 debug_nvdimm_lock(dev);
4d88a97a 95 rc = nd_drv->probe(dev);
87a30e1f
DW
96 debug_nvdimm_unlock(dev);
97
1c97afa7
AK
98 if ((rc == 0 || rc == -EOPNOTSUPP) &&
99 dev->parent && is_nd_region(dev->parent))
a2d1c7a6 100 nd_region_advance_seeds(to_nd_region(dev->parent), dev);
eaf96153
DW
101 nvdimm_bus_probe_end(nvdimm_bus);
102
3f46833d 103 dev_dbg(&nvdimm_bus->dev, "END: %s.probe(%s) = %d\n", dev->driver->name,
4d88a97a 104 dev_name(dev), rc);
8c2f7e86 105
3d88002e
DW
106 if (rc != 0)
107 module_put(provider);
4d88a97a
DW
108 return rc;
109}
110
111static int nvdimm_bus_remove(struct device *dev)
112{
113 struct nd_device_driver *nd_drv = to_nd_device_driver(dev->driver);
3d88002e 114 struct module *provider = to_bus_provider(dev);
4d88a97a 115 struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(dev);
6cf9c5ba 116 int rc = 0;
4d88a97a 117
87a30e1f
DW
118 if (nd_drv->remove) {
119 debug_nvdimm_lock(dev);
6cf9c5ba 120 rc = nd_drv->remove(dev);
87a30e1f
DW
121 debug_nvdimm_unlock(dev);
122 }
eaf96153 123
4d88a97a
DW
124 dev_dbg(&nvdimm_bus->dev, "%s.remove(%s) = %d\n", dev->driver->name,
125 dev_name(dev), rc);
3d88002e 126 module_put(provider);
4d88a97a
DW
127 return rc;
128}
129
476f848a
DW
130static void nvdimm_bus_shutdown(struct device *dev)
131{
132 struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(dev);
133 struct nd_device_driver *nd_drv = NULL;
134
135 if (dev->driver)
136 nd_drv = to_nd_device_driver(dev->driver);
137
138 if (nd_drv && nd_drv->shutdown) {
139 nd_drv->shutdown(dev);
140 dev_dbg(&nvdimm_bus->dev, "%s.shutdown(%s)\n",
141 dev->driver->name, dev_name(dev));
142 }
143}
144
71999466
DW
145void nd_device_notify(struct device *dev, enum nvdimm_event event)
146{
87a30e1f 147 nd_device_lock(dev);
71999466
DW
148 if (dev->driver) {
149 struct nd_device_driver *nd_drv;
150
151 nd_drv = to_nd_device_driver(dev->driver);
152 if (nd_drv->notify)
153 nd_drv->notify(dev, event);
154 }
87a30e1f 155 nd_device_unlock(dev);
71999466
DW
156}
157EXPORT_SYMBOL(nd_device_notify);
158
159void nvdimm_region_notify(struct nd_region *nd_region, enum nvdimm_event event)
160{
161 struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(&nd_region->dev);
162
163 if (!nvdimm_bus)
164 return;
165
166 /* caller is responsible for holding a reference on the device */
167 nd_device_notify(&nd_region->dev, event);
168}
169EXPORT_SYMBOL_GPL(nvdimm_region_notify);
170
23f49844
DW
171struct clear_badblocks_context {
172 resource_size_t phys, cleared;
173};
174
175static int nvdimm_clear_badblocks_region(struct device *dev, void *data)
176{
177 struct clear_badblocks_context *ctx = data;
178 struct nd_region *nd_region;
179 resource_size_t ndr_end;
180 sector_t sector;
181
182 /* make sure device is a region */
c42adf87 183 if (!is_memory(dev))
23f49844
DW
184 return 0;
185
186 nd_region = to_nd_region(dev);
187 ndr_end = nd_region->ndr_start + nd_region->ndr_size - 1;
188
189 /* make sure we are in the region */
190 if (ctx->phys < nd_region->ndr_start
191 || (ctx->phys + ctx->cleared) > ndr_end)
192 return 0;
193
194 sector = (ctx->phys - nd_region->ndr_start) / 512;
195 badblocks_clear(&nd_region->bb, sector, ctx->cleared / 512);
196
975750a9
TK
197 if (nd_region->bb_state)
198 sysfs_notify_dirent(nd_region->bb_state);
199
23f49844
DW
200 return 0;
201}
202
203static void nvdimm_clear_badblocks_regions(struct nvdimm_bus *nvdimm_bus,
204 phys_addr_t phys, u64 cleared)
205{
206 struct clear_badblocks_context ctx = {
207 .phys = phys,
208 .cleared = cleared,
209 };
210
211 device_for_each_child(&nvdimm_bus->dev, &ctx,
212 nvdimm_clear_badblocks_region);
213}
214
215static void nvdimm_account_cleared_poison(struct nvdimm_bus *nvdimm_bus,
216 phys_addr_t phys, u64 cleared)
217{
218 if (cleared > 0)
aa9ad44a 219 badrange_forget(&nvdimm_bus->badrange, phys, cleared);
23f49844
DW
220
221 if (cleared > 0 && cleared / 512)
222 nvdimm_clear_badblocks_regions(nvdimm_bus, phys, cleared);
223}
224
59e64739
DW
225long nvdimm_clear_poison(struct device *dev, phys_addr_t phys,
226 unsigned int len)
227{
228 struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(dev);
229 struct nvdimm_bus_descriptor *nd_desc;
230 struct nd_cmd_clear_error clear_err;
231 struct nd_cmd_ars_cap ars_cap;
232 u32 clear_err_unit, mask;
0930a750 233 unsigned int noio_flag;
59e64739
DW
234 int cmd_rc, rc;
235
236 if (!nvdimm_bus)
237 return -ENXIO;
238
239 nd_desc = nvdimm_bus->nd_desc;
1e8b8d96
DJ
240 /*
241 * if ndctl does not exist, it's PMEM_LEGACY and
242 * we want to just pretend everything is handled.
243 */
59e64739 244 if (!nd_desc->ndctl)
1e8b8d96 245 return len;
59e64739
DW
246
247 memset(&ars_cap, 0, sizeof(ars_cap));
248 ars_cap.address = phys;
249 ars_cap.length = len;
0930a750 250 noio_flag = memalloc_noio_save();
59e64739
DW
251 rc = nd_desc->ndctl(nd_desc, NULL, ND_CMD_ARS_CAP, &ars_cap,
252 sizeof(ars_cap), &cmd_rc);
0930a750 253 memalloc_noio_restore(noio_flag);
59e64739
DW
254 if (rc < 0)
255 return rc;
256 if (cmd_rc < 0)
257 return cmd_rc;
258 clear_err_unit = ars_cap.clear_err_unit;
259 if (!clear_err_unit || !is_power_of_2(clear_err_unit))
260 return -ENXIO;
261
262 mask = clear_err_unit - 1;
263 if ((phys | len) & mask)
264 return -ENXIO;
265 memset(&clear_err, 0, sizeof(clear_err));
266 clear_err.address = phys;
267 clear_err.length = len;
0930a750 268 noio_flag = memalloc_noio_save();
59e64739
DW
269 rc = nd_desc->ndctl(nd_desc, NULL, ND_CMD_CLEAR_ERROR, &clear_err,
270 sizeof(clear_err), &cmd_rc);
0930a750 271 memalloc_noio_restore(noio_flag);
59e64739
DW
272 if (rc < 0)
273 return rc;
274 if (cmd_rc < 0)
275 return cmd_rc;
e046114a 276
23f49844 277 nvdimm_account_cleared_poison(nvdimm_bus, phys, clear_err.cleared);
8d13c029 278
59e64739
DW
279 return clear_err.cleared;
280}
281EXPORT_SYMBOL_GPL(nvdimm_clear_poison);
282
18515942
DW
283static int nvdimm_bus_match(struct device *dev, struct device_driver *drv);
284
4d88a97a 285static struct bus_type nvdimm_bus_type = {
e6dfb2de 286 .name = "nd",
4d88a97a
DW
287 .uevent = nvdimm_bus_uevent,
288 .match = nvdimm_bus_match,
289 .probe = nvdimm_bus_probe,
290 .remove = nvdimm_bus_remove,
476f848a 291 .shutdown = nvdimm_bus_shutdown,
4d88a97a
DW
292};
293
18515942
DW
294static void nvdimm_bus_release(struct device *dev)
295{
296 struct nvdimm_bus *nvdimm_bus;
297
298 nvdimm_bus = container_of(dev, struct nvdimm_bus, dev);
299 ida_simple_remove(&nd_ida, nvdimm_bus->id);
300 kfree(nvdimm_bus);
301}
302
e755799a
DW
303static const struct device_type nvdimm_bus_dev_type = {
304 .release = nvdimm_bus_release,
305 .groups = nvdimm_bus_attribute_groups,
306};
307
87a30e1f 308bool is_nvdimm_bus(struct device *dev)
18515942 309{
e755799a 310 return dev->type == &nvdimm_bus_dev_type;
18515942
DW
311}
312
313struct nvdimm_bus *walk_to_nvdimm_bus(struct device *nd_dev)
314{
315 struct device *dev;
316
317 for (dev = nd_dev; dev; dev = dev->parent)
318 if (is_nvdimm_bus(dev))
319 break;
320 dev_WARN_ONCE(nd_dev, !dev, "invalid dev, not on nd bus\n");
321 if (dev)
322 return to_nvdimm_bus(dev);
323 return NULL;
324}
325
326struct nvdimm_bus *to_nvdimm_bus(struct device *dev)
327{
328 struct nvdimm_bus *nvdimm_bus;
329
330 nvdimm_bus = container_of(dev, struct nvdimm_bus, dev);
331 WARN_ON(!is_nvdimm_bus(dev));
332 return nvdimm_bus;
333}
334EXPORT_SYMBOL_GPL(to_nvdimm_bus);
335
f2989396
DJ
336struct nvdimm_bus *nvdimm_to_bus(struct nvdimm *nvdimm)
337{
338 return to_nvdimm_bus(nvdimm->dev.parent);
339}
340EXPORT_SYMBOL_GPL(nvdimm_to_bus);
341
18515942
DW
342struct nvdimm_bus *nvdimm_bus_register(struct device *parent,
343 struct nvdimm_bus_descriptor *nd_desc)
344{
345 struct nvdimm_bus *nvdimm_bus;
346 int rc;
347
348 nvdimm_bus = kzalloc(sizeof(*nvdimm_bus), GFP_KERNEL);
349 if (!nvdimm_bus)
350 return NULL;
351 INIT_LIST_HEAD(&nvdimm_bus->list);
352 INIT_LIST_HEAD(&nvdimm_bus->mapping_list);
b70d31d0 353 init_waitqueue_head(&nvdimm_bus->wait);
18515942 354 nvdimm_bus->id = ida_simple_get(&nd_ida, 0, 0, GFP_KERNEL);
18515942
DW
355 if (nvdimm_bus->id < 0) {
356 kfree(nvdimm_bus);
357 return NULL;
358 }
9bf3aa44
OH
359 mutex_init(&nvdimm_bus->reconfig_mutex);
360 badrange_init(&nvdimm_bus->badrange);
18515942
DW
361 nvdimm_bus->nd_desc = nd_desc;
362 nvdimm_bus->dev.parent = parent;
e755799a 363 nvdimm_bus->dev.type = &nvdimm_bus_dev_type;
18515942
DW
364 nvdimm_bus->dev.groups = nd_desc->attr_groups;
365 nvdimm_bus->dev.bus = &nvdimm_bus_type;
1ff19f48 366 nvdimm_bus->dev.of_node = nd_desc->of_node;
18515942
DW
367 dev_set_name(&nvdimm_bus->dev, "ndbus%d", nvdimm_bus->id);
368 rc = device_register(&nvdimm_bus->dev);
369 if (rc) {
370 dev_dbg(&nvdimm_bus->dev, "registration failed: %d\n", rc);
371 goto err;
372 }
373
374 return nvdimm_bus;
375 err:
376 put_device(&nvdimm_bus->dev);
377 return NULL;
378}
379EXPORT_SYMBOL_GPL(nvdimm_bus_register);
380
381void nvdimm_bus_unregister(struct nvdimm_bus *nvdimm_bus)
382{
383 if (!nvdimm_bus)
384 return;
385 device_unregister(&nvdimm_bus->dev);
386}
387EXPORT_SYMBOL_GPL(nvdimm_bus_unregister);
388
389static int child_unregister(struct device *dev, void *data)
390{
391 /*
392 * the singular ndctl class device per bus needs to be
393 * "device_destroy"ed, so skip it here
394 *
395 * i.e. remove classless children
396 */
397 if (dev->class)
7d988097
DJ
398 return 0;
399
400 if (is_nvdimm(dev)) {
401 struct nvdimm *nvdimm = to_nvdimm(dev);
402 bool dev_put = false;
403
404 /* We are shutting down. Make state frozen artificially. */
405 nvdimm_bus_lock(dev);
d78c620a 406 set_bit(NVDIMM_SECURITY_FROZEN, &nvdimm->sec.flags);
7d988097
DJ
407 if (test_and_clear_bit(NDD_WORK_PENDING, &nvdimm->flags))
408 dev_put = true;
409 nvdimm_bus_unlock(dev);
410 cancel_delayed_work_sync(&nvdimm->dwork);
411 if (dev_put)
412 put_device(dev);
413 }
414 nd_device_unregister(dev, ND_SYNC);
415
18515942
DW
416 return 0;
417}
418
aa9ad44a 419static void free_badrange_list(struct list_head *badrange_list)
18515942 420{
aa9ad44a 421 struct badrange_entry *bre, *next;
18515942 422
aa9ad44a
DJ
423 list_for_each_entry_safe(bre, next, badrange_list, list) {
424 list_del(&bre->list);
425 kfree(bre);
18515942 426 }
aa9ad44a 427 list_del_init(badrange_list);
18515942
DW
428}
429
430static int nd_bus_remove(struct device *dev)
431{
432 struct nvdimm_bus *nvdimm_bus = to_nvdimm_bus(dev);
433
434 mutex_lock(&nvdimm_bus_list_mutex);
435 list_del_init(&nvdimm_bus->list);
436 mutex_unlock(&nvdimm_bus_list_mutex);
437
b70d31d0
DW
438 wait_event(nvdimm_bus->wait,
439 atomic_read(&nvdimm_bus->ioctl_active) == 0);
440
18515942
DW
441 nd_synchronize();
442 device_for_each_child(&nvdimm_bus->dev, NULL, child_unregister);
443
aa9ad44a
DJ
444 spin_lock(&nvdimm_bus->badrange.lock);
445 free_badrange_list(&nvdimm_bus->badrange.list);
446 spin_unlock(&nvdimm_bus->badrange.lock);
18515942
DW
447
448 nvdimm_bus_destroy_ndctl(nvdimm_bus);
449
450 return 0;
451}
452
453static int nd_bus_probe(struct device *dev)
454{
455 struct nvdimm_bus *nvdimm_bus = to_nvdimm_bus(dev);
456 int rc;
457
458 rc = nvdimm_bus_create_ndctl(nvdimm_bus);
459 if (rc)
460 return rc;
461
462 mutex_lock(&nvdimm_bus_list_mutex);
463 list_add_tail(&nvdimm_bus->list, &nvdimm_bus_list);
464 mutex_unlock(&nvdimm_bus_list_mutex);
465
466 /* enable bus provider attributes to look up their local context */
467 dev_set_drvdata(dev, nvdimm_bus->nd_desc);
468
469 return 0;
470}
471
472static struct nd_device_driver nd_bus_driver = {
473 .probe = nd_bus_probe,
474 .remove = nd_bus_remove,
475 .drv = {
476 .name = "nd_bus",
477 .suppress_bind_attrs = true,
478 .bus = &nvdimm_bus_type,
479 .owner = THIS_MODULE,
480 .mod_name = KBUILD_MODNAME,
481 },
4d88a97a
DW
482};
483
18515942
DW
484static int nvdimm_bus_match(struct device *dev, struct device_driver *drv)
485{
486 struct nd_device_driver *nd_drv = to_nd_device_driver(drv);
487
488 if (is_nvdimm_bus(dev) && nd_drv == &nd_bus_driver)
489 return true;
490
491 return !!test_bit(to_nd_device_type(dev), &nd_drv->type);
492}
493
4d88a97a
DW
494static ASYNC_DOMAIN_EXCLUSIVE(nd_async_domain);
495
496void nd_synchronize(void)
497{
498 async_synchronize_full_domain(&nd_async_domain);
499}
500EXPORT_SYMBOL_GPL(nd_synchronize);
501
502static void nd_async_device_register(void *d, async_cookie_t cookie)
503{
504 struct device *dev = d;
505
506 if (device_add(dev) != 0) {
507 dev_err(dev, "%s: failed\n", __func__);
508 put_device(dev);
509 }
510 put_device(dev);
b6eae0f6
AD
511 if (dev->parent)
512 put_device(dev->parent);
4d88a97a
DW
513}
514
515static void nd_async_device_unregister(void *d, async_cookie_t cookie)
516{
517 struct device *dev = d;
518
0ba1c634
DW
519 /* flush bus operations before delete */
520 nvdimm_bus_lock(dev);
521 nvdimm_bus_unlock(dev);
522
4d88a97a
DW
523 device_unregister(dev);
524 put_device(dev);
525}
526
8c2f7e86 527void __nd_device_register(struct device *dev)
4d88a97a 528{
cd03412a
DW
529 if (!dev)
530 return;
1a091d16
AD
531
532 /*
533 * Ensure that region devices always have their NUMA node set as
534 * early as possible. This way we are able to make certain that
535 * any memory associated with the creation and the creation
536 * itself of the region is associated with the correct node.
537 */
538 if (is_nd_region(dev))
539 set_dev_node(dev, to_nd_region(dev)->numa_node);
540
4d88a97a 541 dev->bus = &nvdimm_bus_type;
af87b9a7 542 if (dev->parent) {
b6eae0f6 543 get_device(dev->parent);
af87b9a7
AD
544 if (dev_to_node(dev) == NUMA_NO_NODE)
545 set_dev_node(dev, dev_to_node(dev->parent));
546 }
4d88a97a 547 get_device(dev);
af87b9a7
AD
548
549 async_schedule_dev_domain(nd_async_device_register, dev,
550 &nd_async_domain);
4d88a97a 551}
8c2f7e86
DW
552
553void nd_device_register(struct device *dev)
554{
555 device_initialize(dev);
556 __nd_device_register(dev);
557}
4d88a97a
DW
558EXPORT_SYMBOL(nd_device_register);
559
560void nd_device_unregister(struct device *dev, enum nd_async_mode mode)
561{
8aac0e23
DW
562 bool killed;
563
4d88a97a
DW
564 switch (mode) {
565 case ND_ASYNC:
8aac0e23
DW
566 /*
567 * In the async case this is being triggered with the
568 * device lock held and the unregistration work needs to
569 * be moved out of line iff this is thread has won the
570 * race to schedule the deletion.
571 */
572 if (!kill_device(dev))
573 return;
574
4d88a97a
DW
575 get_device(dev);
576 async_schedule_domain(nd_async_device_unregister, dev,
577 &nd_async_domain);
578 break;
579 case ND_SYNC:
8aac0e23
DW
580 /*
581 * In the sync case the device is being unregistered due
582 * to a state change of the parent. Claim the kill state
583 * to synchronize against other unregistration requests,
584 * or otherwise let the async path handle it if the
585 * unregistration was already queued.
586 */
87a30e1f 587 nd_device_lock(dev);
8aac0e23 588 killed = kill_device(dev);
87a30e1f 589 nd_device_unlock(dev);
8aac0e23
DW
590
591 if (!killed)
592 return;
593
4d88a97a
DW
594 nd_synchronize();
595 device_unregister(dev);
596 break;
597 }
598}
599EXPORT_SYMBOL(nd_device_unregister);
600
601/**
602 * __nd_driver_register() - register a region or a namespace driver
603 * @nd_drv: driver to register
604 * @owner: automatically set by nd_driver_register() macro
605 * @mod_name: automatically set by nd_driver_register() macro
606 */
607int __nd_driver_register(struct nd_device_driver *nd_drv, struct module *owner,
608 const char *mod_name)
609{
610 struct device_driver *drv = &nd_drv->drv;
611
612 if (!nd_drv->type) {
d75f773c 613 pr_debug("driver type bitmask not set (%ps)\n",
4d88a97a
DW
614 __builtin_return_address(0));
615 return -EINVAL;
616 }
617
6cf9c5ba
DW
618 if (!nd_drv->probe) {
619 pr_debug("%s ->probe() must be specified\n", mod_name);
4d88a97a
DW
620 return -EINVAL;
621 }
622
623 drv->bus = &nvdimm_bus_type;
624 drv->owner = owner;
625 drv->mod_name = mod_name;
626
627 return driver_register(drv);
628}
629EXPORT_SYMBOL(__nd_driver_register);
630
32f61d67 631void nvdimm_check_and_set_ro(struct gendisk *disk)
58138820 632{
52c44d93 633 struct device *dev = disk_to_dev(disk)->parent;
58138820 634 struct nd_region *nd_region = to_nd_region(dev->parent);
254a4cd5 635 int disk_ro = get_disk_ro(disk);
58138820 636
254a4cd5
RE
637 /*
638 * Upgrade to read-only if the region is read-only preserve as
639 * read-only if the disk is already read-only.
640 */
641 if (disk_ro || nd_region->ro == disk_ro)
32f61d67 642 return;
58138820 643
254a4cd5
RE
644 dev_info(dev, "%s read-only, marking %s read-only\n",
645 dev_name(&nd_region->dev), disk->disk_name);
646 set_disk_ro(disk, 1);
58138820 647}
32f61d67 648EXPORT_SYMBOL(nvdimm_check_and_set_ro);
58138820 649
4d88a97a
DW
650static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
651 char *buf)
652{
653 return sprintf(buf, ND_DEVICE_MODALIAS_FMT "\n",
654 to_nd_device_type(dev));
655}
656static DEVICE_ATTR_RO(modalias);
657
658static ssize_t devtype_show(struct device *dev, struct device_attribute *attr,
659 char *buf)
660{
661 return sprintf(buf, "%s\n", dev->type->name);
662}
663static DEVICE_ATTR_RO(devtype);
664
665static struct attribute *nd_device_attributes[] = {
666 &dev_attr_modalias.attr,
667 &dev_attr_devtype.attr,
668 NULL,
669};
670
c01dafad 671/*
4d88a97a
DW
672 * nd_device_attribute_group - generic attributes for all devices on an nd bus
673 */
adbb6829 674const struct attribute_group nd_device_attribute_group = {
4d88a97a 675 .attrs = nd_device_attributes,
e6dfb2de
DW
676};
677
74ae66c3
TK
678static ssize_t numa_node_show(struct device *dev,
679 struct device_attribute *attr, char *buf)
680{
681 return sprintf(buf, "%d\n", dev_to_node(dev));
682}
683static DEVICE_ATTR_RO(numa_node);
684
bcba0c45
DW
685static int nvdimm_dev_to_target_node(struct device *dev)
686{
687 struct device *parent = dev->parent;
688 struct nd_region *nd_region = NULL;
689
690 if (is_nd_region(dev))
691 nd_region = to_nd_region(dev);
692 else if (parent && is_nd_region(parent))
693 nd_region = to_nd_region(parent);
694
695 if (!nd_region)
696 return NUMA_NO_NODE;
697 return nd_region->target_node;
698}
699
700static ssize_t target_node_show(struct device *dev,
701 struct device_attribute *attr, char *buf)
702{
703 return sprintf(buf, "%d\n", nvdimm_dev_to_target_node(dev));
704}
705static DEVICE_ATTR_RO(target_node);
706
74ae66c3
TK
707static struct attribute *nd_numa_attributes[] = {
708 &dev_attr_numa_node.attr,
bcba0c45 709 &dev_attr_target_node.attr,
74ae66c3
TK
710 NULL,
711};
712
713static umode_t nd_numa_attr_visible(struct kobject *kobj, struct attribute *a,
714 int n)
715{
bcba0c45
DW
716 struct device *dev = container_of(kobj, typeof(*dev), kobj);
717
74ae66c3
TK
718 if (!IS_ENABLED(CONFIG_NUMA))
719 return 0;
720
bcba0c45
DW
721 if (a == &dev_attr_target_node.attr &&
722 nvdimm_dev_to_target_node(dev) == NUMA_NO_NODE)
723 return 0;
724
74ae66c3
TK
725 return a->mode;
726}
727
c01dafad 728/*
74ae66c3
TK
729 * nd_numa_attribute_group - NUMA attributes for all devices on an nd bus
730 */
e2f6a0e3 731const struct attribute_group nd_numa_attribute_group = {
74ae66c3
TK
732 .attrs = nd_numa_attributes,
733 .is_visible = nd_numa_attr_visible,
734};
74ae66c3 735
45def22c
DW
736int nvdimm_bus_create_ndctl(struct nvdimm_bus *nvdimm_bus)
737{
738 dev_t devt = MKDEV(nvdimm_bus_major, nvdimm_bus->id);
739 struct device *dev;
740
741 dev = device_create(nd_class, &nvdimm_bus->dev, devt, nvdimm_bus,
742 "ndctl%d", nvdimm_bus->id);
743
42588958 744 if (IS_ERR(dev))
45def22c
DW
745 dev_dbg(&nvdimm_bus->dev, "failed to register ndctl%d: %ld\n",
746 nvdimm_bus->id, PTR_ERR(dev));
42588958 747 return PTR_ERR_OR_ZERO(dev);
45def22c
DW
748}
749
750void nvdimm_bus_destroy_ndctl(struct nvdimm_bus *nvdimm_bus)
751{
752 device_destroy(nd_class, MKDEV(nvdimm_bus_major, nvdimm_bus->id));
753}
754
62232e45
DW
755static const struct nd_cmd_desc __nd_cmd_dimm_descs[] = {
756 [ND_CMD_IMPLEMENTED] = { },
757 [ND_CMD_SMART] = {
758 .out_num = 2,
21129112 759 .out_sizes = { 4, 128, },
62232e45
DW
760 },
761 [ND_CMD_SMART_THRESHOLD] = {
762 .out_num = 2,
763 .out_sizes = { 4, 8, },
764 },
765 [ND_CMD_DIMM_FLAGS] = {
766 .out_num = 2,
767 .out_sizes = { 4, 4 },
768 },
769 [ND_CMD_GET_CONFIG_SIZE] = {
770 .out_num = 3,
771 .out_sizes = { 4, 4, 4, },
772 },
773 [ND_CMD_GET_CONFIG_DATA] = {
774 .in_num = 2,
775 .in_sizes = { 4, 4, },
776 .out_num = 2,
777 .out_sizes = { 4, UINT_MAX, },
778 },
779 [ND_CMD_SET_CONFIG_DATA] = {
780 .in_num = 3,
781 .in_sizes = { 4, 4, UINT_MAX, },
782 .out_num = 1,
783 .out_sizes = { 4, },
784 },
785 [ND_CMD_VENDOR] = {
786 .in_num = 3,
787 .in_sizes = { 4, 4, UINT_MAX, },
788 .out_num = 3,
789 .out_sizes = { 4, 4, UINT_MAX, },
790 },
31eca76b
DW
791 [ND_CMD_CALL] = {
792 .in_num = 2,
793 .in_sizes = { sizeof(struct nd_cmd_pkg), UINT_MAX, },
794 .out_num = 1,
795 .out_sizes = { UINT_MAX, },
796 },
62232e45
DW
797};
798
799const struct nd_cmd_desc *nd_cmd_dimm_desc(int cmd)
800{
801 if (cmd < ARRAY_SIZE(__nd_cmd_dimm_descs))
802 return &__nd_cmd_dimm_descs[cmd];
803 return NULL;
804}
805EXPORT_SYMBOL_GPL(nd_cmd_dimm_desc);
806
807static const struct nd_cmd_desc __nd_cmd_bus_descs[] = {
808 [ND_CMD_IMPLEMENTED] = { },
809 [ND_CMD_ARS_CAP] = {
810 .in_num = 2,
811 .in_sizes = { 8, 8, },
4577b066
DW
812 .out_num = 4,
813 .out_sizes = { 4, 4, 4, 4, },
62232e45
DW
814 },
815 [ND_CMD_ARS_START] = {
4577b066
DW
816 .in_num = 5,
817 .in_sizes = { 8, 8, 2, 1, 5, },
818 .out_num = 2,
819 .out_sizes = { 4, 4, },
62232e45
DW
820 },
821 [ND_CMD_ARS_STATUS] = {
747ffe11
DW
822 .out_num = 3,
823 .out_sizes = { 4, 4, UINT_MAX, },
62232e45 824 },
d4f32367
DW
825 [ND_CMD_CLEAR_ERROR] = {
826 .in_num = 2,
827 .in_sizes = { 8, 8, },
828 .out_num = 3,
829 .out_sizes = { 4, 4, 8, },
830 },
31eca76b
DW
831 [ND_CMD_CALL] = {
832 .in_num = 2,
833 .in_sizes = { sizeof(struct nd_cmd_pkg), UINT_MAX, },
834 .out_num = 1,
835 .out_sizes = { UINT_MAX, },
836 },
62232e45
DW
837};
838
839const struct nd_cmd_desc *nd_cmd_bus_desc(int cmd)
840{
841 if (cmd < ARRAY_SIZE(__nd_cmd_bus_descs))
842 return &__nd_cmd_bus_descs[cmd];
843 return NULL;
844}
845EXPORT_SYMBOL_GPL(nd_cmd_bus_desc);
846
847u32 nd_cmd_in_size(struct nvdimm *nvdimm, int cmd,
848 const struct nd_cmd_desc *desc, int idx, void *buf)
849{
850 if (idx >= desc->in_num)
851 return UINT_MAX;
852
853 if (desc->in_sizes[idx] < UINT_MAX)
854 return desc->in_sizes[idx];
855
856 if (nvdimm && cmd == ND_CMD_SET_CONFIG_DATA && idx == 2) {
857 struct nd_cmd_set_config_hdr *hdr = buf;
858
859 return hdr->in_length;
860 } else if (nvdimm && cmd == ND_CMD_VENDOR && idx == 2) {
861 struct nd_cmd_vendor_hdr *hdr = buf;
862
863 return hdr->in_length;
31eca76b
DW
864 } else if (cmd == ND_CMD_CALL) {
865 struct nd_cmd_pkg *pkg = buf;
866
867 return pkg->nd_size_in;
62232e45
DW
868 }
869
870 return UINT_MAX;
871}
872EXPORT_SYMBOL_GPL(nd_cmd_in_size);
873
874u32 nd_cmd_out_size(struct nvdimm *nvdimm, int cmd,
875 const struct nd_cmd_desc *desc, int idx, const u32 *in_field,
efda1b5d 876 const u32 *out_field, unsigned long remainder)
62232e45
DW
877{
878 if (idx >= desc->out_num)
879 return UINT_MAX;
880
881 if (desc->out_sizes[idx] < UINT_MAX)
882 return desc->out_sizes[idx];
883
884 if (nvdimm && cmd == ND_CMD_GET_CONFIG_DATA && idx == 1)
885 return in_field[1];
886 else if (nvdimm && cmd == ND_CMD_VENDOR && idx == 2)
887 return out_field[1];
efda1b5d
DW
888 else if (!nvdimm && cmd == ND_CMD_ARS_STATUS && idx == 2) {
889 /*
890 * Per table 9-276 ARS Data in ACPI 6.1, out_field[1] is
891 * "Size of Output Buffer in bytes, including this
892 * field."
893 */
894 if (out_field[1] < 4)
895 return 0;
896 /*
897 * ACPI 6.1 is ambiguous if 'status' is included in the
898 * output size. If we encounter an output size that
899 * overshoots the remainder by 4 bytes, assume it was
900 * including 'status'.
901 */
286e8771 902 if (out_field[1] - 4 == remainder)
efda1b5d 903 return remainder;
286e8771 904 return out_field[1] - 8;
efda1b5d 905 } else if (cmd == ND_CMD_CALL) {
31eca76b
DW
906 struct nd_cmd_pkg *pkg = (struct nd_cmd_pkg *) in_field;
907
908 return pkg->nd_size_out;
909 }
910
62232e45
DW
911
912 return UINT_MAX;
913}
914EXPORT_SYMBOL_GPL(nd_cmd_out_size);
915
bf9bccc1 916void wait_nvdimm_bus_probe_idle(struct device *dev)
eaf96153 917{
bf9bccc1
DW
918 struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(dev);
919
eaf96153
DW
920 do {
921 if (nvdimm_bus->probe_active == 0)
922 break;
ca6bf264 923 nvdimm_bus_unlock(dev);
87a30e1f 924 nd_device_unlock(dev);
b70d31d0 925 wait_event(nvdimm_bus->wait,
eaf96153 926 nvdimm_bus->probe_active == 0);
87a30e1f 927 nd_device_lock(dev);
ca6bf264 928 nvdimm_bus_lock(dev);
eaf96153
DW
929 } while (true);
930}
931
006358b3 932static int nd_pmem_forget_poison_check(struct device *dev, void *data)
d4f32367 933{
006358b3
DJ
934 struct nd_cmd_clear_error *clear_err =
935 (struct nd_cmd_clear_error *)data;
936 struct nd_btt *nd_btt = is_nd_btt(dev) ? to_nd_btt(dev) : NULL;
937 struct nd_pfn *nd_pfn = is_nd_pfn(dev) ? to_nd_pfn(dev) : NULL;
938 struct nd_dax *nd_dax = is_nd_dax(dev) ? to_nd_dax(dev) : NULL;
939 struct nd_namespace_common *ndns = NULL;
940 struct nd_namespace_io *nsio;
941 resource_size_t offset = 0, end_trunc = 0, start, end, pstart, pend;
942
943 if (nd_dax || !dev->driver)
944 return 0;
945
946 start = clear_err->address;
947 end = clear_err->address + clear_err->cleared - 1;
948
949 if (nd_btt || nd_pfn || nd_dax) {
950 if (nd_btt)
951 ndns = nd_btt->ndns;
952 else if (nd_pfn)
953 ndns = nd_pfn->ndns;
954 else if (nd_dax)
955 ndns = nd_dax->nd_pfn.ndns;
956
957 if (!ndns)
958 return 0;
959 } else
960 ndns = to_ndns(dev);
961
962 nsio = to_nd_namespace_io(&ndns->dev);
963 pstart = nsio->res.start + offset;
964 pend = nsio->res.end - end_trunc;
965
966 if ((pstart >= start) && (pend <= end))
d4f32367 967 return -EBUSY;
006358b3 968
d4f32367 969 return 0;
006358b3
DJ
970
971}
972
973static int nd_ns_forget_poison_check(struct device *dev, void *data)
974{
975 return device_for_each_child(dev, data, nd_pmem_forget_poison_check);
d4f32367
DW
976}
977
eaf96153 978/* set_config requires an idle interleave set */
87bf572e 979static int nd_cmd_clear_to_send(struct nvdimm_bus *nvdimm_bus,
006358b3 980 struct nvdimm *nvdimm, unsigned int cmd, void *data)
eaf96153 981{
87bf572e
DW
982 struct nvdimm_bus_descriptor *nd_desc = nvdimm_bus->nd_desc;
983
984 /* ask the bus provider if it would like to block this request */
985 if (nd_desc->clear_to_send) {
b3ed2ce0 986 int rc = nd_desc->clear_to_send(nd_desc, nvdimm, cmd, data);
87bf572e
DW
987
988 if (rc)
989 return rc;
990 }
eaf96153 991
d4f32367
DW
992 /* require clear error to go through the pmem driver */
993 if (!nvdimm && cmd == ND_CMD_CLEAR_ERROR)
006358b3
DJ
994 return device_for_each_child(&nvdimm_bus->dev, data,
995 nd_ns_forget_poison_check);
d4f32367 996
eaf96153
DW
997 if (!nvdimm || cmd != ND_CMD_SET_CONFIG_DATA)
998 return 0;
999
87bf572e 1000 /* prevent label manipulation while the kernel owns label updates */
bf9bccc1 1001 wait_nvdimm_bus_probe_idle(&nvdimm_bus->dev);
eaf96153
DW
1002 if (atomic_read(&nvdimm->busy))
1003 return -EBUSY;
1004 return 0;
1005}
1006
62232e45
DW
1007static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,
1008 int read_only, unsigned int ioctl_cmd, unsigned long arg)
1009{
1010 struct nvdimm_bus_descriptor *nd_desc = nvdimm_bus->nd_desc;
62232e45
DW
1011 const struct nd_cmd_desc *desc = NULL;
1012 unsigned int cmd = _IOC_NR(ioctl_cmd);
62232e45 1013 struct device *dev = &nvdimm_bus->dev;
58738c49 1014 void __user *p = (void __user *) arg;
6de5d06e 1015 char *out_env = NULL, *in_env = NULL;
62232e45 1016 const char *cmd_name, *dimm_name;
58738c49
DW
1017 u32 in_len = 0, out_len = 0;
1018 unsigned int func = cmd;
e3654eca 1019 unsigned long cmd_mask;
58738c49 1020 struct nd_cmd_pkg pkg;
006358b3 1021 int rc, i, cmd_rc;
6de5d06e 1022 void *buf = NULL;
58738c49 1023 u64 buf_len = 0;
62232e45
DW
1024
1025 if (nvdimm) {
1026 desc = nd_cmd_dimm_desc(cmd);
1027 cmd_name = nvdimm_cmd_name(cmd);
e3654eca 1028 cmd_mask = nvdimm->cmd_mask;
62232e45
DW
1029 dimm_name = dev_name(&nvdimm->dev);
1030 } else {
1031 desc = nd_cmd_bus_desc(cmd);
1032 cmd_name = nvdimm_bus_cmd_name(cmd);
e3654eca 1033 cmd_mask = nd_desc->cmd_mask;
62232e45
DW
1034 dimm_name = "bus";
1035 }
1036
92fe2aa8 1037 /* Validate command family support against bus declared support */
31eca76b 1038 if (cmd == ND_CMD_CALL) {
92fe2aa8
DW
1039 unsigned long *mask;
1040
31eca76b
DW
1041 if (copy_from_user(&pkg, p, sizeof(pkg)))
1042 return -EFAULT;
92fe2aa8
DW
1043
1044 if (nvdimm) {
1045 if (pkg.nd_family > NVDIMM_FAMILY_MAX)
1046 return -EINVAL;
1047 mask = &nd_desc->dimm_family_mask;
1048 } else {
1049 if (pkg.nd_family > NVDIMM_BUS_FAMILY_MAX)
1050 return -EINVAL;
1051 mask = &nd_desc->bus_family_mask;
1052 }
1053
1054 if (!test_bit(pkg.nd_family, mask))
1055 return -EINVAL;
31eca76b
DW
1056 }
1057
f84afbdd
DC
1058 if (!desc ||
1059 (desc->out_num + desc->in_num == 0) ||
1060 cmd > ND_CMD_CALL ||
1061 !test_bit(cmd, &cmd_mask))
62232e45
DW
1062 return -ENOTTY;
1063
1064 /* fail write commands (when read-only) */
1065 if (read_only)
07accfa9
JH
1066 switch (cmd) {
1067 case ND_CMD_VENDOR:
1068 case ND_CMD_SET_CONFIG_DATA:
1069 case ND_CMD_ARS_START:
d4f32367 1070 case ND_CMD_CLEAR_ERROR:
31eca76b 1071 case ND_CMD_CALL:
ca6bf264 1072 dev_dbg(dev, "'%s' command while read-only.\n",
62232e45
DW
1073 nvdimm ? nvdimm_cmd_name(cmd)
1074 : nvdimm_bus_cmd_name(cmd));
1075 return -EPERM;
1076 default:
1077 break;
1078 }
1079
1080 /* process an input envelope */
6de5d06e
DW
1081 in_env = kzalloc(ND_CMD_MAX_ENVELOPE, GFP_KERNEL);
1082 if (!in_env)
1083 return -ENOMEM;
62232e45
DW
1084 for (i = 0; i < desc->in_num; i++) {
1085 u32 in_size, copy;
1086
1087 in_size = nd_cmd_in_size(nvdimm, cmd, desc, i, in_env);
1088 if (in_size == UINT_MAX) {
1089 dev_err(dev, "%s:%s unknown input size cmd: %s field: %d\n",
1090 __func__, dimm_name, cmd_name, i);
6de5d06e
DW
1091 rc = -ENXIO;
1092 goto out;
62232e45 1093 }
6de5d06e
DW
1094 if (in_len < ND_CMD_MAX_ENVELOPE)
1095 copy = min_t(u32, ND_CMD_MAX_ENVELOPE - in_len, in_size);
62232e45
DW
1096 else
1097 copy = 0;
6de5d06e
DW
1098 if (copy && copy_from_user(&in_env[in_len], p + in_len, copy)) {
1099 rc = -EFAULT;
1100 goto out;
1101 }
62232e45
DW
1102 in_len += in_size;
1103 }
1104
31eca76b 1105 if (cmd == ND_CMD_CALL) {
53b85a44 1106 func = pkg.nd_command;
426824d6
DW
1107 dev_dbg(dev, "%s, idx: %llu, in: %u, out: %u, len %llu\n",
1108 dimm_name, pkg.nd_command,
31eca76b 1109 in_len, out_len, buf_len);
31eca76b
DW
1110 }
1111
62232e45 1112 /* process an output envelope */
6de5d06e
DW
1113 out_env = kzalloc(ND_CMD_MAX_ENVELOPE, GFP_KERNEL);
1114 if (!out_env) {
1115 rc = -ENOMEM;
1116 goto out;
1117 }
1118
62232e45
DW
1119 for (i = 0; i < desc->out_num; i++) {
1120 u32 out_size = nd_cmd_out_size(nvdimm, cmd, desc, i,
efda1b5d 1121 (u32 *) in_env, (u32 *) out_env, 0);
62232e45
DW
1122 u32 copy;
1123
1124 if (out_size == UINT_MAX) {
426824d6
DW
1125 dev_dbg(dev, "%s unknown output size cmd: %s field: %d\n",
1126 dimm_name, cmd_name, i);
6de5d06e
DW
1127 rc = -EFAULT;
1128 goto out;
62232e45 1129 }
6de5d06e
DW
1130 if (out_len < ND_CMD_MAX_ENVELOPE)
1131 copy = min_t(u32, ND_CMD_MAX_ENVELOPE - out_len, out_size);
62232e45
DW
1132 else
1133 copy = 0;
1134 if (copy && copy_from_user(&out_env[out_len],
6de5d06e
DW
1135 p + in_len + out_len, copy)) {
1136 rc = -EFAULT;
1137 goto out;
1138 }
62232e45
DW
1139 out_len += out_size;
1140 }
1141
58738c49 1142 buf_len = (u64) out_len + (u64) in_len;
62232e45 1143 if (buf_len > ND_IOCTL_MAX_BUFLEN) {
426824d6
DW
1144 dev_dbg(dev, "%s cmd: %s buf_len: %llu > %d\n", dimm_name,
1145 cmd_name, buf_len, ND_IOCTL_MAX_BUFLEN);
6de5d06e
DW
1146 rc = -EINVAL;
1147 goto out;
62232e45
DW
1148 }
1149
1150 buf = vmalloc(buf_len);
6de5d06e
DW
1151 if (!buf) {
1152 rc = -ENOMEM;
1153 goto out;
1154 }
62232e45
DW
1155
1156 if (copy_from_user(buf, p, buf_len)) {
1157 rc = -EFAULT;
1158 goto out;
1159 }
1160
87a30e1f 1161 nd_device_lock(dev);
ca6bf264 1162 nvdimm_bus_lock(dev);
53b85a44 1163 rc = nd_cmd_clear_to_send(nvdimm_bus, nvdimm, func, buf);
eaf96153
DW
1164 if (rc)
1165 goto out_unlock;
1166
006358b3 1167 rc = nd_desc->ndctl(nd_desc, nvdimm, cmd, buf, buf_len, &cmd_rc);
62232e45 1168 if (rc < 0)
eaf96153 1169 goto out_unlock;
006358b3
DJ
1170
1171 if (!nvdimm && cmd == ND_CMD_CLEAR_ERROR && cmd_rc >= 0) {
1172 struct nd_cmd_clear_error *clear_err = buf;
006358b3 1173
23f49844
DW
1174 nvdimm_account_cleared_poison(nvdimm_bus, clear_err->address,
1175 clear_err->cleared);
006358b3 1176 }
0beb2012 1177
62232e45
DW
1178 if (copy_to_user(p, buf, buf_len))
1179 rc = -EFAULT;
0beb2012 1180
6de5d06e 1181out_unlock:
ca6bf264 1182 nvdimm_bus_unlock(dev);
87a30e1f 1183 nd_device_unlock(dev);
6de5d06e
DW
1184out:
1185 kfree(in_env);
1186 kfree(out_env);
62232e45
DW
1187 vfree(buf);
1188 return rc;
1189}
1190
b70d31d0
DW
1191enum nd_ioctl_mode {
1192 BUS_IOCTL,
1193 DIMM_IOCTL,
1194};
62232e45
DW
1195
1196static int match_dimm(struct device *dev, void *data)
1197{
1198 long id = (long) data;
1199
1200 if (is_nvdimm(dev)) {
1201 struct nvdimm *nvdimm = to_nvdimm(dev);
1202
1203 return nvdimm->id == id;
1204 }
1205
1206 return 0;
1207}
1208
b70d31d0
DW
1209static long nd_ioctl(struct file *file, unsigned int cmd, unsigned long arg,
1210 enum nd_ioctl_mode mode)
1211
62232e45 1212{
b70d31d0
DW
1213 struct nvdimm_bus *nvdimm_bus, *found = NULL;
1214 long id = (long) file->private_data;
1215 struct nvdimm *nvdimm = NULL;
1216 int rc, ro;
62232e45 1217
4dc0e7be 1218 ro = ((file->f_flags & O_ACCMODE) == O_RDONLY);
62232e45
DW
1219 mutex_lock(&nvdimm_bus_list_mutex);
1220 list_for_each_entry(nvdimm_bus, &nvdimm_bus_list, list) {
b70d31d0
DW
1221 if (mode == DIMM_IOCTL) {
1222 struct device *dev;
1223
1224 dev = device_find_child(&nvdimm_bus->dev,
1225 file->private_data, match_dimm);
1226 if (!dev)
1227 continue;
1228 nvdimm = to_nvdimm(dev);
1229 found = nvdimm_bus;
1230 } else if (nvdimm_bus->id == id) {
1231 found = nvdimm_bus;
1232 }
62232e45 1233
b70d31d0
DW
1234 if (found) {
1235 atomic_inc(&nvdimm_bus->ioctl_active);
1236 break;
1237 }
62232e45
DW
1238 }
1239 mutex_unlock(&nvdimm_bus_list_mutex);
1240
b70d31d0
DW
1241 if (!found)
1242 return -ENXIO;
1243
1244 nvdimm_bus = found;
1245 rc = __nd_ioctl(nvdimm_bus, nvdimm, ro, cmd, arg);
1246
1247 if (nvdimm)
1248 put_device(&nvdimm->dev);
1249 if (atomic_dec_and_test(&nvdimm_bus->ioctl_active))
1250 wake_up(&nvdimm_bus->wait);
1251
62232e45
DW
1252 return rc;
1253}
1254
b70d31d0
DW
1255static long bus_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
1256{
1257 return nd_ioctl(file, cmd, arg, BUS_IOCTL);
1258}
1259
1260static long dimm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
1261{
1262 return nd_ioctl(file, cmd, arg, DIMM_IOCTL);
1263}
1264
62232e45
DW
1265static int nd_open(struct inode *inode, struct file *file)
1266{
1267 long minor = iminor(inode);
1268
1269 file->private_data = (void *) minor;
1270 return 0;
45def22c
DW
1271}
1272
1273static const struct file_operations nvdimm_bus_fops = {
1274 .owner = THIS_MODULE,
62232e45 1275 .open = nd_open,
b70d31d0 1276 .unlocked_ioctl = bus_ioctl,
1832f2d8 1277 .compat_ioctl = compat_ptr_ioctl,
45def22c
DW
1278 .llseek = noop_llseek,
1279};
1280
62232e45
DW
1281static const struct file_operations nvdimm_fops = {
1282 .owner = THIS_MODULE,
1283 .open = nd_open,
b70d31d0 1284 .unlocked_ioctl = dimm_ioctl,
1832f2d8 1285 .compat_ioctl = compat_ptr_ioctl,
62232e45
DW
1286 .llseek = noop_llseek,
1287};
1288
45def22c
DW
1289int __init nvdimm_bus_init(void)
1290{
1291 int rc;
1292
e6dfb2de
DW
1293 rc = bus_register(&nvdimm_bus_type);
1294 if (rc)
1295 return rc;
1296
45def22c
DW
1297 rc = register_chrdev(0, "ndctl", &nvdimm_bus_fops);
1298 if (rc < 0)
62232e45 1299 goto err_bus_chrdev;
45def22c
DW
1300 nvdimm_bus_major = rc;
1301
62232e45
DW
1302 rc = register_chrdev(0, "dimmctl", &nvdimm_fops);
1303 if (rc < 0)
1304 goto err_dimm_chrdev;
1305 nvdimm_major = rc;
1306
45def22c 1307 nd_class = class_create(THIS_MODULE, "nd");
daa1dee4
AL
1308 if (IS_ERR(nd_class)) {
1309 rc = PTR_ERR(nd_class);
45def22c 1310 goto err_class;
daa1dee4 1311 }
45def22c 1312
18515942
DW
1313 rc = driver_register(&nd_bus_driver.drv);
1314 if (rc)
1315 goto err_nd_bus;
1316
45def22c
DW
1317 return 0;
1318
18515942
DW
1319 err_nd_bus:
1320 class_destroy(nd_class);
45def22c 1321 err_class:
62232e45
DW
1322 unregister_chrdev(nvdimm_major, "dimmctl");
1323 err_dimm_chrdev:
45def22c 1324 unregister_chrdev(nvdimm_bus_major, "ndctl");
62232e45 1325 err_bus_chrdev:
e6dfb2de 1326 bus_unregister(&nvdimm_bus_type);
45def22c
DW
1327
1328 return rc;
1329}
1330
4d88a97a 1331void nvdimm_bus_exit(void)
45def22c 1332{
18515942 1333 driver_unregister(&nd_bus_driver.drv);
45def22c
DW
1334 class_destroy(nd_class);
1335 unregister_chrdev(nvdimm_bus_major, "ndctl");
62232e45 1336 unregister_chrdev(nvdimm_major, "dimmctl");
e6dfb2de 1337 bus_unregister(&nvdimm_bus_type);
18515942 1338 ida_destroy(&nd_ida);
45def22c 1339}