]> git.hungrycats.org Git - linux/commitdiff
[PATCH] PPC32: Fix __flush_dcache_icache_phys() for Book E
authorAndrew Morton <akpm@osdl.org>
Fri, 14 May 2004 12:52:10 +0000 (05:52 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 14 May 2004 12:52:10 +0000 (05:52 -0700)
From: Matt Porter <mporter@kernel.crashing.org>

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
arch/ppc/mm/init.c
include/asm-ppc/cacheflush.h

index e31abd874386e37290f68226bde56b8858a4a71e..c8cddee26e5b4840c2bbd1239144d5901b7187ec 100644 (file)
@@ -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);
index 8e4faa6dc5a9bc309fa82344a2d2a037662cd1c1..4628e26abf287ba3560fade2d5295367c002f34a 100644 (file)
@@ -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);
                }
        }
index e84fa9c095b2441ae98a0221c771c860a0780672..b5cca6751ccb2d48300933127477a3d06d73e4d9 100644 (file)
@@ -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__ */