diff options
author | Vitaly Bordug <vbordug@ru.mvista.com> | 2007-01-24 14:40:57 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-02-06 20:00:32 -0500 |
commit | dbbb06b7f6ae8037a5f6b4498e492791e1929635 (patch) | |
tree | a88e4458e65ea82ac1f1aa0e91c01390790375d9 /arch | |
parent | f25222b99542bcadf1cc53cc9aa0e304849242ca (diff) |
[POWERPC] 8xx: platform specific mmu updates
This is just a straight port of the same done in arch/ppc
by Marcelo Tosatti. One used to be
[PATCH] ppc32 8xx: update_mmu_cache() needs unconditional tlbie,
commit eb07d964b4491d1bb5864cd3d7e7633ccdda9a53
In a nutshell, the board is nearly stuck without this, yet without any
visible failure - being just very slow.
Signed-off-by: Vitaly Bordug <vbordug@ru.mvista.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/mm/mem.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index d1c0758c5611..c85eda63d2b3 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c | |||
@@ -490,19 +490,19 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, | |||
490 | !cpu_has_feature(CPU_FTR_NOEXECUTE) && | 490 | !cpu_has_feature(CPU_FTR_NOEXECUTE) && |
491 | pfn_valid(pfn)) { | 491 | pfn_valid(pfn)) { |
492 | struct page *page = pfn_to_page(pfn); | 492 | struct page *page = pfn_to_page(pfn); |
493 | #ifdef CONFIG_8xx | ||
494 | /* On 8xx, cache control instructions (particularly | ||
495 | * "dcbst" from flush_dcache_icache) fault as write | ||
496 | * operation if there is an unpopulated TLB entry | ||
497 | * for the address in question. To workaround that, | ||
498 | * we invalidate the TLB here, thus avoiding dcbst | ||
499 | * misbehaviour. | ||
500 | */ | ||
501 | _tlbie(address); | ||
502 | #endif | ||
493 | if (!PageReserved(page) | 503 | if (!PageReserved(page) |
494 | && !test_bit(PG_arch_1, &page->flags)) { | 504 | && !test_bit(PG_arch_1, &page->flags)) { |
495 | if (vma->vm_mm == current->active_mm) { | 505 | if (vma->vm_mm == current->active_mm) { |
496 | #ifdef CONFIG_8xx | ||
497 | /* On 8xx, cache control instructions (particularly | ||
498 | * "dcbst" from flush_dcache_icache) fault as write | ||
499 | * operation if there is an unpopulated TLB entry | ||
500 | * for the address in question. To workaround that, | ||
501 | * we invalidate the TLB here, thus avoiding dcbst | ||
502 | * misbehaviour. | ||
503 | */ | ||
504 | _tlbie(address); | ||
505 | #endif | ||
506 | __flush_dcache_icache((void *) address); | 506 | __flush_dcache_icache((void *) address); |
507 | } else | 507 | } else |
508 | flush_dcache_icache_page(page); | 508 | flush_dcache_icache_page(page); |