|
20 | 20 | #ifndef __ASM_KVM_BOOK3S_64_H__ |
21 | 21 | #define __ASM_KVM_BOOK3S_64_H__ |
22 | 22 |
|
| 23 | +#include <asm/book3s/64/mmu-hash.h> |
| 24 | + |
23 | 25 | #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE |
24 | 26 | static inline struct kvmppc_book3s_shadow_vcpu *svcpu_get(struct kvm_vcpu *vcpu) |
25 | 27 | { |
@@ -97,56 +99,20 @@ static inline void __unlock_hpte(__be64 *hpte, unsigned long hpte_v) |
97 | 99 | hpte[0] = cpu_to_be64(hpte_v); |
98 | 100 | } |
99 | 101 |
|
100 | | -static inline int __hpte_actual_psize(unsigned int lp, int psize) |
101 | | -{ |
102 | | - int i, shift; |
103 | | - unsigned int mask; |
104 | | - |
105 | | - /* start from 1 ignoring MMU_PAGE_4K */ |
106 | | - for (i = 1; i < MMU_PAGE_COUNT; i++) { |
107 | | - |
108 | | - /* invalid penc */ |
109 | | - if (mmu_psize_defs[psize].penc[i] == -1) |
110 | | - continue; |
111 | | - /* |
112 | | - * encoding bits per actual page size |
113 | | - * PTE LP actual page size |
114 | | - * rrrr rrrz >=8KB |
115 | | - * rrrr rrzz >=16KB |
116 | | - * rrrr rzzz >=32KB |
117 | | - * rrrr zzzz >=64KB |
118 | | - * ....... |
119 | | - */ |
120 | | - shift = mmu_psize_defs[i].shift - LP_SHIFT; |
121 | | - if (shift > LP_BITS) |
122 | | - shift = LP_BITS; |
123 | | - mask = (1 << shift) - 1; |
124 | | - if ((lp & mask) == mmu_psize_defs[psize].penc[i]) |
125 | | - return i; |
126 | | - } |
127 | | - return -1; |
128 | | -} |
129 | | - |
130 | 102 | static inline unsigned long compute_tlbie_rb(unsigned long v, unsigned long r, |
131 | 103 | unsigned long pte_index) |
132 | 104 | { |
133 | | - int b_psize = MMU_PAGE_4K, a_psize = MMU_PAGE_4K; |
| 105 | + int i, b_psize = MMU_PAGE_4K, a_psize = MMU_PAGE_4K; |
134 | 106 | unsigned int penc; |
135 | 107 | unsigned long rb = 0, va_low, sllp; |
136 | 108 | unsigned int lp = (r >> LP_SHIFT) & ((1 << LP_BITS) - 1); |
137 | 109 |
|
138 | 110 | if (v & HPTE_V_LARGE) { |
139 | | - for (b_psize = 0; b_psize < MMU_PAGE_COUNT; b_psize++) { |
140 | | - |
141 | | - /* valid entries have a shift value */ |
142 | | - if (!mmu_psize_defs[b_psize].shift) |
143 | | - continue; |
144 | | - |
145 | | - a_psize = __hpte_actual_psize(lp, b_psize); |
146 | | - if (a_psize != -1) |
147 | | - break; |
148 | | - } |
| 111 | + i = hpte_page_sizes[lp]; |
| 112 | + b_psize = i & 0xf; |
| 113 | + a_psize = i >> 4; |
149 | 114 | } |
| 115 | + |
150 | 116 | /* |
151 | 117 | * Ignore the top 14 bits of va |
152 | 118 | * v have top two bits covering segment size, hence move |
@@ -215,45 +181,6 @@ static inline unsigned long compute_tlbie_rb(unsigned long v, unsigned long r, |
215 | 181 | return rb; |
216 | 182 | } |
217 | 183 |
|
218 | | -static inline unsigned long __hpte_page_size(unsigned long h, unsigned long l, |
219 | | - bool is_base_size) |
220 | | -{ |
221 | | - |
222 | | - int size, a_psize; |
223 | | - /* Look at the 8 bit LP value */ |
224 | | - unsigned int lp = (l >> LP_SHIFT) & ((1 << LP_BITS) - 1); |
225 | | - |
226 | | - /* only handle 4k, 64k and 16M pages for now */ |
227 | | - if (!(h & HPTE_V_LARGE)) |
228 | | - return 1ul << 12; |
229 | | - else { |
230 | | - for (size = 0; size < MMU_PAGE_COUNT; size++) { |
231 | | - /* valid entries have a shift value */ |
232 | | - if (!mmu_psize_defs[size].shift) |
233 | | - continue; |
234 | | - |
235 | | - a_psize = __hpte_actual_psize(lp, size); |
236 | | - if (a_psize != -1) { |
237 | | - if (is_base_size) |
238 | | - return 1ul << mmu_psize_defs[size].shift; |
239 | | - return 1ul << mmu_psize_defs[a_psize].shift; |
240 | | - } |
241 | | - } |
242 | | - |
243 | | - } |
244 | | - return 0; |
245 | | -} |
246 | | - |
247 | | -static inline unsigned long hpte_page_size(unsigned long h, unsigned long l) |
248 | | -{ |
249 | | - return __hpte_page_size(h, l, 0); |
250 | | -} |
251 | | - |
252 | | -static inline unsigned long hpte_base_page_size(unsigned long h, unsigned long l) |
253 | | -{ |
254 | | - return __hpte_page_size(h, l, 1); |
255 | | -} |
256 | | - |
257 | 184 | static inline unsigned long hpte_rpn(unsigned long ptel, unsigned long psize) |
258 | 185 | { |
259 | 186 | return ((ptel & HPTE_R_RPN) & ~(psize - 1)) >> PAGE_SHIFT; |
|
0 commit comments