1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _ASM_POWERPC_CACHE_H 3*4882a593Smuzhiyun #define _ASM_POWERPC_CACHE_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #ifdef __KERNEL__ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun /* bytes per L1 cache line */ 9*4882a593Smuzhiyun #if defined(CONFIG_PPC_8xx) 10*4882a593Smuzhiyun #define L1_CACHE_SHIFT 4 11*4882a593Smuzhiyun #define MAX_COPY_PREFETCH 1 12*4882a593Smuzhiyun #define IFETCH_ALIGN_SHIFT 2 13*4882a593Smuzhiyun #elif defined(CONFIG_PPC_E500MC) 14*4882a593Smuzhiyun #define L1_CACHE_SHIFT 6 15*4882a593Smuzhiyun #define MAX_COPY_PREFETCH 4 16*4882a593Smuzhiyun #define IFETCH_ALIGN_SHIFT 3 17*4882a593Smuzhiyun #elif defined(CONFIG_PPC32) 18*4882a593Smuzhiyun #define MAX_COPY_PREFETCH 4 19*4882a593Smuzhiyun #define IFETCH_ALIGN_SHIFT 3 /* 603 fetches 2 insn at a time */ 20*4882a593Smuzhiyun #if defined(CONFIG_PPC_47x) 21*4882a593Smuzhiyun #define L1_CACHE_SHIFT 7 22*4882a593Smuzhiyun #else 23*4882a593Smuzhiyun #define L1_CACHE_SHIFT 5 24*4882a593Smuzhiyun #endif 25*4882a593Smuzhiyun #else /* CONFIG_PPC64 */ 26*4882a593Smuzhiyun #define L1_CACHE_SHIFT 7 27*4882a593Smuzhiyun #define IFETCH_ALIGN_SHIFT 4 /* POWER8,9 */ 28*4882a593Smuzhiyun #endif 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define SMP_CACHE_BYTES L1_CACHE_BYTES 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #define IFETCH_ALIGN_BYTES (1 << IFETCH_ALIGN_SHIFT) 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #if !defined(__ASSEMBLY__) 37*4882a593Smuzhiyun #ifdef CONFIG_PPC64 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun struct ppc_cache_info { 40*4882a593Smuzhiyun u32 size; 41*4882a593Smuzhiyun u32 line_size; 42*4882a593Smuzhiyun u32 block_size; /* L1 only */ 43*4882a593Smuzhiyun u32 log_block_size; 44*4882a593Smuzhiyun u32 blocks_per_page; 45*4882a593Smuzhiyun u32 sets; 46*4882a593Smuzhiyun u32 assoc; 47*4882a593Smuzhiyun }; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun struct ppc64_caches { 50*4882a593Smuzhiyun struct ppc_cache_info l1d; 51*4882a593Smuzhiyun struct ppc_cache_info l1i; 52*4882a593Smuzhiyun struct ppc_cache_info l2; 53*4882a593Smuzhiyun struct ppc_cache_info l3; 54*4882a593Smuzhiyun }; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun extern struct ppc64_caches ppc64_caches; 57*4882a593Smuzhiyun l1_dcache_shift(void)58*4882a593Smuzhiyunstatic inline u32 l1_dcache_shift(void) 59*4882a593Smuzhiyun { 60*4882a593Smuzhiyun return ppc64_caches.l1d.log_block_size; 61*4882a593Smuzhiyun } 62*4882a593Smuzhiyun l1_dcache_bytes(void)63*4882a593Smuzhiyunstatic inline u32 l1_dcache_bytes(void) 64*4882a593Smuzhiyun { 65*4882a593Smuzhiyun return ppc64_caches.l1d.block_size; 66*4882a593Smuzhiyun } 67*4882a593Smuzhiyun l1_icache_shift(void)68*4882a593Smuzhiyunstatic inline u32 l1_icache_shift(void) 69*4882a593Smuzhiyun { 70*4882a593Smuzhiyun return ppc64_caches.l1i.log_block_size; 71*4882a593Smuzhiyun } 72*4882a593Smuzhiyun l1_icache_bytes(void)73*4882a593Smuzhiyunstatic inline u32 l1_icache_bytes(void) 74*4882a593Smuzhiyun { 75*4882a593Smuzhiyun return ppc64_caches.l1i.block_size; 76*4882a593Smuzhiyun } 77*4882a593Smuzhiyun #else l1_dcache_shift(void)78*4882a593Smuzhiyunstatic inline u32 l1_dcache_shift(void) 79*4882a593Smuzhiyun { 80*4882a593Smuzhiyun return L1_CACHE_SHIFT; 81*4882a593Smuzhiyun } 82*4882a593Smuzhiyun l1_dcache_bytes(void)83*4882a593Smuzhiyunstatic inline u32 l1_dcache_bytes(void) 84*4882a593Smuzhiyun { 85*4882a593Smuzhiyun return L1_CACHE_BYTES; 86*4882a593Smuzhiyun } 87*4882a593Smuzhiyun l1_icache_shift(void)88*4882a593Smuzhiyunstatic inline u32 l1_icache_shift(void) 89*4882a593Smuzhiyun { 90*4882a593Smuzhiyun return L1_CACHE_SHIFT; 91*4882a593Smuzhiyun } 92*4882a593Smuzhiyun l1_icache_bytes(void)93*4882a593Smuzhiyunstatic inline u32 l1_icache_bytes(void) 94*4882a593Smuzhiyun { 95*4882a593Smuzhiyun return L1_CACHE_BYTES; 96*4882a593Smuzhiyun } 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun #endif 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun #define __read_mostly __section(".data..read_mostly") 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun #ifdef CONFIG_PPC_BOOK3S_32 103*4882a593Smuzhiyun extern long _get_L2CR(void); 104*4882a593Smuzhiyun extern long _get_L3CR(void); 105*4882a593Smuzhiyun extern void _set_L2CR(unsigned long); 106*4882a593Smuzhiyun extern void _set_L3CR(unsigned long); 107*4882a593Smuzhiyun #else 108*4882a593Smuzhiyun #define _get_L2CR() 0L 109*4882a593Smuzhiyun #define _get_L3CR() 0L 110*4882a593Smuzhiyun #define _set_L2CR(val) do { } while(0) 111*4882a593Smuzhiyun #define _set_L3CR(val) do { } while(0) 112*4882a593Smuzhiyun #endif 113*4882a593Smuzhiyun dcbz(void * addr)114*4882a593Smuzhiyunstatic inline void dcbz(void *addr) 115*4882a593Smuzhiyun { 116*4882a593Smuzhiyun __asm__ __volatile__ ("dcbz 0, %0" : : "r"(addr) : "memory"); 117*4882a593Smuzhiyun } 118*4882a593Smuzhiyun dcbi(void * addr)119*4882a593Smuzhiyunstatic inline void dcbi(void *addr) 120*4882a593Smuzhiyun { 121*4882a593Smuzhiyun __asm__ __volatile__ ("dcbi 0, %0" : : "r"(addr) : "memory"); 122*4882a593Smuzhiyun } 123*4882a593Smuzhiyun dcbf(void * addr)124*4882a593Smuzhiyunstatic inline void dcbf(void *addr) 125*4882a593Smuzhiyun { 126*4882a593Smuzhiyun __asm__ __volatile__ ("dcbf 0, %0" : : "r"(addr) : "memory"); 127*4882a593Smuzhiyun } 128*4882a593Smuzhiyun dcbst(void * addr)129*4882a593Smuzhiyunstatic inline void dcbst(void *addr) 130*4882a593Smuzhiyun { 131*4882a593Smuzhiyun __asm__ __volatile__ ("dcbst 0, %0" : : "r"(addr) : "memory"); 132*4882a593Smuzhiyun } 133*4882a593Smuzhiyun icbi(void * addr)134*4882a593Smuzhiyunstatic inline void icbi(void *addr) 135*4882a593Smuzhiyun { 136*4882a593Smuzhiyun asm volatile ("icbi 0, %0" : : "r"(addr) : "memory"); 137*4882a593Smuzhiyun } 138*4882a593Smuzhiyun iccci(void * addr)139*4882a593Smuzhiyunstatic inline void iccci(void *addr) 140*4882a593Smuzhiyun { 141*4882a593Smuzhiyun asm volatile ("iccci 0, %0" : : "r"(addr) : "memory"); 142*4882a593Smuzhiyun } 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun #endif /* !__ASSEMBLY__ */ 145*4882a593Smuzhiyun #endif /* __KERNEL__ */ 146*4882a593Smuzhiyun #endif /* _ASM_POWERPC_CACHE_H */ 147