1 /* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 * 6 * Copyright (C) 2001-2003, 2006 Silicon Graphics, Inc. All rights reserved. 7 * 8 */ 9 #include <linux/module.h> 10 #include <asm/pgalloc.h> 11 #include <asm/sn/arch.h> 12 13 /** 14 * sn_flush_all_caches - flush a range of address from all caches (incl. L4) 15 * @flush_addr: identity mapped region 7 address to start flushing 16 * @bytes: number of bytes to flush 17 * 18 * Flush a range of addresses from all caches including L4. 19 * All addresses fully or partially contained within 20 * @flush_addr to @flush_addr + @bytes are flushed 21 * from all caches. 22 */ 23 void sn_flush_all_caches(long flush_addr,long bytes)24sn_flush_all_caches(long flush_addr, long bytes) 25 { 26 unsigned long addr = flush_addr; 27 28 /* SHub1 requires a cached address */ 29 if (is_shub1() && (addr & RGN_BITS) == RGN_BASE(RGN_UNCACHED)) 30 addr = (addr - RGN_BASE(RGN_UNCACHED)) + RGN_BASE(RGN_KERNEL); 31 32 flush_icache_range(addr, addr + bytes); 33 /* 34 * The last call may have returned before the caches 35 * were actually flushed, so we call it again to make 36 * sure. 37 */ 38 flush_icache_range(addr, addr + bytes); 39 mb(); 40 } 41 EXPORT_SYMBOL(sn_flush_all_caches); 42