From: John Groves <j...@groves.net>

These are functions that should be called from outside, but I had
linkage issues and did this hack instead. Will fix in the "real"
patches...
---
 drivers/dax/bus.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/drivers/dax/bus.c b/drivers/dax/bus.c
index 1659b787b65f..1b55fd7aabaf 100644
--- a/drivers/dax/bus.c
+++ b/drivers/dax/bus.c
@@ -1324,6 +1324,56 @@ static const struct device_type dev_dax_type = {
        .groups = dax_attribute_groups,
 };
 
+#if IS_ENABLED(CONFIG_DEV_DAX_IOMAP)
+
+/*
+ * This is write_pmem() from pmem.c
+ */
+static void write_dax(void *pmem_addr, struct page *page,
+               unsigned int off, unsigned int len)
+{
+       unsigned int chunk;
+       void *mem;
+
+       while (len) {
+               mem = kmap_atomic(page);
+               chunk = min_t(unsigned int, len, PAGE_SIZE - off);
+               memcpy_flushcache(pmem_addr, mem + off, chunk);
+               kunmap_atomic(mem);
+               len -= chunk;
+               off = 0;
+               page++;
+               pmem_addr += chunk;
+       }
+}
+
+/*
+ * This function is from drivers/dax/device.c
+ * For some reason EXPORT_SYMBOL(dax_pgoff_to_phys) didn't result in linkable 
code
+ */
+phys_addr_t dax_pgoff_to_phys(struct dev_dax *dev_dax, pgoff_t pgoff,
+                             unsigned long size)
+{
+       int i;
+
+       for (i = 0; i < dev_dax->nr_range; i++) {
+               struct dev_dax_range *dax_range = &dev_dax->ranges[i];
+               struct range *range = &dax_range->range;
+               unsigned long long pgoff_end;
+               phys_addr_t phys;
+
+               pgoff_end = dax_range->pgoff + PHYS_PFN(range_len(range)) - 1;
+               if (pgoff < dax_range->pgoff || pgoff > pgoff_end)
+                       continue;
+               phys = PFN_PHYS(pgoff - dax_range->pgoff) + range->start;
+               if (phys + size - 1 <= range->end)
+                       return phys;
+               break;
+       }
+       return -1;
+}
+
+
 struct dev_dax *devm_create_dev_dax(struct dev_dax_data *data)
 {
        struct dax_region *dax_region = data->dax_region;
-- 
2.40.1



Reply via email to