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