0001
0002
0003
0004
0005 #include <linux/libnvdimm.h>
0006 #include <linux/suspend.h>
0007 #include <linux/export.h>
0008 #include <linux/module.h>
0009 #include <linux/blkdev.h>
0010 #include <linux/blk-integrity.h>
0011 #include <linux/device.h>
0012 #include <linux/ctype.h>
0013 #include <linux/ndctl.h>
0014 #include <linux/mutex.h>
0015 #include <linux/slab.h>
0016 #include <linux/io.h>
0017 #include "nd-core.h"
0018 #include "nd.h"
0019
0020 LIST_HEAD(nvdimm_bus_list);
0021 DEFINE_MUTEX(nvdimm_bus_list_mutex);
0022
0023 void nvdimm_bus_lock(struct device *dev)
0024 {
0025 struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(dev);
0026
0027 if (!nvdimm_bus)
0028 return;
0029 mutex_lock(&nvdimm_bus->reconfig_mutex);
0030 }
0031 EXPORT_SYMBOL(nvdimm_bus_lock);
0032
0033 void nvdimm_bus_unlock(struct device *dev)
0034 {
0035 struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(dev);
0036
0037 if (!nvdimm_bus)
0038 return;
0039 mutex_unlock(&nvdimm_bus->reconfig_mutex);
0040 }
0041 EXPORT_SYMBOL(nvdimm_bus_unlock);
0042
0043 bool is_nvdimm_bus_locked(struct device *dev)
0044 {
0045 struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(dev);
0046
0047 if (!nvdimm_bus)
0048 return false;
0049 return mutex_is_locked(&nvdimm_bus->reconfig_mutex);
0050 }
0051 EXPORT_SYMBOL(is_nvdimm_bus_locked);
0052
0053 struct nvdimm_map {
0054 struct nvdimm_bus *nvdimm_bus;
0055 struct list_head list;
0056 resource_size_t offset;
0057 unsigned long flags;
0058 size_t size;
0059 union {
0060 void *mem;
0061 void __iomem *iomem;
0062 };
0063 struct kref kref;
0064 };
0065
0066 static struct nvdimm_map *find_nvdimm_map(struct device *dev,
0067 resource_size_t offset)
0068 {
0069 struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(dev);
0070 struct nvdimm_map *nvdimm_map;
0071
0072 list_for_each_entry(nvdimm_map, &nvdimm_bus->mapping_list, list)
0073 if (nvdimm_map->offset == offset)
0074 return nvdimm_map;
0075 return NULL;
0076 }
0077
0078 static struct nvdimm_map *alloc_nvdimm_map(struct device *dev,
0079 resource_size_t offset, size_t size, unsigned long flags)
0080 {
0081 struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(dev);
0082 struct nvdimm_map *nvdimm_map;
0083
0084 nvdimm_map = kzalloc(sizeof(*nvdimm_map), GFP_KERNEL);
0085 if (!nvdimm_map)
0086 return NULL;
0087
0088 INIT_LIST_HEAD(&nvdimm_map->list);
0089 nvdimm_map->nvdimm_bus = nvdimm_bus;
0090 nvdimm_map->offset = offset;
0091 nvdimm_map->flags = flags;
0092 nvdimm_map->size = size;
0093 kref_init(&nvdimm_map->kref);
0094
0095 if (!request_mem_region(offset, size, dev_name(&nvdimm_bus->dev))) {
0096 dev_err(&nvdimm_bus->dev, "failed to request %pa + %zd for %s\n",
0097 &offset, size, dev_name(dev));
0098 goto err_request_region;
0099 }
0100
0101 if (flags)
0102 nvdimm_map->mem = memremap(offset, size, flags);
0103 else
0104 nvdimm_map->iomem = ioremap(offset, size);
0105
0106 if (!nvdimm_map->mem)
0107 goto err_map;
0108
0109 dev_WARN_ONCE(dev, !is_nvdimm_bus_locked(dev), "%s: bus unlocked!",
0110 __func__);
0111 list_add(&nvdimm_map->list, &nvdimm_bus->mapping_list);
0112
0113 return nvdimm_map;
0114
0115 err_map:
0116 release_mem_region(offset, size);
0117 err_request_region:
0118 kfree(nvdimm_map);
0119 return NULL;
0120 }
0121
0122 static void nvdimm_map_release(struct kref *kref)
0123 {
0124 struct nvdimm_bus *nvdimm_bus;
0125 struct nvdimm_map *nvdimm_map;
0126
0127 nvdimm_map = container_of(kref, struct nvdimm_map, kref);
0128 nvdimm_bus = nvdimm_map->nvdimm_bus;
0129
0130 dev_dbg(&nvdimm_bus->dev, "%pa\n", &nvdimm_map->offset);
0131 list_del(&nvdimm_map->list);
0132 if (nvdimm_map->flags)
0133 memunmap(nvdimm_map->mem);
0134 else
0135 iounmap(nvdimm_map->iomem);
0136 release_mem_region(nvdimm_map->offset, nvdimm_map->size);
0137 kfree(nvdimm_map);
0138 }
0139
0140 static void nvdimm_map_put(void *data)
0141 {
0142 struct nvdimm_map *nvdimm_map = data;
0143 struct nvdimm_bus *nvdimm_bus = nvdimm_map->nvdimm_bus;
0144
0145 nvdimm_bus_lock(&nvdimm_bus->dev);
0146 kref_put(&nvdimm_map->kref, nvdimm_map_release);
0147 nvdimm_bus_unlock(&nvdimm_bus->dev);
0148 }
0149
0150
0151
0152
0153
0154
0155
0156
0157 void *devm_nvdimm_memremap(struct device *dev, resource_size_t offset,
0158 size_t size, unsigned long flags)
0159 {
0160 struct nvdimm_map *nvdimm_map;
0161
0162 nvdimm_bus_lock(dev);
0163 nvdimm_map = find_nvdimm_map(dev, offset);
0164 if (!nvdimm_map)
0165 nvdimm_map = alloc_nvdimm_map(dev, offset, size, flags);
0166 else
0167 kref_get(&nvdimm_map->kref);
0168 nvdimm_bus_unlock(dev);
0169
0170 if (!nvdimm_map)
0171 return NULL;
0172
0173 if (devm_add_action_or_reset(dev, nvdimm_map_put, nvdimm_map))
0174 return NULL;
0175
0176 return nvdimm_map->mem;
0177 }
0178 EXPORT_SYMBOL_GPL(devm_nvdimm_memremap);
0179
0180 u64 nd_fletcher64(void *addr, size_t len, bool le)
0181 {
0182 u32 *buf = addr;
0183 u32 lo32 = 0;
0184 u64 hi32 = 0;
0185 int i;
0186
0187 for (i = 0; i < len / sizeof(u32); i++) {
0188 lo32 += le ? le32_to_cpu((__le32) buf[i]) : buf[i];
0189 hi32 += lo32;
0190 }
0191
0192 return hi32 << 32 | lo32;
0193 }
0194 EXPORT_SYMBOL_GPL(nd_fletcher64);
0195
0196 struct nvdimm_bus_descriptor *to_nd_desc(struct nvdimm_bus *nvdimm_bus)
0197 {
0198
0199 return nvdimm_bus->nd_desc;
0200 }
0201 EXPORT_SYMBOL_GPL(to_nd_desc);
0202
0203 struct device *to_nvdimm_bus_dev(struct nvdimm_bus *nvdimm_bus)
0204 {
0205
0206 return &nvdimm_bus->dev;
0207 }
0208 EXPORT_SYMBOL_GPL(to_nvdimm_bus_dev);
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220 int nd_uuid_store(struct device *dev, uuid_t **uuid_out, const char *buf,
0221 size_t len)
0222 {
0223 uuid_t uuid;
0224 int rc;
0225
0226 if (dev->driver)
0227 return -EBUSY;
0228
0229 rc = uuid_parse(buf, &uuid);
0230 if (rc)
0231 return rc;
0232
0233 kfree(*uuid_out);
0234 *uuid_out = kmemdup(&uuid, sizeof(uuid), GFP_KERNEL);
0235 if (!(*uuid_out))
0236 return -ENOMEM;
0237
0238 return 0;
0239 }
0240
0241 ssize_t nd_size_select_show(unsigned long current_size,
0242 const unsigned long *supported, char *buf)
0243 {
0244 ssize_t len = 0;
0245 int i;
0246
0247 for (i = 0; supported[i]; i++)
0248 if (current_size == supported[i])
0249 len += sprintf(buf + len, "[%ld] ", supported[i]);
0250 else
0251 len += sprintf(buf + len, "%ld ", supported[i]);
0252 len += sprintf(buf + len, "\n");
0253 return len;
0254 }
0255
0256 ssize_t nd_size_select_store(struct device *dev, const char *buf,
0257 unsigned long *current_size, const unsigned long *supported)
0258 {
0259 unsigned long lbasize;
0260 int rc, i;
0261
0262 if (dev->driver)
0263 return -EBUSY;
0264
0265 rc = kstrtoul(buf, 0, &lbasize);
0266 if (rc)
0267 return rc;
0268
0269 for (i = 0; supported[i]; i++)
0270 if (lbasize == supported[i])
0271 break;
0272
0273 if (supported[i]) {
0274 *current_size = lbasize;
0275 return 0;
0276 } else {
0277 return -EINVAL;
0278 }
0279 }
0280
0281 static ssize_t commands_show(struct device *dev,
0282 struct device_attribute *attr, char *buf)
0283 {
0284 int cmd, len = 0;
0285 struct nvdimm_bus *nvdimm_bus = to_nvdimm_bus(dev);
0286 struct nvdimm_bus_descriptor *nd_desc = nvdimm_bus->nd_desc;
0287
0288 for_each_set_bit(cmd, &nd_desc->cmd_mask, BITS_PER_LONG)
0289 len += sprintf(buf + len, "%s ", nvdimm_bus_cmd_name(cmd));
0290 len += sprintf(buf + len, "\n");
0291 return len;
0292 }
0293 static DEVICE_ATTR_RO(commands);
0294
0295 static const char *nvdimm_bus_provider(struct nvdimm_bus *nvdimm_bus)
0296 {
0297 struct nvdimm_bus_descriptor *nd_desc = nvdimm_bus->nd_desc;
0298 struct device *parent = nvdimm_bus->dev.parent;
0299
0300 if (nd_desc->provider_name)
0301 return nd_desc->provider_name;
0302 else if (parent)
0303 return dev_name(parent);
0304 else
0305 return "unknown";
0306 }
0307
0308 static ssize_t provider_show(struct device *dev,
0309 struct device_attribute *attr, char *buf)
0310 {
0311 struct nvdimm_bus *nvdimm_bus = to_nvdimm_bus(dev);
0312
0313 return sprintf(buf, "%s\n", nvdimm_bus_provider(nvdimm_bus));
0314 }
0315 static DEVICE_ATTR_RO(provider);
0316
0317 static int flush_namespaces(struct device *dev, void *data)
0318 {
0319 device_lock(dev);
0320 device_unlock(dev);
0321 return 0;
0322 }
0323
0324 static int flush_regions_dimms(struct device *dev, void *data)
0325 {
0326 device_lock(dev);
0327 device_unlock(dev);
0328 device_for_each_child(dev, NULL, flush_namespaces);
0329 return 0;
0330 }
0331
0332 static ssize_t wait_probe_show(struct device *dev,
0333 struct device_attribute *attr, char *buf)
0334 {
0335 struct nvdimm_bus *nvdimm_bus = to_nvdimm_bus(dev);
0336 struct nvdimm_bus_descriptor *nd_desc = nvdimm_bus->nd_desc;
0337 int rc;
0338
0339 if (nd_desc->flush_probe) {
0340 rc = nd_desc->flush_probe(nd_desc);
0341 if (rc)
0342 return rc;
0343 }
0344 nd_synchronize();
0345 device_for_each_child(dev, NULL, flush_regions_dimms);
0346 return sprintf(buf, "1\n");
0347 }
0348 static DEVICE_ATTR_RO(wait_probe);
0349
0350 static struct attribute *nvdimm_bus_attributes[] = {
0351 &dev_attr_commands.attr,
0352 &dev_attr_wait_probe.attr,
0353 &dev_attr_provider.attr,
0354 NULL,
0355 };
0356
0357 static const struct attribute_group nvdimm_bus_attribute_group = {
0358 .attrs = nvdimm_bus_attributes,
0359 };
0360
0361 static ssize_t capability_show(struct device *dev,
0362 struct device_attribute *attr, char *buf)
0363 {
0364 struct nvdimm_bus *nvdimm_bus = to_nvdimm_bus(dev);
0365 struct nvdimm_bus_descriptor *nd_desc = nvdimm_bus->nd_desc;
0366 enum nvdimm_fwa_capability cap;
0367
0368 if (!nd_desc->fw_ops)
0369 return -EOPNOTSUPP;
0370
0371 cap = nd_desc->fw_ops->capability(nd_desc);
0372
0373 switch (cap) {
0374 case NVDIMM_FWA_CAP_QUIESCE:
0375 return sprintf(buf, "quiesce\n");
0376 case NVDIMM_FWA_CAP_LIVE:
0377 return sprintf(buf, "live\n");
0378 default:
0379 return -EOPNOTSUPP;
0380 }
0381 }
0382
0383 static DEVICE_ATTR_RO(capability);
0384
0385 static ssize_t activate_show(struct device *dev,
0386 struct device_attribute *attr, char *buf)
0387 {
0388 struct nvdimm_bus *nvdimm_bus = to_nvdimm_bus(dev);
0389 struct nvdimm_bus_descriptor *nd_desc = nvdimm_bus->nd_desc;
0390 enum nvdimm_fwa_capability cap;
0391 enum nvdimm_fwa_state state;
0392
0393 if (!nd_desc->fw_ops)
0394 return -EOPNOTSUPP;
0395
0396 cap = nd_desc->fw_ops->capability(nd_desc);
0397 state = nd_desc->fw_ops->activate_state(nd_desc);
0398
0399 if (cap < NVDIMM_FWA_CAP_QUIESCE)
0400 return -EOPNOTSUPP;
0401
0402 switch (state) {
0403 case NVDIMM_FWA_IDLE:
0404 return sprintf(buf, "idle\n");
0405 case NVDIMM_FWA_BUSY:
0406 return sprintf(buf, "busy\n");
0407 case NVDIMM_FWA_ARMED:
0408 return sprintf(buf, "armed\n");
0409 case NVDIMM_FWA_ARM_OVERFLOW:
0410 return sprintf(buf, "overflow\n");
0411 default:
0412 return -ENXIO;
0413 }
0414 }
0415
0416 static int exec_firmware_activate(void *data)
0417 {
0418 struct nvdimm_bus_descriptor *nd_desc = data;
0419
0420 return nd_desc->fw_ops->activate(nd_desc);
0421 }
0422
0423 static ssize_t activate_store(struct device *dev,
0424 struct device_attribute *attr, const char *buf, size_t len)
0425 {
0426 struct nvdimm_bus *nvdimm_bus = to_nvdimm_bus(dev);
0427 struct nvdimm_bus_descriptor *nd_desc = nvdimm_bus->nd_desc;
0428 enum nvdimm_fwa_state state;
0429 bool quiesce;
0430 ssize_t rc;
0431
0432 if (!nd_desc->fw_ops)
0433 return -EOPNOTSUPP;
0434
0435 if (sysfs_streq(buf, "live"))
0436 quiesce = false;
0437 else if (sysfs_streq(buf, "quiesce"))
0438 quiesce = true;
0439 else
0440 return -EINVAL;
0441
0442 state = nd_desc->fw_ops->activate_state(nd_desc);
0443
0444 switch (state) {
0445 case NVDIMM_FWA_BUSY:
0446 rc = -EBUSY;
0447 break;
0448 case NVDIMM_FWA_ARMED:
0449 case NVDIMM_FWA_ARM_OVERFLOW:
0450 if (quiesce)
0451 rc = hibernate_quiet_exec(exec_firmware_activate, nd_desc);
0452 else
0453 rc = nd_desc->fw_ops->activate(nd_desc);
0454 break;
0455 case NVDIMM_FWA_IDLE:
0456 default:
0457 rc = -ENXIO;
0458 }
0459
0460 if (rc == 0)
0461 rc = len;
0462 return rc;
0463 }
0464
0465 static DEVICE_ATTR_ADMIN_RW(activate);
0466
0467 static umode_t nvdimm_bus_firmware_visible(struct kobject *kobj, struct attribute *a, int n)
0468 {
0469 struct device *dev = container_of(kobj, typeof(*dev), kobj);
0470 struct nvdimm_bus *nvdimm_bus = to_nvdimm_bus(dev);
0471 struct nvdimm_bus_descriptor *nd_desc = nvdimm_bus->nd_desc;
0472 enum nvdimm_fwa_capability cap;
0473
0474
0475
0476
0477
0478 if (!nd_desc->fw_ops)
0479 return 0;
0480
0481 cap = nd_desc->fw_ops->capability(nd_desc);
0482 if (cap < NVDIMM_FWA_CAP_QUIESCE)
0483 return 0;
0484
0485 return a->mode;
0486 }
0487 static struct attribute *nvdimm_bus_firmware_attributes[] = {
0488 &dev_attr_activate.attr,
0489 &dev_attr_capability.attr,
0490 NULL,
0491 };
0492
0493 static const struct attribute_group nvdimm_bus_firmware_attribute_group = {
0494 .name = "firmware",
0495 .attrs = nvdimm_bus_firmware_attributes,
0496 .is_visible = nvdimm_bus_firmware_visible,
0497 };
0498
0499 const struct attribute_group *nvdimm_bus_attribute_groups[] = {
0500 &nvdimm_bus_attribute_group,
0501 &nvdimm_bus_firmware_attribute_group,
0502 NULL,
0503 };
0504
0505 int nvdimm_bus_add_badrange(struct nvdimm_bus *nvdimm_bus, u64 addr, u64 length)
0506 {
0507 return badrange_add(&nvdimm_bus->badrange, addr, length);
0508 }
0509 EXPORT_SYMBOL_GPL(nvdimm_bus_add_badrange);
0510
0511 #ifdef CONFIG_BLK_DEV_INTEGRITY
0512 int nd_integrity_init(struct gendisk *disk, unsigned long meta_size)
0513 {
0514 struct blk_integrity bi;
0515
0516 if (meta_size == 0)
0517 return 0;
0518
0519 memset(&bi, 0, sizeof(bi));
0520
0521 bi.tuple_size = meta_size;
0522 bi.tag_size = meta_size;
0523
0524 blk_integrity_register(disk, &bi);
0525 blk_queue_max_integrity_segments(disk->queue, 1);
0526
0527 return 0;
0528 }
0529 EXPORT_SYMBOL(nd_integrity_init);
0530
0531 #else
0532 int nd_integrity_init(struct gendisk *disk, unsigned long meta_size)
0533 {
0534 return 0;
0535 }
0536 EXPORT_SYMBOL(nd_integrity_init);
0537
0538 #endif
0539
0540 static __init int libnvdimm_init(void)
0541 {
0542 int rc;
0543
0544 rc = nvdimm_bus_init();
0545 if (rc)
0546 return rc;
0547 rc = nvdimm_init();
0548 if (rc)
0549 goto err_dimm;
0550 rc = nd_region_init();
0551 if (rc)
0552 goto err_region;
0553
0554 nd_label_init();
0555
0556 return 0;
0557 err_region:
0558 nvdimm_exit();
0559 err_dimm:
0560 nvdimm_bus_exit();
0561 return rc;
0562 }
0563
0564 static __exit void libnvdimm_exit(void)
0565 {
0566 WARN_ON(!list_empty(&nvdimm_bus_list));
0567 nd_region_exit();
0568 nvdimm_exit();
0569 nvdimm_bus_exit();
0570 nvdimm_devs_exit();
0571 }
0572
0573 MODULE_LICENSE("GPL v2");
0574 MODULE_AUTHOR("Intel Corporation");
0575 subsys_initcall(libnvdimm_init);
0576 module_exit(libnvdimm_exit);