1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef _ASM_TILE_PAGE_H
16#define _ASM_TILE_PAGE_H
17
18#include <linux/const.h>
19
20
21#define PAGE_SHIFT 16
22#define HPAGE_SHIFT 24
23
24#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT)
25#define HPAGE_SIZE (_AC(1, UL) << HPAGE_SHIFT)
26
27#define PAGE_MASK (~(PAGE_SIZE - 1))
28#define HPAGE_MASK (~(HPAGE_SIZE - 1))
29
30#ifdef __KERNEL__
31
32#include <hv/hypervisor.h>
33#include <arch/chip.h>
34
35
36
37
38
39
40
41
42
43
44#if HV_LOG2_PAGE_SIZE_SMALL != PAGE_SHIFT
45# error Small page size mismatch in Linux
46#endif
47#if HV_LOG2_PAGE_SIZE_LARGE != HPAGE_SHIFT
48# error Huge page size mismatch in Linux
49#endif
50
51#ifndef __ASSEMBLY__
52
53#include <linux/types.h>
54#include <linux/string.h>
55
56struct page;
57
58static inline void clear_page(void *page)
59{
60 memset(page, 0, PAGE_SIZE);
61}
62
63static inline void copy_page(void *to, void *from)
64{
65 memcpy(to, from, PAGE_SIZE);
66}
67
68static inline void clear_user_page(void *page, unsigned long vaddr,
69 struct page *pg)
70{
71 clear_page(page);
72}
73
74static inline void copy_user_page(void *to, void *from, unsigned long vaddr,
75 struct page *topage)
76{
77 copy_page(to, from);
78}
79
80
81
82
83
84typedef __u64 pteval_t;
85typedef __u64 pmdval_t;
86typedef __u64 pudval_t;
87typedef __u64 pgdval_t;
88typedef __u64 pgprotval_t;
89
90typedef HV_PTE pte_t;
91typedef HV_PTE pgd_t;
92typedef HV_PTE pgprot_t;
93
94
95
96
97
98
99
100
101typedef struct page *pgtable_t;
102
103
104#define __pgprot(val) hv_pte(val)
105
106static inline u64 pgprot_val(pgprot_t pgprot)
107{
108 return hv_pte_val(pgprot);
109}
110
111static inline u64 pte_val(pte_t pte)
112{
113 return hv_pte_val(pte);
114}
115
116static inline u64 pgd_val(pgd_t pgd)
117{
118 return hv_pte_val(pgd);
119}
120
121#ifdef __tilegx__
122
123typedef HV_PTE pmd_t;
124
125static inline u64 pmd_val(pmd_t pmd)
126{
127 return hv_pte_val(pmd);
128}
129
130#endif
131
132static inline __attribute_const__ int get_order(unsigned long size)
133{
134 return BITS_PER_LONG - __builtin_clzl((size - 1) >> PAGE_SHIFT);
135}
136
137#endif
138
139#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT)
140
141#define HUGE_MAX_HSTATE 2
142
143#ifdef CONFIG_HUGETLB_PAGE
144#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
145#endif
146
147
148#define NR_PA_HIGHBIT_SHIFT (CHIP_PA_WIDTH() - CHIP_LOG_NUM_MSHIMS())
149#define NR_PA_HIGHBIT_VALUES (1 << CHIP_LOG_NUM_MSHIMS())
150#define __pa_to_highbits(pa) ((phys_addr_t)(pa) >> NR_PA_HIGHBIT_SHIFT)
151#define __pfn_to_highbits(pfn) ((pfn) >> (NR_PA_HIGHBIT_SHIFT - PAGE_SHIFT))
152
153#ifdef __tilegx__
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171#if CHIP_PA_WIDTH() + 2 > CHIP_VA_WIDTH()
172# error Too much PA to map with the VA available!
173#endif
174#define HALF_VA_SPACE (_AC(1, UL) << (CHIP_VA_WIDTH() - 1))
175
176#define MEM_LOW_END (HALF_VA_SPACE - 1)
177#define MEM_HIGH_START (-HALF_VA_SPACE)
178#define PAGE_OFFSET MEM_HIGH_START
179#define _VMALLOC_START _AC(0xfffffff500000000, UL)
180#define HUGE_VMAP_BASE _AC(0xfffffff600000000, UL)
181#define MEM_SV_START _AC(0xfffffff700000000, UL)
182#define MEM_SV_INTRPT MEM_SV_START
183#define MEM_MODULE_START _AC(0xfffffff710000000, UL)
184#define MEM_MODULE_END (MEM_MODULE_START + (256*1024*1024))
185#define MEM_HV_START _AC(0xfffffff800000000, UL)
186
187
188#define KERNEL_HIGH_VADDR MEM_SV_START
189
190
191#define FIXADDR_TOP MEM_HV_START
192
193#else
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223#define MEM_USER_INTRPT _AC(0xfc000000, UL)
224#if CONFIG_KERNEL_PL == 1
225#define MEM_SV_INTRPT _AC(0xfd000000, UL)
226#define MEM_HV_INTRPT _AC(0xfe000000, UL)
227#else
228#define MEM_GUEST_INTRPT _AC(0xfd000000, UL)
229#define MEM_SV_INTRPT _AC(0xfe000000, UL)
230#define MEM_HV_INTRPT _AC(0xff000000, UL)
231#endif
232
233#define INTRPT_SIZE 0x4000
234
235
236#if PAGE_SIZE > INTRPT_SIZE
237#undef INTRPT_SIZE
238#define INTRPT_SIZE PAGE_SIZE
239#endif
240
241#define KERNEL_HIGH_VADDR MEM_USER_INTRPT
242#define FIXADDR_TOP (KERNEL_HIGH_VADDR - PAGE_SIZE)
243
244#define PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL)
245
246
247#define MEM_MODULE_START VMALLOC_START
248#define MEM_MODULE_END VMALLOC_END
249
250#endif
251
252#ifndef __ASSEMBLY__
253
254#ifdef CONFIG_HIGHMEM
255
256
257extern unsigned long pbase_map[];
258extern void *vbase_map[];
259
260static inline unsigned long kaddr_to_pfn(const volatile void *_kaddr)
261{
262 unsigned long kaddr = (unsigned long)_kaddr;
263 return pbase_map[kaddr >> HPAGE_SHIFT] +
264 ((kaddr & (HPAGE_SIZE - 1)) >> PAGE_SHIFT);
265}
266
267static inline void *pfn_to_kaddr(unsigned long pfn)
268{
269 return vbase_map[__pfn_to_highbits(pfn)] + (pfn << PAGE_SHIFT);
270}
271
272static inline phys_addr_t virt_to_phys(const volatile void *kaddr)
273{
274 unsigned long pfn = kaddr_to_pfn(kaddr);
275 return ((phys_addr_t)pfn << PAGE_SHIFT) +
276 ((unsigned long)kaddr & (PAGE_SIZE-1));
277}
278
279static inline void *phys_to_virt(phys_addr_t paddr)
280{
281 return pfn_to_kaddr(paddr >> PAGE_SHIFT) + (paddr & (PAGE_SIZE-1));
282}
283
284
285static inline int virt_addr_valid(const volatile void *kaddr)
286{
287 extern void *high_memory;
288 return ((unsigned long)kaddr >= PAGE_OFFSET && kaddr < high_memory);
289}
290
291#else
292
293static inline unsigned long kaddr_to_pfn(const volatile void *kaddr)
294{
295 return ((unsigned long)kaddr - PAGE_OFFSET) >> PAGE_SHIFT;
296}
297
298static inline void *pfn_to_kaddr(unsigned long pfn)
299{
300 return (void *)((pfn << PAGE_SHIFT) + PAGE_OFFSET);
301}
302
303static inline phys_addr_t virt_to_phys(const volatile void *kaddr)
304{
305 return (phys_addr_t)((unsigned long)kaddr - PAGE_OFFSET);
306}
307
308static inline void *phys_to_virt(phys_addr_t paddr)
309{
310 return (void *)((unsigned long)paddr + PAGE_OFFSET);
311}
312
313
314#define virt_addr_valid(kaddr) pfn_valid(kaddr_to_pfn(kaddr))
315
316#endif
317
318
319#define __pa(kaddr) virt_to_phys((void *)(unsigned long)(kaddr))
320#define __va(paddr) phys_to_virt((phys_addr_t)(paddr))
321
322extern int devmem_is_allowed(unsigned long pagenr);
323
324#ifdef CONFIG_FLATMEM
325static inline int pfn_valid(unsigned long pfn)
326{
327 return pfn < max_mapnr;
328}
329#endif
330
331
332#define page_to_pa(page) ((phys_addr_t)(page_to_pfn(page)) << PAGE_SHIFT)
333#define virt_to_page(kaddr) pfn_to_page(kaddr_to_pfn(kaddr))
334#define page_to_virt(page) pfn_to_kaddr(page_to_pfn(page))
335
336struct mm_struct;
337extern pte_t *virt_to_pte(struct mm_struct *mm, unsigned long addr);
338
339#endif
340
341#define VM_DATA_DEFAULT_FLAGS \
342 (VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
343
344#include <asm-generic/memory_model.h>
345
346#endif
347
348#endif
349