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 bool hugetlb_disabled;
42extern unsigned int HPAGE_SHIFT;
43#else
44#define HPAGE_SHIFT PAGE_SHIFT
45#endif
46#define HPAGE_SIZE ((1UL) << HPAGE_SHIFT)
47#define HPAGE_MASK (~(HPAGE_SIZE - 1))
48#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT)
49#define HUGE_MAX_HSTATE (MMU_PAGE_COUNT-1)
50#endif
51
52
53#define __HAVE_ARCH_GATE_AREA 1
54
55
56
57
58
59
60#define PAGE_MASK (~((1 << PAGE_SHIFT) - 1))
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
89
90
91
92#define KERNELBASE ASM_CONST(CONFIG_KERNEL_START)
93#define PAGE_OFFSET ASM_CONST(CONFIG_PAGE_OFFSET)
94#define LOAD_OFFSET ASM_CONST((CONFIG_KERNEL_START-CONFIG_PHYSICAL_START))
95
96#if defined(CONFIG_NONSTATIC_KERNEL)
97#ifndef __ASSEMBLY__
98
99extern phys_addr_t memstart_addr;
100extern phys_addr_t kernstart_addr;
101
102#ifdef CONFIG_RELOCATABLE_PPC32
103extern long long virt_phys_offset;
104#endif
105
106#endif
107#define PHYSICAL_START kernstart_addr
108
109#else
110#define PHYSICAL_START ASM_CONST(CONFIG_PHYSICAL_START)
111#endif
112
113
114#ifdef CONFIG_RELOCATABLE_PPC32
115#define VIRT_PHYS_OFFSET virt_phys_offset
116#else
117#define VIRT_PHYS_OFFSET (KERNELBASE - PHYSICAL_START)
118#endif
119
120
121#ifdef CONFIG_PPC64
122#define MEMORY_START 0UL
123#elif defined(CONFIG_NONSTATIC_KERNEL)
124#define MEMORY_START memstart_addr
125#else
126#define MEMORY_START (PHYSICAL_START + PAGE_OFFSET - KERNELBASE)
127#endif
128
129#ifdef CONFIG_FLATMEM
130#define ARCH_PFN_OFFSET ((unsigned long)(MEMORY_START >> PAGE_SHIFT))
131#define pfn_valid(pfn) ((pfn) >= ARCH_PFN_OFFSET && (pfn) < max_mapnr)
132#endif
133
134#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
135#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
136#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
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
208
209
210
211#ifdef CONFIG_BOOKE
212#define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) + VIRT_PHYS_OFFSET))
213#define __pa(x) ((unsigned long)(x) - VIRT_PHYS_OFFSET)
214#else
215#ifdef CONFIG_PPC64
216
217
218
219
220#define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) | PAGE_OFFSET))
221#define __pa(x) ((unsigned long)(x) & 0x0fffffffffffffffUL)
222
223#else
224#define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) + PAGE_OFFSET - MEMORY_START))
225#define __pa(x) ((unsigned long)(x) - PAGE_OFFSET + MEMORY_START)
226#endif
227#endif
228
229
230
231
232
233
234#define VM_DATA_DEFAULT_FLAGS32 \
235 (((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0) | \
236 VM_READ | VM_WRITE | \
237 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
238
239#define VM_DATA_DEFAULT_FLAGS64 (VM_READ | VM_WRITE | \
240 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
241
242#ifdef __powerpc64__
243#include <asm/page_64.h>
244#else
245#include <asm/page_32.h>
246#endif
247
248
249#define _ALIGN_UP(addr,size) (((addr)+((size)-1))&(~((size)-1)))
250#define _ALIGN_DOWN(addr,size) ((addr)&(~((size)-1)))
251
252
253#define _ALIGN(addr,size) _ALIGN_UP(addr,size)
254
255
256
257
258
259#ifdef CONFIG_PPC_BOOK3E_64
260#define is_kernel_addr(x) ((x) >= 0x8000000000000000ul)
261#else
262#define is_kernel_addr(x) ((x) >= PAGE_OFFSET)
263#endif
264
265#ifndef CONFIG_PPC_BOOK3S_64
266
267
268
269
270
271
272#ifdef CONFIG_PPC64
273#define PD_HUGE 0x8000000000000000
274#else
275#define PD_HUGE 0x80000000
276#endif
277#endif
278
279
280
281
282
283#define HUGEPD_SHIFT_MASK 0x3f
284
285#ifndef __ASSEMBLY__
286
287#undef STRICT_MM_TYPECHECKS
288
289#ifdef STRICT_MM_TYPECHECKS
290
291
292
293typedef struct { pte_basic_t pte; } pte_t;
294#define pte_val(x) ((x).pte)
295#define __pte(x) ((pte_t) { (x) })
296
297
298
299
300#if defined(CONFIG_PPC_64K_PAGES) && defined(CONFIG_PPC_STD_MMU_64)
301typedef struct { pte_t pte; unsigned long hidx; } real_pte_t;
302#else
303typedef struct { pte_t pte; } real_pte_t;
304#endif
305
306
307#ifdef CONFIG_PPC64
308typedef struct { unsigned long pmd; } pmd_t;
309#define pmd_val(x) ((x).pmd)
310#define __pmd(x) ((pmd_t) { (x) })
311
312
313#ifndef CONFIG_PPC_64K_PAGES
314typedef struct { unsigned long pud; } pud_t;
315#define pud_val(x) ((x).pud)
316#define __pud(x) ((pud_t) { (x) })
317#endif
318#endif
319
320
321typedef struct { unsigned long pgd; } pgd_t;
322#define pgd_val(x) ((x).pgd)
323#define __pgd(x) ((pgd_t) { (x) })
324
325
326typedef struct { unsigned long pgprot; } pgprot_t;
327#define pgprot_val(x) ((x).pgprot)
328#define __pgprot(x) ((pgprot_t) { (x) })
329
330#else
331
332
333
334
335
336typedef pte_basic_t pte_t;
337#define pte_val(x) (x)
338#define __pte(x) (x)
339
340#if defined(CONFIG_PPC_64K_PAGES) && defined(CONFIG_PPC_STD_MMU_64)
341typedef struct { pte_t pte; unsigned long hidx; } real_pte_t;
342#else
343typedef pte_t real_pte_t;
344#endif
345
346
347#ifdef CONFIG_PPC64
348typedef unsigned long pmd_t;
349#define pmd_val(x) (x)
350#define __pmd(x) (x)
351
352#ifndef CONFIG_PPC_64K_PAGES
353typedef unsigned long pud_t;
354#define pud_val(x) (x)
355#define __pud(x) (x)
356#endif
357#endif
358
359typedef unsigned long pgd_t;
360#define pgd_val(x) (x)
361#define pgprot_val(x) (x)
362
363typedef unsigned long pgprot_t;
364#define __pgd(x) (x)
365#define __pgprot(x) (x)
366
367#endif
368
369typedef struct { signed long pd; } hugepd_t;
370
371#ifdef CONFIG_HUGETLB_PAGE
372#ifdef CONFIG_PPC_BOOK3S_64
373static inline int hugepd_ok(hugepd_t hpd)
374{
375
376
377
378
379 return (((hpd.pd & 0x3) == 0x0) && ((hpd.pd & HUGEPD_SHIFT_MASK) != 0));
380}
381#else
382static inline int hugepd_ok(hugepd_t hpd)
383{
384 return (hpd.pd > 0);
385}
386#endif
387
388#define is_hugepd(pdep) (hugepd_ok(*((hugepd_t *)(pdep))))
389int pgd_huge(pgd_t pgd);
390#else
391#define is_hugepd(pdep) 0
392#define pgd_huge(pgd) 0
393#endif
394
395struct page;
396extern void clear_user_page(void *page, unsigned long vaddr, struct page *pg);
397extern void copy_user_page(void *to, void *from, unsigned long vaddr,
398 struct page *p);
399extern int page_is_ram(unsigned long pfn);
400extern int devmem_is_allowed(unsigned long pfn);
401
402#ifdef CONFIG_PPC_SMLPAR
403void arch_free_page(struct page *page, int order);
404#define HAVE_ARCH_FREE_PAGE
405#endif
406
407struct vm_area_struct;
408
409#ifdef CONFIG_PPC_64K_PAGES
410typedef pte_t *pgtable_t;
411#else
412typedef struct page *pgtable_t;
413#endif
414
415#include <asm-generic/memory_model.h>
416#endif
417
418#endif
419