diff options
-rw-r--r-- | arch/mips/mm/c-r3k.c | 2 | ||||
-rw-r--r-- | arch/mips/mm/c-r4k.c | 2 | ||||
-rw-r--r-- | arch/mips/mm/c-sb1.c | 2 | ||||
-rw-r--r-- | arch/mips/mm/c-tx39.c | 4 | ||||
-rw-r--r-- | arch/mips/mm/cache.c | 18 | ||||
-rw-r--r-- | include/asm-mips/cacheflush.h | 12 | ||||
-rw-r--r-- | include/asm-mips/page.h | 7 |
7 files changed, 28 insertions, 19 deletions
diff --git a/arch/mips/mm/c-r3k.c b/arch/mips/mm/c-r3k.c index bb041a22f20a..e1f35ef81145 100644 --- a/arch/mips/mm/c-r3k.c +++ b/arch/mips/mm/c-r3k.c | |||
@@ -335,7 +335,7 @@ void __init r3k_cache_init(void) | |||
335 | flush_cache_mm = r3k_flush_cache_mm; | 335 | flush_cache_mm = r3k_flush_cache_mm; |
336 | flush_cache_range = r3k_flush_cache_range; | 336 | flush_cache_range = r3k_flush_cache_range; |
337 | flush_cache_page = r3k_flush_cache_page; | 337 | flush_cache_page = r3k_flush_cache_page; |
338 | flush_icache_page = r3k_flush_icache_page; | 338 | __flush_icache_page = r3k_flush_icache_page; |
339 | flush_icache_range = r3k_flush_icache_range; | 339 | flush_icache_range = r3k_flush_icache_range; |
340 | 340 | ||
341 | flush_cache_sigtramp = r3k_flush_cache_sigtramp; | 341 | flush_cache_sigtramp = r3k_flush_cache_sigtramp; |
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index b3ccb8738d29..4e1498246343 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c | |||
@@ -1291,7 +1291,7 @@ void __init r4k_cache_init(void) | |||
1291 | __flush_cache_all = r4k___flush_cache_all; | 1291 | __flush_cache_all = r4k___flush_cache_all; |
1292 | flush_cache_mm = r4k_flush_cache_mm; | 1292 | flush_cache_mm = r4k_flush_cache_mm; |
1293 | flush_cache_page = r4k_flush_cache_page; | 1293 | flush_cache_page = r4k_flush_cache_page; |
1294 | flush_icache_page = r4k_flush_icache_page; | 1294 | __flush_icache_page = r4k_flush_icache_page; |
1295 | flush_cache_range = r4k_flush_cache_range; | 1295 | flush_cache_range = r4k_flush_cache_range; |
1296 | 1296 | ||
1297 | flush_cache_sigtramp = r4k_flush_cache_sigtramp; | 1297 | flush_cache_sigtramp = r4k_flush_cache_sigtramp; |
diff --git a/arch/mips/mm/c-sb1.c b/arch/mips/mm/c-sb1.c index 2d71efb82ac5..4bd9ad8a5e07 100644 --- a/arch/mips/mm/c-sb1.c +++ b/arch/mips/mm/c-sb1.c | |||
@@ -520,7 +520,7 @@ void sb1_cache_init(void) | |||
520 | 520 | ||
521 | /* These routines are for Icache coherence with the Dcache */ | 521 | /* These routines are for Icache coherence with the Dcache */ |
522 | flush_icache_range = sb1_flush_icache_range; | 522 | flush_icache_range = sb1_flush_icache_range; |
523 | flush_icache_page = sb1_flush_icache_page; | 523 | __flush_icache_page = sb1_flush_icache_page; |
524 | flush_icache_all = __sb1_flush_icache_all; /* local only */ | 524 | flush_icache_all = __sb1_flush_icache_all; /* local only */ |
525 | 525 | ||
526 | /* This implies an Icache flush too, so can't be nop'ed */ | 526 | /* This implies an Icache flush too, so can't be nop'ed */ |
diff --git a/arch/mips/mm/c-tx39.c b/arch/mips/mm/c-tx39.c index 5dfc9b1901f6..932a09d7ef84 100644 --- a/arch/mips/mm/c-tx39.c +++ b/arch/mips/mm/c-tx39.c | |||
@@ -382,7 +382,7 @@ void __init tx39_cache_init(void) | |||
382 | flush_cache_mm = (void *) tx39h_flush_icache_all; | 382 | flush_cache_mm = (void *) tx39h_flush_icache_all; |
383 | flush_cache_range = (void *) tx39h_flush_icache_all; | 383 | flush_cache_range = (void *) tx39h_flush_icache_all; |
384 | flush_cache_page = (void *) tx39h_flush_icache_all; | 384 | flush_cache_page = (void *) tx39h_flush_icache_all; |
385 | flush_icache_page = (void *) tx39h_flush_icache_all; | 385 | __flush_icache_page = (void *) tx39h_flush_icache_all; |
386 | flush_icache_range = (void *) tx39h_flush_icache_all; | 386 | flush_icache_range = (void *) tx39h_flush_icache_all; |
387 | 387 | ||
388 | flush_cache_sigtramp = (void *) tx39h_flush_icache_all; | 388 | flush_cache_sigtramp = (void *) tx39h_flush_icache_all; |
@@ -408,7 +408,7 @@ void __init tx39_cache_init(void) | |||
408 | flush_cache_mm = tx39_flush_cache_mm; | 408 | flush_cache_mm = tx39_flush_cache_mm; |
409 | flush_cache_range = tx39_flush_cache_range; | 409 | flush_cache_range = tx39_flush_cache_range; |
410 | flush_cache_page = tx39_flush_cache_page; | 410 | flush_cache_page = tx39_flush_cache_page; |
411 | flush_icache_page = tx39_flush_icache_page; | 411 | __flush_icache_page = tx39_flush_icache_page; |
412 | flush_icache_range = tx39_flush_icache_range; | 412 | flush_icache_range = tx39_flush_icache_range; |
413 | 413 | ||
414 | flush_cache_sigtramp = tx39_flush_cache_sigtramp; | 414 | flush_cache_sigtramp = tx39_flush_cache_sigtramp; |
diff --git a/arch/mips/mm/cache.c b/arch/mips/mm/cache.c index ddd3a2de1d73..40c8b0235183 100644 --- a/arch/mips/mm/cache.c +++ b/arch/mips/mm/cache.c | |||
@@ -25,7 +25,7 @@ void (*flush_cache_range)(struct vm_area_struct *vma, unsigned long start, | |||
25 | void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, | 25 | void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, |
26 | unsigned long pfn); | 26 | unsigned long pfn); |
27 | void (*flush_icache_range)(unsigned long start, unsigned long end); | 27 | void (*flush_icache_range)(unsigned long start, unsigned long end); |
28 | void (*flush_icache_page)(struct vm_area_struct *vma, struct page *page); | 28 | void (*__flush_icache_page)(struct vm_area_struct *vma, struct page *page); |
29 | 29 | ||
30 | /* MIPS specific cache operations */ | 30 | /* MIPS specific cache operations */ |
31 | void (*flush_cache_sigtramp)(unsigned long addr); | 31 | void (*flush_cache_sigtramp)(unsigned long addr); |
@@ -70,6 +70,8 @@ void __flush_dcache_page(struct page *page) | |||
70 | struct address_space *mapping = page_mapping(page); | 70 | struct address_space *mapping = page_mapping(page); |
71 | unsigned long addr; | 71 | unsigned long addr; |
72 | 72 | ||
73 | if (PageHighMem(page)) | ||
74 | return; | ||
73 | if (mapping && !mapping_mapped(mapping)) { | 75 | if (mapping && !mapping_mapped(mapping)) { |
74 | SetPageDcacheDirty(page); | 76 | SetPageDcacheDirty(page); |
75 | return; | 77 | return; |
@@ -91,16 +93,16 @@ void __update_cache(struct vm_area_struct *vma, unsigned long address, | |||
91 | { | 93 | { |
92 | struct page *page; | 94 | struct page *page; |
93 | unsigned long pfn, addr; | 95 | unsigned long pfn, addr; |
96 | int exec = (vma->vm_flags & VM_EXEC) && !cpu_has_ic_fills_f_dc; | ||
94 | 97 | ||
95 | pfn = pte_pfn(pte); | 98 | pfn = pte_pfn(pte); |
96 | if (pfn_valid(pfn) && (page = pfn_to_page(pfn), page_mapping(page)) && | 99 | if (unlikely(!pfn_valid(pfn))) |
97 | Page_dcache_dirty(page)) { | 100 | return; |
98 | if (pages_do_alias((unsigned long)page_address(page), | 101 | page = pfn_to_page(pfn); |
99 | address & PAGE_MASK)) { | 102 | if (page_mapping(page) && Page_dcache_dirty(page)) { |
100 | addr = (unsigned long) page_address(page); | 103 | addr = (unsigned long) page_address(page); |
104 | if (exec || pages_do_alias(addr, address & PAGE_MASK)) | ||
101 | flush_data_cache_page(addr); | 105 | flush_data_cache_page(addr); |
102 | } | ||
103 | |||
104 | ClearPageDcacheDirty(page); | 106 | ClearPageDcacheDirty(page); |
105 | } | 107 | } |
106 | } | 108 | } |
diff --git a/include/asm-mips/cacheflush.h b/include/asm-mips/cacheflush.h index 47bc8f6c20d2..36416fdfcf68 100644 --- a/include/asm-mips/cacheflush.h +++ b/include/asm-mips/cacheflush.h | |||
@@ -21,7 +21,6 @@ | |||
21 | * - flush_cache_range(vma, start, end) flushes a range of pages | 21 | * - flush_cache_range(vma, start, end) flushes a range of pages |
22 | * - flush_icache_range(start, end) flush a range of instructions | 22 | * - flush_icache_range(start, end) flush a range of instructions |
23 | * - flush_dcache_page(pg) flushes(wback&invalidates) a page for dcache | 23 | * - flush_dcache_page(pg) flushes(wback&invalidates) a page for dcache |
24 | * - flush_icache_page(vma, pg) flushes(invalidates) a page for icache | ||
25 | * | 24 | * |
26 | * MIPS specific flush operations: | 25 | * MIPS specific flush operations: |
27 | * | 26 | * |
@@ -39,7 +38,7 @@ extern void __flush_dcache_page(struct page *page); | |||
39 | 38 | ||
40 | static inline void flush_dcache_page(struct page *page) | 39 | static inline void flush_dcache_page(struct page *page) |
41 | { | 40 | { |
42 | if (cpu_has_dc_aliases) | 41 | if (cpu_has_dc_aliases || !cpu_has_ic_fills_f_dc) |
43 | __flush_dcache_page(page); | 42 | __flush_dcache_page(page); |
44 | 43 | ||
45 | } | 44 | } |
@@ -47,8 +46,13 @@ static inline void flush_dcache_page(struct page *page) | |||
47 | #define flush_dcache_mmap_lock(mapping) do { } while (0) | 46 | #define flush_dcache_mmap_lock(mapping) do { } while (0) |
48 | #define flush_dcache_mmap_unlock(mapping) do { } while (0) | 47 | #define flush_dcache_mmap_unlock(mapping) do { } while (0) |
49 | 48 | ||
50 | extern void (*flush_icache_page)(struct vm_area_struct *vma, | 49 | extern void (*__flush_icache_page)(struct vm_area_struct *vma, |
51 | struct page *page); | 50 | struct page *page); |
51 | static inline void flush_icache_page(struct vm_area_struct *vma, | ||
52 | struct page *page) | ||
53 | { | ||
54 | } | ||
55 | |||
52 | extern void (*flush_icache_range)(unsigned long start, unsigned long end); | 56 | extern void (*flush_icache_range)(unsigned long start, unsigned long end); |
53 | #define flush_cache_vmap(start, end) flush_cache_all() | 57 | #define flush_cache_vmap(start, end) flush_cache_all() |
54 | #define flush_cache_vunmap(start, end) flush_cache_all() | 58 | #define flush_cache_vunmap(start, end) flush_cache_all() |
@@ -60,7 +64,7 @@ static inline void copy_to_user_page(struct vm_area_struct *vma, | |||
60 | if (cpu_has_dc_aliases) | 64 | if (cpu_has_dc_aliases) |
61 | flush_cache_page(vma, vaddr, page_to_pfn(page)); | 65 | flush_cache_page(vma, vaddr, page_to_pfn(page)); |
62 | memcpy(dst, src, len); | 66 | memcpy(dst, src, len); |
63 | flush_icache_page(vma, page); | 67 | __flush_icache_page(vma, page); |
64 | } | 68 | } |
65 | 69 | ||
66 | static inline void copy_from_user_page(struct vm_area_struct *vma, | 70 | static inline void copy_from_user_page(struct vm_area_struct *vma, |
diff --git a/include/asm-mips/page.h b/include/asm-mips/page.h index 219d359861f3..c3b872b047d7 100644 --- a/include/asm-mips/page.h +++ b/include/asm-mips/page.h | |||
@@ -34,6 +34,8 @@ | |||
34 | 34 | ||
35 | #ifndef __ASSEMBLY__ | 35 | #ifndef __ASSEMBLY__ |
36 | 36 | ||
37 | #include <asm/cpu-features.h> | ||
38 | |||
37 | extern void clear_page(void * page); | 39 | extern void clear_page(void * page); |
38 | extern void copy_page(void * to, void * from); | 40 | extern void copy_page(void * to, void * from); |
39 | 41 | ||
@@ -53,7 +55,7 @@ static inline void clear_user_page(void *addr, unsigned long vaddr, | |||
53 | extern void (*flush_data_cache_page)(unsigned long addr); | 55 | extern void (*flush_data_cache_page)(unsigned long addr); |
54 | 56 | ||
55 | clear_page(addr); | 57 | clear_page(addr); |
56 | if (pages_do_alias((unsigned long) addr, vaddr)) | 58 | if (pages_do_alias((unsigned long) addr, vaddr & PAGE_MASK)) |
57 | flush_data_cache_page((unsigned long)addr); | 59 | flush_data_cache_page((unsigned long)addr); |
58 | } | 60 | } |
59 | 61 | ||
@@ -63,7 +65,8 @@ static inline void copy_user_page(void *vto, void *vfrom, unsigned long vaddr, | |||
63 | extern void (*flush_data_cache_page)(unsigned long addr); | 65 | extern void (*flush_data_cache_page)(unsigned long addr); |
64 | 66 | ||
65 | copy_page(vto, vfrom); | 67 | copy_page(vto, vfrom); |
66 | if (pages_do_alias((unsigned long)vto, vaddr)) | 68 | if (!cpu_has_ic_fills_f_dc || |
69 | pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK)) | ||
67 | flush_data_cache_page((unsigned long)vto); | 70 | flush_data_cache_page((unsigned long)vto); |
68 | } | 71 | } |
69 | 72 | ||