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