claim.c (e82a82c19f4272ea5437cc76e5711b98e2ee6223) claim.c (f0c98ebc57c2d5e535bc4f9167f35650d2ba3c90)
1/*
2 * Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of version 2 of the GNU General Public License as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful, but

--- 226 unchanged lines hidden (view full) ---

235 if (rw == READ) {
236 unsigned int sz_align = ALIGN(size + (offset & (512 - 1)), 512);
237
238 if (unlikely(is_bad_pmem(&nsio->bb, offset / 512, sz_align)))
239 return -EIO;
240 return memcpy_from_pmem(buf, nsio->addr + offset, size);
241 } else {
242 memcpy_to_pmem(nsio->addr + offset, buf, size);
1/*
2 * Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of version 2 of the GNU General Public License as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful, but

--- 226 unchanged lines hidden (view full) ---

235 if (rw == READ) {
236 unsigned int sz_align = ALIGN(size + (offset & (512 - 1)), 512);
237
238 if (unlikely(is_bad_pmem(&nsio->bb, offset / 512, sz_align)))
239 return -EIO;
240 return memcpy_from_pmem(buf, nsio->addr + offset, size);
241 } else {
242 memcpy_to_pmem(nsio->addr + offset, buf, size);
243 wmb_pmem();
243 nvdimm_flush(to_nd_region(ndns->dev.parent));
244 }
245
246 return 0;
247}
248
249int devm_nsio_enable(struct device *dev, struct nd_namespace_io *nsio)
250{
251 struct resource *res = &nsio->res;

--- 9 unchanged lines hidden (view full) ---

261 ndns->rw_bytes = nsio_rw_bytes;
262 if (devm_init_badblocks(dev, &nsio->bb))
263 return -ENOMEM;
264 nvdimm_badblocks_populate(to_nd_region(ndns->dev.parent), &nsio->bb,
265 &nsio->res);
266
267 nsio->addr = devm_memremap(dev, res->start, resource_size(res),
268 ARCH_MEMREMAP_PMEM);
244 }
245
246 return 0;
247}
248
249int devm_nsio_enable(struct device *dev, struct nd_namespace_io *nsio)
250{
251 struct resource *res = &nsio->res;

--- 9 unchanged lines hidden (view full) ---

261 ndns->rw_bytes = nsio_rw_bytes;
262 if (devm_init_badblocks(dev, &nsio->bb))
263 return -ENOMEM;
264 nvdimm_badblocks_populate(to_nd_region(ndns->dev.parent), &nsio->bb,
265 &nsio->res);
266
267 nsio->addr = devm_memremap(dev, res->start, resource_size(res),
268 ARCH_MEMREMAP_PMEM);
269 if (IS_ERR(nsio->addr))
270 return PTR_ERR(nsio->addr);
271 return 0;
269
270 return PTR_ERR_OR_ZERO(nsio->addr);
272}
273EXPORT_SYMBOL_GPL(devm_nsio_enable);
274
275void devm_nsio_disable(struct device *dev, struct nd_namespace_io *nsio)
276{
277 struct resource *res = &nsio->res;
278
279 devm_memunmap(dev, nsio->addr);
280 devm_exit_badblocks(dev, &nsio->bb);
281 devm_release_mem_region(dev, res->start, resource_size(res));
282}
283EXPORT_SYMBOL_GPL(devm_nsio_disable);
271}
272EXPORT_SYMBOL_GPL(devm_nsio_enable);
273
274void devm_nsio_disable(struct device *dev, struct nd_namespace_io *nsio)
275{
276 struct resource *res = &nsio->res;
277
278 devm_memunmap(dev, nsio->addr);
279 devm_exit_badblocks(dev, &nsio->bb);
280 devm_release_mem_region(dev, res->start, resource_size(res));
281}
282EXPORT_SYMBOL_GPL(devm_nsio_disable);