1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2014-2016, Intel Corporation.
5 #include "test/nfit_test.h"
6 #include <linux/blkdev.h>
10 long __pmem_direct_access(struct pmem_device
*pmem
, pgoff_t pgoff
,
11 long nr_pages
, void **kaddr
, pfn_t
*pfn
)
13 resource_size_t offset
= PFN_PHYS(pgoff
) + pmem
->data_offset
;
15 if (unlikely(is_bad_pmem(&pmem
->bb
, PFN_PHYS(pgoff
) / 512,
20 * Limit dax to a single page at a time given vmalloc()-backed
21 * in the nfit_test case.
23 if (get_nfit_res(pmem
->phys_addr
+ offset
)) {
27 *kaddr
= pmem
->virt_addr
+ offset
;
28 page
= vmalloc_to_page(pmem
->virt_addr
+ offset
);
30 *pfn
= page_to_pfn_t(page
);
31 pr_debug_ratelimited("%s: pmem: %p pgoff: %#lx pfn: %#lx\n",
32 __func__
, pmem
, pgoff
, page_to_pfn(page
));
38 *kaddr
= pmem
->virt_addr
+ offset
;
40 *pfn
= phys_to_pfn_t(pmem
->phys_addr
+ offset
, pmem
->pfn_flags
);
43 * If badblocks are present, limit known good range to the
46 if (unlikely(pmem
->bb
.count
))
48 return PHYS_PFN(pmem
->size
- pmem
->pfn_pad
- offset
);