2 * Copyright (c) 2014-2016, Intel Corporation.
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation.
8 * This program is distributed in the hope it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 #include "test/nfit_test.h"
14 #include <linux/blkdev.h>
18 long __pmem_direct_access(struct pmem_device
*pmem
, pgoff_t pgoff
,
19 long nr_pages
, void **kaddr
, pfn_t
*pfn
)
21 resource_size_t offset
= PFN_PHYS(pgoff
) + pmem
->data_offset
;
23 if (unlikely(is_bad_pmem(&pmem
->bb
, PFN_PHYS(pgoff
) / 512,
28 * Limit dax to a single page at a time given vmalloc()-backed
29 * in the nfit_test case.
31 if (get_nfit_res(pmem
->phys_addr
+ offset
)) {
35 *kaddr
= pmem
->virt_addr
+ offset
;
36 page
= vmalloc_to_page(pmem
->virt_addr
+ offset
);
38 *pfn
= page_to_pfn_t(page
);
39 pr_debug_ratelimited("%s: pmem: %p pgoff: %#lx pfn: %#lx\n",
40 __func__
, pmem
, pgoff
, page_to_pfn(page
));
46 *kaddr
= pmem
->virt_addr
+ offset
;
48 *pfn
= phys_to_pfn_t(pmem
->phys_addr
+ offset
, pmem
->pfn_flags
);
51 * If badblocks are present, limit known good range to the
54 if (unlikely(pmem
->bb
.count
))
56 return PHYS_PFN(pmem
->size
- pmem
->pfn_pad
- offset
);