1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef __PMEM_H__
14#define __PMEM_H__
15
16#include <linux/io.h>
17#include <linux/uio.h>
18
19#ifdef CONFIG_ARCH_HAS_PMEM_API
20#define ARCH_MEMREMAP_PMEM MEMREMAP_WB
21#include <asm/pmem.h>
22#else
23#define ARCH_MEMREMAP_PMEM MEMREMAP_WT
24
25
26
27
28
29static inline bool __arch_has_wmb_pmem(void)
30{
31 return false;
32}
33
34static inline void arch_wmb_pmem(void)
35{
36 BUG();
37}
38
39static inline void arch_memcpy_to_pmem(void __pmem *dst, const void *src,
40 size_t n)
41{
42 BUG();
43}
44
45static inline int arch_memcpy_from_pmem(void *dst, const void __pmem *src,
46 size_t n)
47{
48 BUG();
49 return -EFAULT;
50}
51
52static inline size_t arch_copy_from_iter_pmem(void __pmem *addr, size_t bytes,
53 struct iov_iter *i)
54{
55 BUG();
56 return 0;
57}
58
59static inline void arch_clear_pmem(void __pmem *addr, size_t size)
60{
61 BUG();
62}
63
64static inline void arch_wb_cache_pmem(void __pmem *addr, size_t size)
65{
66 BUG();
67}
68
69static inline void arch_invalidate_pmem(void __pmem *addr, size_t size)
70{
71 BUG();
72}
73#endif
74
75static inline bool arch_has_pmem_api(void)
76{
77 return IS_ENABLED(CONFIG_ARCH_HAS_PMEM_API);
78}
79
80static inline int default_memcpy_from_pmem(void *dst, void __pmem const *src,
81 size_t size)
82{
83 memcpy(dst, (void __force *) src, size);
84 return 0;
85}
86
87
88
89
90
91
92
93
94
95static inline int memcpy_from_pmem(void *dst, void __pmem const *src,
96 size_t size)
97{
98 if (arch_has_pmem_api())
99 return arch_memcpy_from_pmem(dst, src, size);
100 else
101 return default_memcpy_from_pmem(dst, src, size);
102}
103
104
105
106
107
108
109
110
111
112
113static inline bool arch_has_wmb_pmem(void)
114{
115 return arch_has_pmem_api() && __arch_has_wmb_pmem();
116}
117
118
119
120
121
122
123
124
125static inline void default_memcpy_to_pmem(void __pmem *dst, const void *src,
126 size_t size)
127{
128 memcpy((void __force *) dst, src, size);
129}
130
131static inline size_t default_copy_from_iter_pmem(void __pmem *addr,
132 size_t bytes, struct iov_iter *i)
133{
134 return copy_from_iter_nocache((void __force *)addr, bytes, i);
135}
136
137static inline void default_clear_pmem(void __pmem *addr, size_t size)
138{
139 if (size == PAGE_SIZE && ((unsigned long)addr & ~PAGE_MASK) == 0)
140 clear_page((void __force *)addr);
141 else
142 memset((void __force *)addr, 0, size);
143}
144
145
146
147
148
149
150
151
152
153
154
155
156
157static inline void memcpy_to_pmem(void __pmem *dst, const void *src, size_t n)
158{
159 if (arch_has_pmem_api())
160 arch_memcpy_to_pmem(dst, src, n);
161 else
162 default_memcpy_to_pmem(dst, src, n);
163}
164
165
166
167
168
169
170
171
172static inline void wmb_pmem(void)
173{
174 if (arch_has_wmb_pmem())
175 arch_wmb_pmem();
176 else
177 wmb();
178}
179
180
181
182
183
184
185
186
187
188
189static inline size_t copy_from_iter_pmem(void __pmem *addr, size_t bytes,
190 struct iov_iter *i)
191{
192 if (arch_has_pmem_api())
193 return arch_copy_from_iter_pmem(addr, bytes, i);
194 return default_copy_from_iter_pmem(addr, bytes, i);
195}
196
197
198
199
200
201
202
203
204
205static inline void clear_pmem(void __pmem *addr, size_t size)
206{
207 if (arch_has_pmem_api())
208 arch_clear_pmem(addr, size);
209 else
210 default_clear_pmem(addr, size);
211}
212
213
214
215
216
217
218
219
220
221static inline void invalidate_pmem(void __pmem *addr, size_t size)
222{
223 if (arch_has_pmem_api())
224 arch_invalidate_pmem(addr, size);
225}
226
227
228
229
230
231
232
233
234
235static inline void wb_cache_pmem(void __pmem *addr, size_t size)
236{
237 if (arch_has_pmem_api())
238 arch_wb_cache_pmem(addr, size);
239}
240#endif
241