1#ifndef _ASM_POWERPC_MMU_HASH64_H_
2#define _ASM_POWERPC_MMU_HASH64_H_
3
4
5
6
7
8
9
10
11
12
13
14
15#include <asm/asm-compat.h>
16#include <asm/page.h>
17
18
19
20
21
22#define STE_ESID_V 0x80
23#define STE_ESID_KS 0x20
24#define STE_ESID_KP 0x10
25#define STE_ESID_N 0x08
26
27#define STE_VSID_SHIFT 12
28
29
30#define STAB0_PAGE 0x6
31#define STAB0_OFFSET (STAB0_PAGE << 12)
32#define STAB0_PHYS_ADDR (STAB0_OFFSET + PHYSICAL_START)
33
34#ifndef __ASSEMBLY__
35extern char initial_stab[];
36#endif
37
38
39
40
41
42#define SLB_NUM_BOLTED 3
43#define SLB_CACHE_ENTRIES 8
44
45
46#define SLB_ESID_V ASM_CONST(0x0000000008000000)
47
48
49#define SLB_VSID_SHIFT 12
50#define SLB_VSID_B ASM_CONST(0xc000000000000000)
51#define SLB_VSID_B_256M ASM_CONST(0x0000000000000000)
52#define SLB_VSID_B_1T ASM_CONST(0x4000000000000000)
53#define SLB_VSID_KS ASM_CONST(0x0000000000000800)
54#define SLB_VSID_KP ASM_CONST(0x0000000000000400)
55#define SLB_VSID_N ASM_CONST(0x0000000000000200)
56#define SLB_VSID_L ASM_CONST(0x0000000000000100)
57#define SLB_VSID_C ASM_CONST(0x0000000000000080)
58#define SLB_VSID_LP ASM_CONST(0x0000000000000030)
59#define SLB_VSID_LP_00 ASM_CONST(0x0000000000000000)
60#define SLB_VSID_LP_01 ASM_CONST(0x0000000000000010)
61#define SLB_VSID_LP_10 ASM_CONST(0x0000000000000020)
62#define SLB_VSID_LP_11 ASM_CONST(0x0000000000000030)
63#define SLB_VSID_LLP (SLB_VSID_L|SLB_VSID_LP)
64
65#define SLB_VSID_KERNEL (SLB_VSID_KP)
66#define SLB_VSID_USER (SLB_VSID_KP|SLB_VSID_KS|SLB_VSID_C)
67
68#define SLBIE_C (0x08000000)
69
70
71
72
73
74#define HPTES_PER_GROUP 8
75
76#define HPTE_V_SSIZE_SHIFT 62
77#define HPTE_V_AVPN_SHIFT 7
78#define HPTE_V_AVPN ASM_CONST(0x3fffffffffffff80)
79#define HPTE_V_AVPN_VAL(x) (((x) & HPTE_V_AVPN) >> HPTE_V_AVPN_SHIFT)
80#define HPTE_V_COMPARE(x,y) (!(((x) ^ (y)) & HPTE_V_AVPN))
81#define HPTE_V_BOLTED ASM_CONST(0x0000000000000010)
82#define HPTE_V_LOCK ASM_CONST(0x0000000000000008)
83#define HPTE_V_LARGE ASM_CONST(0x0000000000000004)
84#define HPTE_V_SECONDARY ASM_CONST(0x0000000000000002)
85#define HPTE_V_VALID ASM_CONST(0x0000000000000001)
86
87#define HPTE_R_PP0 ASM_CONST(0x8000000000000000)
88#define HPTE_R_TS ASM_CONST(0x4000000000000000)
89#define HPTE_R_RPN_SHIFT 12
90#define HPTE_R_RPN ASM_CONST(0x3ffffffffffff000)
91#define HPTE_R_FLAGS ASM_CONST(0x00000000000003ff)
92#define HPTE_R_PP ASM_CONST(0x0000000000000003)
93#define HPTE_R_N ASM_CONST(0x0000000000000004)
94#define HPTE_R_C ASM_CONST(0x0000000000000080)
95#define HPTE_R_R ASM_CONST(0x0000000000000100)
96
97
98
99#define PP_RWXX 0
100#define PP_RWRX 1
101#define PP_RWRW 2
102#define PP_RXRX 3
103
104#ifndef __ASSEMBLY__
105
106typedef struct {
107 unsigned long v;
108 unsigned long r;
109} hpte_t;
110
111extern hpte_t *htab_address;
112extern unsigned long htab_size_bytes;
113extern unsigned long htab_hash_mask;
114
115
116
117
118
119
120
121
122
123
124struct mmu_psize_def
125{
126 unsigned int shift;
127 unsigned int penc;
128 unsigned int tlbiel;
129 unsigned long avpnm;
130 unsigned long sllp;
131};
132
133#endif
134
135
136
137
138
139
140
141
142
143
144
145
146
147#define MMU_PAGE_4K 0
148#define MMU_PAGE_64K 1
149#define MMU_PAGE_64K_AP 2
150#define MMU_PAGE_1M 3
151#define MMU_PAGE_16M 4
152#define MMU_PAGE_16G 5
153#define MMU_PAGE_COUNT 6
154
155
156
157
158
159
160
161#define MMU_SEGSIZE_256M 0
162#define MMU_SEGSIZE_1T 1
163
164#ifndef __ASSEMBLY__
165
166
167
168
169extern struct mmu_psize_def mmu_psize_defs[MMU_PAGE_COUNT];
170extern int mmu_linear_psize;
171extern int mmu_virtual_psize;
172extern int mmu_vmalloc_psize;
173extern int mmu_io_psize;
174
175
176
177
178
179
180
181extern int mmu_ci_restrictions;
182
183#ifdef CONFIG_HUGETLB_PAGE
184
185
186
187extern int mmu_huge_psize;
188
189#endif
190
191
192
193
194
195static inline unsigned long hpte_encode_v(unsigned long va, int psize)
196{
197 unsigned long v =
198 v = (va >> 23) & ~(mmu_psize_defs[psize].avpnm);
199 v <<= HPTE_V_AVPN_SHIFT;
200 if (psize != MMU_PAGE_4K)
201 v |= HPTE_V_LARGE;
202 return v;
203}
204
205
206
207
208
209
210static inline unsigned long hpte_encode_r(unsigned long pa, int psize)
211{
212 unsigned long r;
213
214
215 if (psize == MMU_PAGE_4K)
216 return pa & HPTE_R_RPN;
217 else {
218 unsigned int penc = mmu_psize_defs[psize].penc;
219 unsigned int shift = mmu_psize_defs[psize].shift;
220 return (pa & ~((1ul << shift) - 1)) | (penc << 12);
221 }
222 return r;
223}
224
225
226
227
228
229static inline unsigned long hpt_hash(unsigned long va, unsigned int shift)
230{
231 return ((va >> 28) & 0x7fffffffffUL) ^ ((va & 0x0fffffffUL) >> shift);
232}
233
234extern int __hash_page_4K(unsigned long ea, unsigned long access,
235 unsigned long vsid, pte_t *ptep, unsigned long trap,
236 unsigned int local);
237extern int __hash_page_64K(unsigned long ea, unsigned long access,
238 unsigned long vsid, pte_t *ptep, unsigned long trap,
239 unsigned int local);
240struct mm_struct;
241extern int hash_page(unsigned long ea, unsigned long access, unsigned long trap);
242extern int hash_huge_page(struct mm_struct *mm, unsigned long access,
243 unsigned long ea, unsigned long vsid, int local,
244 unsigned long trap);
245
246extern int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
247 unsigned long pstart, unsigned long mode,
248 int psize);
249
250extern void htab_initialize(void);
251extern void htab_initialize_secondary(void);
252extern void hpte_init_native(void);
253extern void hpte_init_lpar(void);
254extern void hpte_init_iSeries(void);
255extern void hpte_init_beat(void);
256
257extern void stabs_alloc(void);
258extern void slb_initialize(void);
259extern void slb_flush_and_rebolt(void);
260extern void stab_initialize(unsigned long stab);
261
262#endif
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315#define VSID_MULTIPLIER ASM_CONST(200730139)
316#define VSID_BITS 36
317#define VSID_MODULUS ((1UL<<VSID_BITS)-1)
318
319#define CONTEXT_BITS 19
320#define USER_ESID_BITS 16
321
322#define USER_VSID_RANGE (1UL << (USER_ESID_BITS + SID_SHIFT))
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338#define ASM_VSID_SCRAMBLE(rt, rx) \
339 lis rx,VSID_MULTIPLIER@h; \
340 ori rx,rx,VSID_MULTIPLIER@l; \
341 mulld rt,rt,rx; \
342 \
343 srdi rx,rt,VSID_BITS; \
344 clrldi rt,rt,(64-VSID_BITS); \
345 add rt,rt,rx; \
346
347
348
349
350
351\
352 addi rx,rt,1; \
353 srdi rx,rx,VSID_BITS; \
354 add rt,rt,rx
355
356
357#ifndef __ASSEMBLY__
358
359typedef unsigned long mm_context_id_t;
360
361typedef struct {
362 mm_context_id_t id;
363 u16 user_psize;
364
365#ifdef CONFIG_PPC_MM_SLICES
366 u64 low_slices_psize;
367 u64 high_slices_psize;
368#else
369 u16 sllp;
370#endif
371 unsigned long vdso_base;
372} mm_context_t;
373
374
375static inline unsigned long vsid_scramble(unsigned long protovsid)
376{
377#if 0
378
379
380
381
382 return ((protovsid * VSID_MULTIPLIER) % VSID_MODULUS);
383#else
384 unsigned long x;
385
386 x = protovsid * VSID_MULTIPLIER;
387 x = (x >> VSID_BITS) + (x & VSID_MODULUS);
388 return (x + ((x+1) >> VSID_BITS)) & VSID_MODULUS;
389#endif
390}
391
392
393static inline unsigned long get_kernel_vsid(unsigned long ea)
394{
395 return vsid_scramble(ea >> SID_SHIFT);
396}
397
398
399static inline unsigned long get_vsid(unsigned long context, unsigned long ea)
400{
401 return vsid_scramble((context << USER_ESID_BITS)
402 | (ea >> SID_SHIFT));
403}
404
405#define VSID_SCRAMBLE(pvsid) (((pvsid) * VSID_MULTIPLIER) % VSID_MODULUS)
406#define KERNEL_VSID(ea) VSID_SCRAMBLE(GET_ESID(ea))
407
408
409typedef unsigned long phys_addr_t;
410
411#endif
412
413#endif
414