1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * Generic cache management functions. Everything is arch-specific, 41da177e4SLinus Torvalds * but this header exists to make sure the defines/functions can be 51da177e4SLinus Torvalds * used in a generic way. 61da177e4SLinus Torvalds * 71da177e4SLinus Torvalds * 2000-11-13 Arjan van de Ven <[email protected]> 81da177e4SLinus Torvalds * 91da177e4SLinus Torvalds */ 101da177e4SLinus Torvalds 111da177e4SLinus Torvalds #ifndef _LINUX_PREFETCH_H 121da177e4SLinus Torvalds #define _LINUX_PREFETCH_H 131da177e4SLinus Torvalds 141da177e4SLinus Torvalds #include <linux/types.h> 151da177e4SLinus Torvalds #include <asm/processor.h> 161da177e4SLinus Torvalds #include <asm/cache.h> 171da177e4SLinus Torvalds 181fa5cef2SLi RongQing struct page; 191da177e4SLinus Torvalds /* 201da177e4SLinus Torvalds prefetch(x) attempts to pre-emptively get the memory pointed to 211da177e4SLinus Torvalds by address "x" into the CPU L1 cache. 221da177e4SLinus Torvalds prefetch(x) should not cause any kind of exception, prefetch(0) is 231da177e4SLinus Torvalds specifically ok. 241da177e4SLinus Torvalds 251da177e4SLinus Torvalds prefetch() should be defined by the architecture, if not, the 261da177e4SLinus Torvalds #define below provides a no-op define. 271da177e4SLinus Torvalds 28*c8afaa1bSMateusz Guzik There are 2 prefetch() macros: 291da177e4SLinus Torvalds 301da177e4SLinus Torvalds prefetch(x) - prefetches the cacheline at "x" for read 311da177e4SLinus Torvalds prefetchw(x) - prefetches the cacheline at "x" for write 321da177e4SLinus Torvalds 3325985edcSLucas De Marchi there is also PREFETCH_STRIDE which is the architecure-preferred 341da177e4SLinus Torvalds "lookahead" size for prefetching streamed operations. 351da177e4SLinus Torvalds 361da177e4SLinus Torvalds */ 371da177e4SLinus Torvalds 381da177e4SLinus Torvalds #ifndef ARCH_HAS_PREFETCH 39ab483570SAndi Kleen #define prefetch(x) __builtin_prefetch(x) 401da177e4SLinus Torvalds #endif 411da177e4SLinus Torvalds 421da177e4SLinus Torvalds #ifndef ARCH_HAS_PREFETCHW 43ab483570SAndi Kleen #define prefetchw(x) __builtin_prefetch(x,1) 441da177e4SLinus Torvalds #endif 451da177e4SLinus Torvalds 461da177e4SLinus Torvalds #ifndef PREFETCH_STRIDE 471da177e4SLinus Torvalds #define PREFETCH_STRIDE (4*L1_CACHE_BYTES) 481da177e4SLinus Torvalds #endif 491da177e4SLinus Torvalds prefetch_range(void * addr,size_t len)501da177e4SLinus Torvaldsstatic inline void prefetch_range(void *addr, size_t len) 511da177e4SLinus Torvalds { 521da177e4SLinus Torvalds #ifdef ARCH_HAS_PREFETCH 531da177e4SLinus Torvalds char *cp; 541da177e4SLinus Torvalds char *end = addr + len; 551da177e4SLinus Torvalds 561da177e4SLinus Torvalds for (cp = addr; cp < end; cp += PREFETCH_STRIDE) 571da177e4SLinus Torvalds prefetch(cp); 581da177e4SLinus Torvalds #endif 591da177e4SLinus Torvalds } 601da177e4SLinus Torvalds prefetch_page_address(struct page * page)611fa5cef2SLi RongQingstatic inline void prefetch_page_address(struct page *page) 621fa5cef2SLi RongQing { 631fa5cef2SLi RongQing #if defined(WANT_PAGE_VIRTUAL) || defined(HASHED_PAGE_VIRTUAL) 641fa5cef2SLi RongQing prefetch(page); 651fa5cef2SLi RongQing #endif 661fa5cef2SLi RongQing } 671fa5cef2SLi RongQing 681da177e4SLinus Torvalds #endif 69