1#ifndef _ASM_POWERPC_PAGE_H
2#define _ASM_POWERPC_PAGE_H
3
4
5
6
7
8
9
10
11
12
13#ifndef __ASSEMBLY__
14#include <linux/types.h>
15#else
16#include <asm/types.h>
17#endif
18#include <asm/asm-compat.h>
19#include <asm/kdump.h>
20
21
22
23
24
25
26
27#if defined(CONFIG_PPC_256K_PAGES)
28#define PAGE_SHIFT 18
29#elif defined(CONFIG_PPC_64K_PAGES)
30#define PAGE_SHIFT 16
31#elif defined(CONFIG_PPC_16K_PAGES)
32#define PAGE_SHIFT 14
33#else
34#define PAGE_SHIFT 12
35#endif
36
37#define PAGE_SIZE (ASM_CONST(1) << PAGE_SHIFT)
38
39#ifndef __ASSEMBLY__
40#ifdef CONFIG_HUGETLB_PAGE
41extern unsigned int HPAGE_SHIFT;
42#else
43#define HPAGE_SHIFT PAGE_SHIFT
44#endif
45#define HPAGE_SIZE ((1UL) << HPAGE_SHIFT)
46#define HPAGE_MASK (~(HPAGE_SIZE - 1))
47#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT)
48#define HUGE_MAX_HSTATE (MMU_PAGE_COUNT-1)
49#endif
50
51
52
53
54
55
56#define PAGE_MASK (~((1 << PAGE_SHIFT) - 1))
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88#define KERNELBASE ASM_CONST(CONFIG_KERNEL_START)
89#define PAGE_OFFSET ASM_CONST(CONFIG_PAGE_OFFSET)
90#define LOAD_OFFSET ASM_CONST((CONFIG_KERNEL_START-CONFIG_PHYSICAL_START))
91
92#if defined(CONFIG_NONSTATIC_KERNEL)
93#ifndef __ASSEMBLY__
94
95extern phys_addr_t memstart_addr;
96extern phys_addr_t kernstart_addr;
97
98#ifdef CONFIG_RELOCATABLE_PPC32
99extern long long virt_phys_offset;
100#endif
101
102#endif
103#define PHYSICAL_START kernstart_addr
104
105#else
106#define PHYSICAL_START ASM_CONST(CONFIG_PHYSICAL_START)
107#endif
108
109
110#ifdef CONFIG_RELOCATABLE_PPC32
111#define VIRT_PHYS_OFFSET virt_phys_offset
112#else
113#define VIRT_PHYS_OFFSET (KERNELBASE - PHYSICAL_START)
114#endif
115
116
117#ifdef CONFIG_PPC64
118#define MEMORY_START 0UL
119#elif defined(CONFIG_NONSTATIC_KERNEL)
120#define MEMORY_START memstart_addr
121#else
122#define MEMORY_START (PHYSICAL_START + PAGE_OFFSET - KERNELBASE)
123#endif
124
125#ifdef CONFIG_FLATMEM
126#define ARCH_PFN_OFFSET ((unsigned long)(MEMORY_START >> PAGE_SHIFT))
127#define pfn_valid(pfn) ((pfn) >= ARCH_PFN_OFFSET && (pfn) < max_mapnr)
128#endif
129
130#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
131#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
132#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207#ifdef CONFIG_BOOKE
208#define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) + VIRT_PHYS_OFFSET))
209#define __pa(x) ((unsigned long)(x) - VIRT_PHYS_OFFSET)
210#else
211#ifdef CONFIG_PPC64
212
213
214
215
216#define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) | PAGE_OFFSET))
217#define __pa(x) ((unsigned long)(x) & 0x0fffffffffffffffUL)
218
219#else
220#define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) + PAGE_OFFSET - MEMORY_START))
221#define __pa(x) ((unsigned long)(x) - PAGE_OFFSET + MEMORY_START)
222#endif
223#endif
224
225
226
227
228
229
230#define VM_DATA_DEFAULT_FLAGS32 (VM_READ | VM_WRITE | VM_EXEC | \
231 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
232
233#define VM_DATA_DEFAULT_FLAGS64 (VM_READ | VM_WRITE | \
234 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
235
236#ifdef __powerpc64__
237#include <asm/page_64.h>
238#else
239#include <asm/page_32.h>
240#endif
241
242
243#define _ALIGN_UP(addr,size) (((addr)+((size)-1))&(~((size)-1)))
244#define _ALIGN_DOWN(addr,size) ((addr)&(~((size)-1)))
245
246
247#define _ALIGN(addr,size) _ALIGN_UP(addr,size)
248
249
250
251
252
253#ifdef CONFIG_PPC_BOOK3E_64
254#define is_kernel_addr(x) ((x) >= 0x8000000000000000ul)
255#else
256#define is_kernel_addr(x) ((x) >= PAGE_OFFSET)
257#endif
258
259#ifndef CONFIG_PPC_BOOK3S_64
260
261
262
263
264
265
266#ifdef CONFIG_PPC64
267#define PD_HUGE 0x8000000000000000
268#else
269#define PD_HUGE 0x80000000
270#endif
271#endif
272
273
274
275
276
277#define HUGEPD_SHIFT_MASK 0x3f
278
279#ifndef __ASSEMBLY__
280
281#ifdef CONFIG_STRICT_MM_TYPECHECKS
282
283
284
285typedef struct { pte_basic_t pte; } pte_t;
286#define pte_val(x) ((x).pte)
287#define __pte(x) ((pte_t) { (x) })
288
289
290
291
292#if defined(CONFIG_PPC_64K_PAGES) && defined(CONFIG_PPC_STD_MMU_64)
293typedef struct { pte_t pte; unsigned long hidx; } real_pte_t;
294#else
295typedef struct { pte_t pte; } real_pte_t;
296#endif
297
298
299#ifdef CONFIG_PPC64
300typedef struct { unsigned long pmd; } pmd_t;
301#define pmd_val(x) ((x).pmd)
302#define __pmd(x) ((pmd_t) { (x) })
303
304
305#ifndef CONFIG_PPC_64K_PAGES
306typedef struct { unsigned long pud; } pud_t;
307#define pud_val(x) ((x).pud)
308#define __pud(x) ((pud_t) { (x) })
309#endif
310#endif
311
312
313typedef struct { unsigned long pgd; } pgd_t;
314#define pgd_val(x) ((x).pgd)
315#define __pgd(x) ((pgd_t) { (x) })
316
317
318typedef struct { unsigned long pgprot; } pgprot_t;
319#define pgprot_val(x) ((x).pgprot)
320#define __pgprot(x) ((pgprot_t) { (x) })
321
322#else
323
324
325
326
327
328typedef pte_basic_t pte_t;
329#define pte_val(x) (x)
330#define __pte(x) (x)
331
332#if defined(CONFIG_PPC_64K_PAGES) && defined(CONFIG_PPC_STD_MMU_64)
333typedef struct { pte_t pte; unsigned long hidx; } real_pte_t;
334#else
335typedef pte_t real_pte_t;
336#endif
337
338
339#ifdef CONFIG_PPC64
340typedef unsigned long pmd_t;
341#define pmd_val(x) (x)
342#define __pmd(x) (x)
343
344#ifndef CONFIG_PPC_64K_PAGES
345typedef unsigned long pud_t;
346#define pud_val(x) (x)
347#define __pud(x) (x)
348#endif
349#endif
350
351typedef unsigned long pgd_t;
352#define pgd_val(x) (x)
353#define pgprot_val(x) (x)
354
355typedef unsigned long pgprot_t;
356#define __pgd(x) (x)
357#define __pgprot(x) (x)
358
359#endif
360
361typedef struct { signed long pd; } hugepd_t;
362
363#ifdef CONFIG_HUGETLB_PAGE
364#ifdef CONFIG_PPC_BOOK3S_64
365static inline int hugepd_ok(hugepd_t hpd)
366{
367
368
369
370
371 return (((hpd.pd & 0x3) == 0x0) && ((hpd.pd & HUGEPD_SHIFT_MASK) != 0));
372}
373#else
374static inline int hugepd_ok(hugepd_t hpd)
375{
376 return (hpd.pd > 0);
377}
378#endif
379
380#define is_hugepd(hpd) (hugepd_ok(hpd))
381#define pgd_huge pgd_huge
382int pgd_huge(pgd_t pgd);
383#else
384#define is_hugepd(pdep) 0
385#define pgd_huge(pgd) 0
386#endif
387#define __hugepd(x) ((hugepd_t) { (x) })
388
389struct page;
390extern void clear_user_page(void *page, unsigned long vaddr, struct page *pg);
391extern void copy_user_page(void *to, void *from, unsigned long vaddr,
392 struct page *p);
393extern int page_is_ram(unsigned long pfn);
394extern int devmem_is_allowed(unsigned long pfn);
395
396#ifdef CONFIG_PPC_SMLPAR
397void arch_free_page(struct page *page, int order);
398#define HAVE_ARCH_FREE_PAGE
399#endif
400
401struct vm_area_struct;
402
403#if defined(CONFIG_PPC_64K_PAGES) && defined(CONFIG_PPC64)
404typedef pte_t *pgtable_t;
405#else
406typedef struct page *pgtable_t;
407#endif
408
409#include <asm-generic/memory_model.h>
410#endif
411
412#endif
413