diff options
Diffstat (limited to 'arch/sh/mm/pmb.c')
-rw-r--r-- | arch/sh/mm/pmb.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/arch/sh/mm/pmb.c b/arch/sh/mm/pmb.c index 1d45b82f0a63..ab81c602295f 100644 --- a/arch/sh/mm/pmb.c +++ b/arch/sh/mm/pmb.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <asm/pgtable.h> | 27 | #include <asm/pgtable.h> |
28 | #include <asm/mmu.h> | 28 | #include <asm/mmu.h> |
29 | #include <asm/io.h> | 29 | #include <asm/io.h> |
30 | #include <asm/mmu_context.h> | ||
30 | 31 | ||
31 | #define NR_PMB_ENTRIES 16 | 32 | #define NR_PMB_ENTRIES 16 |
32 | 33 | ||
@@ -162,18 +163,18 @@ repeat: | |||
162 | return 0; | 163 | return 0; |
163 | } | 164 | } |
164 | 165 | ||
165 | int set_pmb_entry(struct pmb_entry *pmbe) | 166 | int __uses_jump_to_uncached set_pmb_entry(struct pmb_entry *pmbe) |
166 | { | 167 | { |
167 | int ret; | 168 | int ret; |
168 | 169 | ||
169 | jump_to_P2(); | 170 | jump_to_uncached(); |
170 | ret = __set_pmb_entry(pmbe->vpn, pmbe->ppn, pmbe->flags, &pmbe->entry); | 171 | ret = __set_pmb_entry(pmbe->vpn, pmbe->ppn, pmbe->flags, &pmbe->entry); |
171 | back_to_P1(); | 172 | back_to_cached(); |
172 | 173 | ||
173 | return ret; | 174 | return ret; |
174 | } | 175 | } |
175 | 176 | ||
176 | void clear_pmb_entry(struct pmb_entry *pmbe) | 177 | void __uses_jump_to_uncached clear_pmb_entry(struct pmb_entry *pmbe) |
177 | { | 178 | { |
178 | unsigned int entry = pmbe->entry; | 179 | unsigned int entry = pmbe->entry; |
179 | unsigned long addr; | 180 | unsigned long addr; |
@@ -187,7 +188,7 @@ void clear_pmb_entry(struct pmb_entry *pmbe) | |||
187 | entry >= NR_PMB_ENTRIES)) | 188 | entry >= NR_PMB_ENTRIES)) |
188 | return; | 189 | return; |
189 | 190 | ||
190 | jump_to_P2(); | 191 | jump_to_uncached(); |
191 | 192 | ||
192 | /* Clear V-bit */ | 193 | /* Clear V-bit */ |
193 | addr = mk_pmb_addr(entry); | 194 | addr = mk_pmb_addr(entry); |
@@ -196,7 +197,7 @@ void clear_pmb_entry(struct pmb_entry *pmbe) | |||
196 | addr = mk_pmb_data(entry); | 197 | addr = mk_pmb_data(entry); |
197 | ctrl_outl(ctrl_inl(addr) & ~PMB_V, addr); | 198 | ctrl_outl(ctrl_inl(addr) & ~PMB_V, addr); |
198 | 199 | ||
199 | back_to_P1(); | 200 | back_to_cached(); |
200 | 201 | ||
201 | clear_bit(entry, &pmb_map); | 202 | clear_bit(entry, &pmb_map); |
202 | } | 203 | } |
@@ -301,17 +302,17 @@ static void pmb_cache_ctor(struct kmem_cache *cachep, void *pmb) | |||
301 | pmbe->entry = PMB_NO_ENTRY; | 302 | pmbe->entry = PMB_NO_ENTRY; |
302 | } | 303 | } |
303 | 304 | ||
304 | static int __init pmb_init(void) | 305 | static int __uses_jump_to_uncached pmb_init(void) |
305 | { | 306 | { |
306 | unsigned int nr_entries = ARRAY_SIZE(pmb_init_map); | 307 | unsigned int nr_entries = ARRAY_SIZE(pmb_init_map); |
307 | unsigned int entry; | 308 | unsigned int entry, i; |
308 | 309 | ||
309 | BUG_ON(unlikely(nr_entries >= NR_PMB_ENTRIES)); | 310 | BUG_ON(unlikely(nr_entries >= NR_PMB_ENTRIES)); |
310 | 311 | ||
311 | pmb_cache = kmem_cache_create("pmb", sizeof(struct pmb_entry), 0, | 312 | pmb_cache = kmem_cache_create("pmb", sizeof(struct pmb_entry), 0, |
312 | SLAB_PANIC, pmb_cache_ctor); | 313 | SLAB_PANIC, pmb_cache_ctor); |
313 | 314 | ||
314 | jump_to_P2(); | 315 | jump_to_uncached(); |
315 | 316 | ||
316 | /* | 317 | /* |
317 | * Ordering is important, P2 must be mapped in the PMB before we | 318 | * Ordering is important, P2 must be mapped in the PMB before we |
@@ -329,7 +330,12 @@ static int __init pmb_init(void) | |||
329 | /* PMB.SE and UB[7] */ | 330 | /* PMB.SE and UB[7] */ |
330 | ctrl_outl((1 << 31) | (1 << 7), PMB_PASCR); | 331 | ctrl_outl((1 << 31) | (1 << 7), PMB_PASCR); |
331 | 332 | ||
332 | back_to_P1(); | 333 | /* Flush out the TLB */ |
334 | i = ctrl_inl(MMUCR); | ||
335 | i |= MMUCR_TI; | ||
336 | ctrl_outl(i, MMUCR); | ||
337 | |||
338 | back_to_cached(); | ||
333 | 339 | ||
334 | return 0; | 340 | return 0; |
335 | } | 341 | } |