|
@@ -25,6 +25,7 @@
|
|
|
#include <linux/moduleparam.h>
|
|
|
#include <linux/badblocks.h>
|
|
|
#include <linux/vmalloc.h>
|
|
|
+#include <linux/pfn_t.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/pmem.h>
|
|
|
#include <linux/nd.h>
|
|
@@ -40,6 +41,7 @@ struct pmem_device {
|
|
|
phys_addr_t phys_addr;
|
|
|
/* when non-zero this device is hosting a 'pfn' instance */
|
|
|
phys_addr_t data_offset;
|
|
|
+ unsigned long pfn_flags;
|
|
|
void __pmem *virt_addr;
|
|
|
size_t size;
|
|
|
struct badblocks bb;
|
|
@@ -135,13 +137,13 @@ static int pmem_rw_page(struct block_device *bdev, sector_t sector,
|
|
|
}
|
|
|
|
|
|
static long pmem_direct_access(struct block_device *bdev, sector_t sector,
|
|
|
- void __pmem **kaddr, unsigned long *pfn)
|
|
|
+ void __pmem **kaddr, pfn_t *pfn)
|
|
|
{
|
|
|
struct pmem_device *pmem = bdev->bd_disk->private_data;
|
|
|
resource_size_t offset = sector * 512 + pmem->data_offset;
|
|
|
|
|
|
*kaddr = pmem->virt_addr + offset;
|
|
|
- *pfn = (pmem->phys_addr + offset) >> PAGE_SHIFT;
|
|
|
+ *pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags);
|
|
|
|
|
|
return pmem->size - offset;
|
|
|
}
|
|
@@ -174,9 +176,11 @@ static struct pmem_device *pmem_alloc(struct device *dev,
|
|
|
return ERR_PTR(-EBUSY);
|
|
|
}
|
|
|
|
|
|
- if (pmem_should_map_pages(dev))
|
|
|
+ pmem->pfn_flags = PFN_DEV;
|
|
|
+ if (pmem_should_map_pages(dev)) {
|
|
|
pmem->virt_addr = (void __pmem *) devm_memremap_pages(dev, res);
|
|
|
- else
|
|
|
+ pmem->pfn_flags |= PFN_MAP;
|
|
|
+ } else
|
|
|
pmem->virt_addr = (void __pmem *) devm_memremap(dev,
|
|
|
pmem->phys_addr, pmem->size,
|
|
|
ARCH_MEMREMAP_PMEM);
|
|
@@ -384,6 +388,7 @@ static int nvdimm_namespace_attach_pfn(struct nd_namespace_common *ndns)
|
|
|
pmem = dev_get_drvdata(dev);
|
|
|
devm_memunmap(dev, (void __force *) pmem->virt_addr);
|
|
|
pmem->virt_addr = (void __pmem *) devm_memremap_pages(dev, &nsio->res);
|
|
|
+ pmem->pfn_flags |= PFN_MAP;
|
|
|
if (IS_ERR(pmem->virt_addr)) {
|
|
|
rc = PTR_ERR(pmem->virt_addr);
|
|
|
goto err;
|