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