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 block_device
*bdev
, sector_t sector
,
19 void **kaddr
, pfn_t
*pfn
, long size
)
21 struct pmem_device
*pmem
= bdev
->bd_queue
->queuedata
;
22 resource_size_t offset
= sector
* 512 + pmem
->data_offset
;
24 if (unlikely(is_bad_pmem(&pmem
->bb
, sector
, size
)))
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
)) {
34 *kaddr
= pmem
->virt_addr
+ offset
;
35 page
= vmalloc_to_page(pmem
->virt_addr
+ offset
);
36 *pfn
= page_to_pfn_t(page
);
37 dev_dbg_ratelimited(disk_to_dev(bdev
->bd_disk
)->parent
,
38 "%s: sector: %#llx pfn: %#lx\n", __func__
,
39 (unsigned long long) sector
, page_to_pfn(page
));
44 *kaddr
= pmem
->virt_addr
+ offset
;
45 *pfn
= phys_to_pfn_t(pmem
->phys_addr
+ offset
, pmem
->pfn_flags
);
48 * If badblocks are present, limit known good range to the
51 if (unlikely(pmem
->bb
.count
))
53 return pmem
->size
- pmem
->pfn_pad
- offset
;