| /* | 
 |  *  Generic cache management functions. Everything is arch-specific,   | 
 |  *  but this header exists to make sure the defines/functions can be | 
 |  *  used in a generic way. | 
 |  * | 
 |  *  2000-11-13  Arjan van de Ven   <arjan@fenrus.demon.nl> | 
 |  * | 
 |  */ | 
 |  | 
 | #ifndef _LINUX_PREFETCH_H | 
 | #define _LINUX_PREFETCH_H | 
 |  | 
 | #include <linux/types.h> | 
 | #include <asm/processor.h> | 
 | #include <asm/cache.h> | 
 |  | 
 | /* | 
 | 	prefetch(x) attempts to pre-emptively get the memory pointed to | 
 | 	by address "x" into the CPU L1 cache.  | 
 | 	prefetch(x) should not cause any kind of exception, prefetch(0) is | 
 | 	specifically ok. | 
 |  | 
 | 	prefetch() should be defined by the architecture, if not, the  | 
 | 	#define below provides a no-op define.	 | 
 | 	 | 
 | 	There are 3 prefetch() macros: | 
 | 	 | 
 | 	prefetch(x)  	- prefetches the cacheline at "x" for read | 
 | 	prefetchw(x)	- prefetches the cacheline at "x" for write | 
 | 	spin_lock_prefetch(x) - prefetches the spinlock *x for taking | 
 | 	 | 
 | 	there is also PREFETCH_STRIDE which is the architecure-prefered  | 
 | 	"lookahead" size for prefetching streamed operations. | 
 | 	 | 
 | */ | 
 |  | 
 | #ifndef ARCH_HAS_PREFETCH | 
 | #define prefetch(x) __builtin_prefetch(x) | 
 | #endif | 
 |  | 
 | #ifndef ARCH_HAS_PREFETCHW | 
 | #define prefetchw(x) __builtin_prefetch(x,1) | 
 | #endif | 
 |  | 
 | #ifndef ARCH_HAS_SPINLOCK_PREFETCH | 
 | #define spin_lock_prefetch(x) prefetchw(x) | 
 | #endif | 
 |  | 
 | #ifndef PREFETCH_STRIDE | 
 | #define PREFETCH_STRIDE (4*L1_CACHE_BYTES) | 
 | #endif | 
 |  | 
 | static inline void prefetch_range(void *addr, size_t len) | 
 | { | 
 | #ifdef ARCH_HAS_PREFETCH | 
 | 	char *cp; | 
 | 	char *end = addr + len; | 
 |  | 
 | 	for (cp = addr; cp < end; cp += PREFETCH_STRIDE) | 
 | 		prefetch(cp); | 
 | #endif | 
 | } | 
 |  | 
 | #endif |