diff options
Diffstat (limited to 'arch/powerpc/mm/hash_native_64.c')
-rw-r--r-- | arch/powerpc/mm/hash_native_64.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/arch/powerpc/mm/hash_native_64.c b/arch/powerpc/mm/hash_native_64.c index 4a20d890e2f4..6ba9b47e55af 100644 --- a/arch/powerpc/mm/hash_native_64.c +++ b/arch/powerpc/mm/hash_native_64.c | |||
@@ -104,7 +104,7 @@ static inline void tlbie(unsigned long va, int psize, int local) | |||
104 | spin_unlock(&native_tlbie_lock); | 104 | spin_unlock(&native_tlbie_lock); |
105 | } | 105 | } |
106 | 106 | ||
107 | static inline void native_lock_hpte(hpte_t *hptep) | 107 | static inline void native_lock_hpte(struct hash_pte *hptep) |
108 | { | 108 | { |
109 | unsigned long *word = &hptep->v; | 109 | unsigned long *word = &hptep->v; |
110 | 110 | ||
@@ -116,7 +116,7 @@ static inline void native_lock_hpte(hpte_t *hptep) | |||
116 | } | 116 | } |
117 | } | 117 | } |
118 | 118 | ||
119 | static inline void native_unlock_hpte(hpte_t *hptep) | 119 | static inline void native_unlock_hpte(struct hash_pte *hptep) |
120 | { | 120 | { |
121 | unsigned long *word = &hptep->v; | 121 | unsigned long *word = &hptep->v; |
122 | 122 | ||
@@ -128,7 +128,7 @@ static long native_hpte_insert(unsigned long hpte_group, unsigned long va, | |||
128 | unsigned long pa, unsigned long rflags, | 128 | unsigned long pa, unsigned long rflags, |
129 | unsigned long vflags, int psize) | 129 | unsigned long vflags, int psize) |
130 | { | 130 | { |
131 | hpte_t *hptep = htab_address + hpte_group; | 131 | struct hash_pte *hptep = htab_address + hpte_group; |
132 | unsigned long hpte_v, hpte_r; | 132 | unsigned long hpte_v, hpte_r; |
133 | int i; | 133 | int i; |
134 | 134 | ||
@@ -163,7 +163,7 @@ static long native_hpte_insert(unsigned long hpte_group, unsigned long va, | |||
163 | 163 | ||
164 | hptep->r = hpte_r; | 164 | hptep->r = hpte_r; |
165 | /* Guarantee the second dword is visible before the valid bit */ | 165 | /* Guarantee the second dword is visible before the valid bit */ |
166 | __asm__ __volatile__ ("eieio" : : : "memory"); | 166 | eieio(); |
167 | /* | 167 | /* |
168 | * Now set the first dword including the valid bit | 168 | * Now set the first dword including the valid bit |
169 | * NOTE: this also unlocks the hpte | 169 | * NOTE: this also unlocks the hpte |
@@ -177,7 +177,7 @@ static long native_hpte_insert(unsigned long hpte_group, unsigned long va, | |||
177 | 177 | ||
178 | static long native_hpte_remove(unsigned long hpte_group) | 178 | static long native_hpte_remove(unsigned long hpte_group) |
179 | { | 179 | { |
180 | hpte_t *hptep; | 180 | struct hash_pte *hptep; |
181 | int i; | 181 | int i; |
182 | int slot_offset; | 182 | int slot_offset; |
183 | unsigned long hpte_v; | 183 | unsigned long hpte_v; |
@@ -217,7 +217,7 @@ static long native_hpte_remove(unsigned long hpte_group) | |||
217 | static long native_hpte_updatepp(unsigned long slot, unsigned long newpp, | 217 | static long native_hpte_updatepp(unsigned long slot, unsigned long newpp, |
218 | unsigned long va, int psize, int local) | 218 | unsigned long va, int psize, int local) |
219 | { | 219 | { |
220 | hpte_t *hptep = htab_address + slot; | 220 | struct hash_pte *hptep = htab_address + slot; |
221 | unsigned long hpte_v, want_v; | 221 | unsigned long hpte_v, want_v; |
222 | int ret = 0; | 222 | int ret = 0; |
223 | 223 | ||
@@ -233,15 +233,14 @@ static long native_hpte_updatepp(unsigned long slot, unsigned long newpp, | |||
233 | /* Even if we miss, we need to invalidate the TLB */ | 233 | /* Even if we miss, we need to invalidate the TLB */ |
234 | if (!HPTE_V_COMPARE(hpte_v, want_v) || !(hpte_v & HPTE_V_VALID)) { | 234 | if (!HPTE_V_COMPARE(hpte_v, want_v) || !(hpte_v & HPTE_V_VALID)) { |
235 | DBG_LOW(" -> miss\n"); | 235 | DBG_LOW(" -> miss\n"); |
236 | native_unlock_hpte(hptep); | ||
237 | ret = -1; | 236 | ret = -1; |
238 | } else { | 237 | } else { |
239 | DBG_LOW(" -> hit\n"); | 238 | DBG_LOW(" -> hit\n"); |
240 | /* Update the HPTE */ | 239 | /* Update the HPTE */ |
241 | hptep->r = (hptep->r & ~(HPTE_R_PP | HPTE_R_N)) | | 240 | hptep->r = (hptep->r & ~(HPTE_R_PP | HPTE_R_N)) | |
242 | (newpp & (HPTE_R_PP | HPTE_R_N | HPTE_R_C)); | 241 | (newpp & (HPTE_R_PP | HPTE_R_N | HPTE_R_C)); |
243 | native_unlock_hpte(hptep); | ||
244 | } | 242 | } |
243 | native_unlock_hpte(hptep); | ||
245 | 244 | ||
246 | /* Ensure it is out of the tlb too. */ | 245 | /* Ensure it is out of the tlb too. */ |
247 | tlbie(va, psize, local); | 246 | tlbie(va, psize, local); |
@@ -251,7 +250,7 @@ static long native_hpte_updatepp(unsigned long slot, unsigned long newpp, | |||
251 | 250 | ||
252 | static long native_hpte_find(unsigned long va, int psize) | 251 | static long native_hpte_find(unsigned long va, int psize) |
253 | { | 252 | { |
254 | hpte_t *hptep; | 253 | struct hash_pte *hptep; |
255 | unsigned long hash; | 254 | unsigned long hash; |
256 | unsigned long i, j; | 255 | unsigned long i, j; |
257 | long slot; | 256 | long slot; |
@@ -294,7 +293,7 @@ static void native_hpte_updateboltedpp(unsigned long newpp, unsigned long ea, | |||
294 | { | 293 | { |
295 | unsigned long vsid, va; | 294 | unsigned long vsid, va; |
296 | long slot; | 295 | long slot; |
297 | hpte_t *hptep; | 296 | struct hash_pte *hptep; |
298 | 297 | ||
299 | vsid = get_kernel_vsid(ea); | 298 | vsid = get_kernel_vsid(ea); |
300 | va = (vsid << 28) | (ea & 0x0fffffff); | 299 | va = (vsid << 28) | (ea & 0x0fffffff); |
@@ -315,7 +314,7 @@ static void native_hpte_updateboltedpp(unsigned long newpp, unsigned long ea, | |||
315 | static void native_hpte_invalidate(unsigned long slot, unsigned long va, | 314 | static void native_hpte_invalidate(unsigned long slot, unsigned long va, |
316 | int psize, int local) | 315 | int psize, int local) |
317 | { | 316 | { |
318 | hpte_t *hptep = htab_address + slot; | 317 | struct hash_pte *hptep = htab_address + slot; |
319 | unsigned long hpte_v; | 318 | unsigned long hpte_v; |
320 | unsigned long want_v; | 319 | unsigned long want_v; |
321 | unsigned long flags; | 320 | unsigned long flags; |
@@ -345,7 +344,7 @@ static void native_hpte_invalidate(unsigned long slot, unsigned long va, | |||
345 | #define LP_BITS 8 | 344 | #define LP_BITS 8 |
346 | #define LP_MASK(i) ((0xFF >> (i)) << LP_SHIFT) | 345 | #define LP_MASK(i) ((0xFF >> (i)) << LP_SHIFT) |
347 | 346 | ||
348 | static void hpte_decode(hpte_t *hpte, unsigned long slot, | 347 | static void hpte_decode(struct hash_pte *hpte, unsigned long slot, |
349 | int *psize, unsigned long *va) | 348 | int *psize, unsigned long *va) |
350 | { | 349 | { |
351 | unsigned long hpte_r = hpte->r; | 350 | unsigned long hpte_r = hpte->r; |
@@ -415,7 +414,7 @@ static void hpte_decode(hpte_t *hpte, unsigned long slot, | |||
415 | static void native_hpte_clear(void) | 414 | static void native_hpte_clear(void) |
416 | { | 415 | { |
417 | unsigned long slot, slots, flags; | 416 | unsigned long slot, slots, flags; |
418 | hpte_t *hptep = htab_address; | 417 | struct hash_pte *hptep = htab_address; |
419 | unsigned long hpte_v, va; | 418 | unsigned long hpte_v, va; |
420 | unsigned long pteg_count; | 419 | unsigned long pteg_count; |
421 | int psize; | 420 | int psize; |
@@ -462,7 +461,7 @@ static void native_hpte_clear(void) | |||
462 | static void native_flush_hash_range(unsigned long number, int local) | 461 | static void native_flush_hash_range(unsigned long number, int local) |
463 | { | 462 | { |
464 | unsigned long va, hash, index, hidx, shift, slot; | 463 | unsigned long va, hash, index, hidx, shift, slot; |
465 | hpte_t *hptep; | 464 | struct hash_pte *hptep; |
466 | unsigned long hpte_v; | 465 | unsigned long hpte_v; |
467 | unsigned long want_v; | 466 | unsigned long want_v; |
468 | unsigned long flags; | 467 | unsigned long flags; |