Merge to Fedora kernel-2.6.18-1.2224_FC5 patched with stable patch-2.6.18.1-vs2.0...
[linux-2.6.git] / arch / ia64 / sn / kernel / sn2 / cache.c
index bc3cfa1..2862cb3 100644 (file)
@@ -3,11 +3,12 @@
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  * 
- * Copyright (C) 2001-2003 Silicon Graphics, Inc. All rights reserved.
+ * Copyright (C) 2001-2003, 2006 Silicon Graphics, Inc. All rights reserved.
  *
  */
 #include <linux/module.h>
 #include <asm/pgalloc.h>
+#include <asm/sn/arch.h>
 
 /**
  * sn_flush_all_caches - flush a range of address from all caches (incl. L4)
  * Flush a range of addresses from all caches including L4. 
  * All addresses fully or partially contained within 
  * @flush_addr to @flush_addr + @bytes are flushed
- * from the all caches.
+ * from all caches.
  */
 void
 sn_flush_all_caches(long flush_addr, long bytes)
 {
-       flush_icache_range(flush_addr, flush_addr+bytes);
+       unsigned long addr = flush_addr;
+
+       /* SHub1 requires a cached address */
+       if (is_shub1() && (addr & RGN_BITS) == RGN_BASE(RGN_UNCACHED))
+               addr = (addr - RGN_BASE(RGN_UNCACHED)) + RGN_BASE(RGN_KERNEL);
+
+       flush_icache_range(addr, addr + bytes);
        /*
         * The last call may have returned before the caches
         * were actually flushed, so we call it again to make
         * sure.
         */
-       flush_icache_range(flush_addr, flush_addr+bytes);
+       flush_icache_range(addr, addr + bytes);
        mb();
 }
 EXPORT_SYMBOL(sn_flush_all_caches);