From 4bab667f2ae876708dd91bbe67285be9d19a3397 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Fri, 14 May 2004 05:52:10 -0700 Subject: [PATCH] [PATCH] PPC32: Fix __flush_dcache_icache_phys() for Book E From: Matt Porter This patch implements/uses __flush_dcache_icache_page() which kmaps on a Book E part, but keeps the existing behavior on other PowerPCs which can disable the MMU. --- arch/ppc/mm/fault.c | 3 +-- arch/ppc/mm/init.c | 12 +++++++++++- include/asm-ppc/cacheflush.h | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/arch/ppc/mm/fault.c b/arch/ppc/mm/fault.c index e31abd874386e..c8cddee26e5b4 100644 --- a/arch/ppc/mm/fault.c +++ b/arch/ppc/mm/fault.c @@ -227,8 +227,7 @@ good_area: struct page *page = pte_page(*ptep); if (! test_bit(PG_arch_1, &page->flags)) { - unsigned long phys = page_to_pfn(page) << PAGE_SHIFT; - __flush_dcache_icache_phys(phys); + flush_dcache_icache_page(page); set_bit(PG_arch_1, &page->flags); } pte_update(ptep, 0, _PAGE_HWEXEC); diff --git a/arch/ppc/mm/init.c b/arch/ppc/mm/init.c index 8e4faa6dc5a9b..4628e26abf287 100644 --- a/arch/ppc/mm/init.c +++ b/arch/ppc/mm/init.c @@ -572,6 +572,16 @@ void flush_dcache_page(struct page *page) clear_bit(PG_arch_1, &page->flags); } +void flush_dcache_icache_page(struct page *page) +{ +#ifdef CONFIG_BOOKE + __flush_dcache_icache(kmap(page)); + kunmap(page); +#else + __flush_dcache_icache_phys(page_to_pfn(page) << PAGE_SHIFT); +#endif + +} void clear_user_page(void *page, unsigned long vaddr, struct page *pg) { clear_page(page); @@ -614,7 +624,7 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, if (vma->vm_mm == current->active_mm) __flush_dcache_icache((void *) address); else - __flush_dcache_icache_phys(pfn << PAGE_SHIFT); + flush_dcache_icache_page(page); set_bit(PG_arch_1, &page->flags); } } diff --git a/include/asm-ppc/cacheflush.h b/include/asm-ppc/cacheflush.h index e84fa9c095b24..b5cca6751ccb2 100644 --- a/include/asm-ppc/cacheflush.h +++ b/include/asm-ppc/cacheflush.h @@ -41,6 +41,6 @@ do { memcpy(dst, src, len); \ extern void __flush_dcache_icache(void *page_va); extern void __flush_dcache_icache_phys(unsigned long physaddr); - +extern void flush_dcache_icache_page(struct page *page); #endif /* _PPC_CACHEFLUSH_H */ #endif /* __KERNEL__ */ -- 2.53.0