11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Generic cache management functions. Everything is arch-specific, 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * but this header exists to make sure the defines/functions can be 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * used in a generic way. 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2000-11-13 Arjan van de Ven <arjan@fenrus.demon.nl> 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _LINUX_PREFETCH_H 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _LINUX_PREFETCH_H 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/types.h> 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/processor.h> 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/cache.h> 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds prefetch(x) attempts to pre-emptively get the memory pointed to 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds by address "x" into the CPU L1 cache. 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds prefetch(x) should not cause any kind of exception, prefetch(0) is 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds specifically ok. 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds prefetch() should be defined by the architecture, if not, the 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds #define below provides a no-op define. 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds There are 3 prefetch() macros: 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds prefetch(x) - prefetches the cacheline at "x" for read 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds prefetchw(x) - prefetches the cacheline at "x" for write 305216184571946b8bbf06f0cd630c7754190fdd1aDave Jones spin_lock_prefetch(x) - prefetches the spinlock *x for taking 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3225985edcedea6396277003854657b5f3cb31a628Lucas De Marchi there is also PREFETCH_STRIDE which is the architecure-preferred 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "lookahead" size for prefetching streamed operations. 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*/ 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef ARCH_HAS_PREFETCH 38ab483570a13be2a34c0502b166df8f8b26802103Andi Kleen#define prefetch(x) __builtin_prefetch(x) 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef ARCH_HAS_PREFETCHW 42ab483570a13be2a34c0502b166df8f8b26802103Andi Kleen#define prefetchw(x) __builtin_prefetch(x,1) 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef ARCH_HAS_SPINLOCK_PREFETCH 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define spin_lock_prefetch(x) prefetchw(x) 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef PREFETCH_STRIDE 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PREFETCH_STRIDE (4*L1_CACHE_BYTES) 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void prefetch_range(void *addr, size_t len) 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef ARCH_HAS_PREFETCH 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *cp; 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *end = addr + len; 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (cp = addr; cp < end; cp += PREFETCH_STRIDE) 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds prefetch(cp); 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 65