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>
11 long __pmem_direct_access(struct pmem_device
*pmem
, pgoff_t pgoff
,
12 long nr_pages
, enum dax_access_mode mode
, void **kaddr
,
15 resource_size_t offset
= PFN_PHYS(pgoff
) + pmem
->data_offset
;
17 if (unlikely(is_bad_pmem(&pmem
->bb
, PFN_PHYS(pgoff
) / 512,
22 * Limit dax to a single page at a time given vmalloc()-backed
23 * in the nfit_test case.
25 if (get_nfit_res(pmem
->phys_addr
+ offset
)) {
29 *kaddr
= pmem
->virt_addr
+ offset
;
30 page
= vmalloc_to_page(pmem
->virt_addr
+ offset
);
32 *pfn
= page_to_pfn_t(page
);
33 pr_debug_ratelimited("%s: pmem: %p pgoff: %#lx pfn: %#lx\n",
34 __func__
, pmem
, pgoff
, page_to_pfn(page
));
40 *kaddr
= pmem
->virt_addr
+ offset
;
42 *pfn
= phys_to_pfn_t(pmem
->phys_addr
+ offset
, pmem
->pfn_flags
);
45 * If badblocks are present, limit known good range to the
48 if (unlikely(pmem
->bb
.count
))
50 return PHYS_PFN(pmem
->size
- pmem
->pfn_pad
- offset
);