1 | // SPDX-License-Identifier: GPL-2.0-only |
---|---|
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(resource: addr)) { |
26 | struct page *page; |
27 | |
28 | if (dev_dax->region->align > PAGE_SIZE) |
29 | return -1; |
30 | |
31 | page = vmalloc_to_page(addr: (void *)addr); |
32 | return PFN_PHYS(page_to_pfn(page)); |
33 | } |
34 | return addr; |
35 | } |
36 | break; |
37 | } |
38 | return -1; |
39 | } |
40 |