| 1 | |
| 2 | |
| 3 | * Copyright (c) 2016, Intel Corporation.
|
| 4 |
|
| 5 | #include "test/nfit_test.h"
|
| 6 | #include <linux/mm.h>
|
| 7 | #include "../../../drivers/dax/dax-private.h"
|
| 8 |
|
| 9 | phys_addr_t dax_pgoff_to_phys(struct dev_dax *dev_dax, pgoff_t pgoff,
|
| 10 | unsigned long size)
|
| 11 | {
|
| 12 | int i;
|
| 13 |
|
| 14 | for (i = 0; i < dev_dax->nr_range; i++) {
|
| 15 | struct dev_dax_range *dax_range = &dev_dax->ranges[i];
|
| 16 | struct range *range = &dax_range->range;
|
| 17 | unsigned long long pgoff_end;
|
| 18 | phys_addr_t addr;
|
| 19 |
|
| 20 | pgoff_end = dax_range->pgoff + PHYS_PFN(range_len(range)) - 1;
|
| 21 | if (pgoff < dax_range->pgoff || pgoff > pgoff_end)
|
| 22 | continue;
|
| 23 | addr = PFN_PHYS(pgoff - dax_range->pgoff) + range->start;
|
| 24 | if (addr + size - 1 <= range->end) {
|
| 25 | if (get_nfit_res(addr)) {
|
| 26 | struct page *page;
|
| 27 |
|
| 28 | if (dev_dax->region->align > PAGE_SIZE)
|
| 29 | return -1;
|
| 30 |
|
| 31 | page = vmalloc_to_page((void *)addr);
|
| 32 | return PFN_PHYS(page_to_pfn(page));
|
| 33 | }
|
| 34 | return addr;
|
| 35 | }
|
| 36 | break;
|
| 37 | }
|
| 38 | return -1;
|
| 39 | }
|