xref: /openbmc/linux/drivers/nvdimm/pmem.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2f295e53bSDan Williams #ifndef __NVDIMM_PMEM_H__
3f295e53bSDan Williams #define __NVDIMM_PMEM_H__
4c953cc98SDan Williams #include <linux/page-flags.h>
5f295e53bSDan Williams #include <linux/badblocks.h>
6dc90f084SChristoph Hellwig #include <linux/memremap.h>
7f295e53bSDan Williams #include <linux/types.h>
8f295e53bSDan Williams #include <linux/pfn_t.h>
9f295e53bSDan Williams #include <linux/fs.h>
10f295e53bSDan Williams 
11*e511c4a3SJane Chu enum dax_access_mode;
12*e511c4a3SJane Chu 
13f295e53bSDan Williams /* this definition is in it's own header for tools/testing/nvdimm to consume */
14f295e53bSDan Williams struct pmem_device {
15f295e53bSDan Williams 	/* One contiguous memory region per device */
16f295e53bSDan Williams 	phys_addr_t		phys_addr;
17f295e53bSDan Williams 	/* when non-zero this device is hosting a 'pfn' instance */
18f295e53bSDan Williams 	phys_addr_t		data_offset;
19f295e53bSDan Williams 	u64			pfn_flags;
207a9eb206SDan Williams 	void			*virt_addr;
21f295e53bSDan Williams 	/* immutable base size of the namespace */
22f295e53bSDan Williams 	size_t			size;
23f295e53bSDan Williams 	/* trim size when namespace capacity has been section aligned */
24f295e53bSDan Williams 	u32			pfn_pad;
25975750a9SToshi Kani 	struct kernfs_node	*bb_state;
26f295e53bSDan Williams 	struct badblocks	bb;
27c1d6e828SDan Williams 	struct dax_device	*dax_dev;
28c1d6e828SDan Williams 	struct gendisk		*disk;
29e8d51348SChristoph Hellwig 	struct dev_pagemap	pgmap;
30f295e53bSDan Williams };
31c1d6e828SDan Williams 
32c1d6e828SDan Williams long __pmem_direct_access(struct pmem_device *pmem, pgoff_t pgoff,
33*e511c4a3SJane Chu 		long nr_pages, enum dax_access_mode mode, void **kaddr,
34*e511c4a3SJane Chu 		pfn_t *pfn);
35c953cc98SDan Williams 
36c953cc98SDan Williams #ifdef CONFIG_MEMORY_FAILURE
test_and_clear_pmem_poison(struct page * page)37c953cc98SDan Williams static inline bool test_and_clear_pmem_poison(struct page *page)
38c953cc98SDan Williams {
39c953cc98SDan Williams 	return TestClearPageHWPoison(page);
40c953cc98SDan Williams }
41c953cc98SDan Williams #else
test_and_clear_pmem_poison(struct page * page)42c953cc98SDan Williams static inline bool test_and_clear_pmem_poison(struct page *page)
43c953cc98SDan Williams {
44c953cc98SDan Williams 	return false;
45c953cc98SDan Williams }
46c953cc98SDan Williams #endif
47f295e53bSDan Williams #endif /* __NVDIMM_PMEM_H__ */
48