Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux...
[linux-2.6-block.git] / arch / m68k / mm / cache.c
index 5550aa4fd8119b3474db30c2a76aa9238f7206cd..3d84c1f2ffb2ef8765b5adae4bd8d334b8c78b6d 100644 (file)
@@ -74,8 +74,16 @@ static unsigned long virt_to_phys_slow(unsigned long vaddr)
 /* RZ: use cpush %bc instead of cpush %dc, cinv %ic */
 void flush_icache_range(unsigned long address, unsigned long endaddr)
 {
-
-       if (CPU_IS_040_OR_060) {
+       if (CPU_IS_COLDFIRE) {
+               unsigned long start, end;
+               start = address & ICACHE_SET_MASK;
+               end = endaddr & ICACHE_SET_MASK;
+               if (start > end) {
+                       flush_cf_icache(0, end);
+                       end = ICACHE_MAX_ADDR;
+               }
+               flush_cf_icache(start, end);
+       } else if (CPU_IS_040_OR_060) {
                address &= PAGE_MASK;
 
                do {
@@ -100,7 +108,17 @@ EXPORT_SYMBOL(flush_icache_range);
 void flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
                             unsigned long addr, int len)
 {
-       if (CPU_IS_040_OR_060) {
+       if (CPU_IS_COLDFIRE) {
+               unsigned long start, end;
+               start = addr & ICACHE_SET_MASK;
+               end = (addr + len) & ICACHE_SET_MASK;
+               if (start > end) {
+                       flush_cf_icache(0, end);
+                       end = ICACHE_MAX_ADDR;
+               }
+               flush_cf_icache(start, end);
+
+       } else if (CPU_IS_040_OR_060) {
                asm volatile ("nop\n\t"
                              ".chip 68040\n\t"
                              "cpushp %%bc,(%0)\n\t"