1
2#ifndef _ASM_POWERPC_PGTABLE_H
3#define _ASM_POWERPC_PGTABLE_H
4
5#ifndef __ASSEMBLY__
6#include <linux/mmdebug.h>
7#include <linux/mmzone.h>
8#include <asm/processor.h>
9#include <asm/mmu.h>
10#include <asm/page.h>
11#include <asm/tlbflush.h>
12
13struct mm_struct;
14
15#endif
16
17#ifdef CONFIG_PPC_BOOK3S
18#include <asm/book3s/pgtable.h>
19#else
20#include <asm/nohash/pgtable.h>
21#endif
22
23
24#define __P000 PAGE_NONE
25#define __P001 PAGE_READONLY
26#define __P010 PAGE_COPY
27#define __P011 PAGE_COPY
28#define __P100 PAGE_READONLY_X
29#define __P101 PAGE_READONLY_X
30#define __P110 PAGE_COPY_X
31#define __P111 PAGE_COPY_X
32
33#define __S000 PAGE_NONE
34#define __S001 PAGE_READONLY
35#define __S010 PAGE_SHARED
36#define __S011 PAGE_SHARED
37#define __S100 PAGE_READONLY_X
38#define __S101 PAGE_READONLY_X
39#define __S110 PAGE_SHARED_X
40#define __S111 PAGE_SHARED_X
41
42#ifndef __ASSEMBLY__
43
44#ifdef CONFIG_PPC32
45static inline pmd_t *pmd_ptr(struct mm_struct *mm, unsigned long va)
46{
47 return pmd_offset(pud_offset(pgd_offset(mm, va), va), va);
48}
49
50static inline pmd_t *pmd_ptr_k(unsigned long va)
51{
52 return pmd_offset(pud_offset(pgd_offset_k(va), va), va);
53}
54
55static inline pte_t *virt_to_kpte(unsigned long vaddr)
56{
57 pmd_t *pmd = pmd_ptr_k(vaddr);
58
59 return pmd_none(*pmd) ? NULL : pte_offset_kernel(pmd, vaddr);
60}
61#endif
62
63#include <asm/tlbflush.h>
64
65
66#define pte_page(x) pfn_to_page(pte_pfn(x))
67#define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot))
68
69
70
71static inline pgprot_t pte_pgprot(pte_t pte)
72{
73 unsigned long pte_flags;
74
75 pte_flags = pte_val(pte) & ~PTE_RPN_MASK;
76 return __pgprot(pte_flags);
77}
78
79
80
81
82
83extern unsigned long empty_zero_page[];
84#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
85
86extern pgd_t swapper_pg_dir[];
87
88extern void paging_init(void);
89
90extern unsigned long ioremap_bot;
91
92
93
94
95
96
97#define kern_addr_valid(addr) (1)
98
99#include <asm-generic/pgtable.h>
100
101#ifndef CONFIG_TRANSPARENT_HUGEPAGE
102#define pmd_large(pmd) 0
103#endif
104
105
106unsigned long vmalloc_to_phys(void *vmalloc_addr);
107
108void pgtable_cache_add(unsigned int shift);
109
110#if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_PPC32)
111void mark_initmem_nx(void);
112#else
113static inline void mark_initmem_nx(void) { }
114#endif
115
116
117
118
119
120#ifdef PTE_FRAG_NR
121static inline void *pte_frag_get(mm_context_t *ctx)
122{
123 return ctx->pte_frag;
124}
125
126static inline void pte_frag_set(mm_context_t *ctx, void *p)
127{
128 ctx->pte_frag = p;
129}
130#else
131#define PTE_FRAG_NR 1
132#define PTE_FRAG_SIZE_SHIFT PAGE_SHIFT
133#define PTE_FRAG_SIZE (1UL << PTE_FRAG_SIZE_SHIFT)
134
135static inline void *pte_frag_get(mm_context_t *ctx)
136{
137 return NULL;
138}
139
140static inline void pte_frag_set(mm_context_t *ctx, void *p)
141{
142}
143#endif
144
145#ifndef pmd_is_leaf
146#define pmd_is_leaf pmd_is_leaf
147static inline bool pmd_is_leaf(pmd_t pmd)
148{
149 return false;
150}
151#endif
152
153#ifndef pud_is_leaf
154#define pud_is_leaf pud_is_leaf
155static inline bool pud_is_leaf(pud_t pud)
156{
157 return false;
158}
159#endif
160
161#ifndef pgd_is_leaf
162#define pgd_is_leaf pgd_is_leaf
163static inline bool pgd_is_leaf(pgd_t pgd)
164{
165 return false;
166}
167#endif
168
169#ifdef CONFIG_PPC64
170#define is_ioremap_addr is_ioremap_addr
171static inline bool is_ioremap_addr(const void *x)
172{
173 unsigned long addr = (unsigned long)x;
174
175 return addr >= IOREMAP_BASE && addr < IOREMAP_END;
176}
177#endif
178
179#endif
180
181#endif
182