1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2b8b572e1SStephen Rothwell #ifndef _ASM_POWERPC_CACHE_H 3b8b572e1SStephen Rothwell #define _ASM_POWERPC_CACHE_H 4b8b572e1SStephen Rothwell 5b8b572e1SStephen Rothwell #ifdef __KERNEL__ 6b8b572e1SStephen Rothwell 7b8b572e1SStephen Rothwell 8b8b572e1SStephen Rothwell /* bytes per L1 cache line */ 9*1b5c0967SChristophe Leroy #if defined(CONFIG_PPC_8xx) 10b8b572e1SStephen Rothwell #define L1_CACHE_SHIFT 4 11b8b572e1SStephen Rothwell #define MAX_COPY_PREFETCH 1 121128bb78SChristophe Leroy #define IFETCH_ALIGN_SHIFT 2 13b8b572e1SStephen Rothwell #elif defined(CONFIG_PPC_E500MC) 14b8b572e1SStephen Rothwell #define L1_CACHE_SHIFT 6 15b8b572e1SStephen Rothwell #define MAX_COPY_PREFETCH 4 161128bb78SChristophe Leroy #define IFETCH_ALIGN_SHIFT 3 17b8b572e1SStephen Rothwell #elif defined(CONFIG_PPC32) 18b8b572e1SStephen Rothwell #define MAX_COPY_PREFETCH 4 191128bb78SChristophe Leroy #define IFETCH_ALIGN_SHIFT 3 /* 603 fetches 2 insn at a time */ 20e7f75ad0SDave Kleikamp #if defined(CONFIG_PPC_47x) 21e7f75ad0SDave Kleikamp #define L1_CACHE_SHIFT 7 22e7f75ad0SDave Kleikamp #else 23e7f75ad0SDave Kleikamp #define L1_CACHE_SHIFT 5 24e7f75ad0SDave Kleikamp #endif 25b8b572e1SStephen Rothwell #else /* CONFIG_PPC64 */ 26b8b572e1SStephen Rothwell #define L1_CACHE_SHIFT 7 27f4329f2eSNicholas Piggin #define IFETCH_ALIGN_SHIFT 4 /* POWER8,9 */ 28b8b572e1SStephen Rothwell #endif 29b8b572e1SStephen Rothwell 30b8b572e1SStephen Rothwell #define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) 31b8b572e1SStephen Rothwell 32b8b572e1SStephen Rothwell #define SMP_CACHE_BYTES L1_CACHE_BYTES 33b8b572e1SStephen Rothwell 34f4329f2eSNicholas Piggin #define IFETCH_ALIGN_BYTES (1 << IFETCH_ALIGN_SHIFT) 35f4329f2eSNicholas Piggin 36d98fc70fSChristophe Leroy #if !defined(__ASSEMBLY__) 37d98fc70fSChristophe Leroy #ifdef CONFIG_PPC64 38e2827fe5SBenjamin Herrenschmidt 39e2827fe5SBenjamin Herrenschmidt struct ppc_cache_info { 40e2827fe5SBenjamin Herrenschmidt u32 size; 41e2827fe5SBenjamin Herrenschmidt u32 line_size; 42e2827fe5SBenjamin Herrenschmidt u32 block_size; /* L1 only */ 43e2827fe5SBenjamin Herrenschmidt u32 log_block_size; 44e2827fe5SBenjamin Herrenschmidt u32 blocks_per_page; 45e2827fe5SBenjamin Herrenschmidt u32 sets; 4698a5f361SBenjamin Herrenschmidt u32 assoc; 47e2827fe5SBenjamin Herrenschmidt }; 48e2827fe5SBenjamin Herrenschmidt 49b8b572e1SStephen Rothwell struct ppc64_caches { 50e2827fe5SBenjamin Herrenschmidt struct ppc_cache_info l1d; 51e2827fe5SBenjamin Herrenschmidt struct ppc_cache_info l1i; 5265e01f38SBenjamin Herrenschmidt struct ppc_cache_info l2; 5365e01f38SBenjamin Herrenschmidt struct ppc_cache_info l3; 54b8b572e1SStephen Rothwell }; 55b8b572e1SStephen Rothwell 56b8b572e1SStephen Rothwell extern struct ppc64_caches ppc64_caches; 5722e9c88dSChristophe Leroy 587a0745c5SAlastair D'Silva static inline u32 l1_dcache_shift(void) 5922e9c88dSChristophe Leroy { 6022e9c88dSChristophe Leroy return ppc64_caches.l1d.log_block_size; 6122e9c88dSChristophe Leroy } 6222e9c88dSChristophe Leroy 637a0745c5SAlastair D'Silva static inline u32 l1_dcache_bytes(void) 6422e9c88dSChristophe Leroy { 6522e9c88dSChristophe Leroy return ppc64_caches.l1d.block_size; 6622e9c88dSChristophe Leroy } 677a0745c5SAlastair D'Silva 687a0745c5SAlastair D'Silva static inline u32 l1_icache_shift(void) 697a0745c5SAlastair D'Silva { 707a0745c5SAlastair D'Silva return ppc64_caches.l1i.log_block_size; 717a0745c5SAlastair D'Silva } 727a0745c5SAlastair D'Silva 737a0745c5SAlastair D'Silva static inline u32 l1_icache_bytes(void) 747a0745c5SAlastair D'Silva { 757a0745c5SAlastair D'Silva return ppc64_caches.l1i.block_size; 767a0745c5SAlastair D'Silva } 77d98fc70fSChristophe Leroy #else 787a0745c5SAlastair D'Silva static inline u32 l1_dcache_shift(void) 79d98fc70fSChristophe Leroy { 80d98fc70fSChristophe Leroy return L1_CACHE_SHIFT; 81d98fc70fSChristophe Leroy } 82d98fc70fSChristophe Leroy 837a0745c5SAlastair D'Silva static inline u32 l1_dcache_bytes(void) 84d98fc70fSChristophe Leroy { 85d98fc70fSChristophe Leroy return L1_CACHE_BYTES; 86d98fc70fSChristophe Leroy } 877a0745c5SAlastair D'Silva 887a0745c5SAlastair D'Silva static inline u32 l1_icache_shift(void) 897a0745c5SAlastair D'Silva { 907a0745c5SAlastair D'Silva return L1_CACHE_SHIFT; 917a0745c5SAlastair D'Silva } 927a0745c5SAlastair D'Silva 937a0745c5SAlastair D'Silva static inline u32 l1_icache_bytes(void) 947a0745c5SAlastair D'Silva { 957a0745c5SAlastair D'Silva return L1_CACHE_BYTES; 967a0745c5SAlastair D'Silva } 977a0745c5SAlastair D'Silva 98d98fc70fSChristophe Leroy #endif 99b8b572e1SStephen Rothwell 100a7032637SNick Desaulniers #define __read_mostly __section(.data..read_mostly) 101ae3a197eSDavid Howells 102d7cceda9SChristophe Leroy #ifdef CONFIG_PPC_BOOK3S_32 103ae3a197eSDavid Howells extern long _get_L2CR(void); 104ae3a197eSDavid Howells extern long _get_L3CR(void); 105ae3a197eSDavid Howells extern void _set_L2CR(unsigned long); 106ae3a197eSDavid Howells extern void _set_L3CR(unsigned long); 107ae3a197eSDavid Howells #else 108ae3a197eSDavid Howells #define _get_L2CR() 0L 109ae3a197eSDavid Howells #define _get_L3CR() 0L 110ae3a197eSDavid Howells #define _set_L2CR(val) do { } while(0) 111ae3a197eSDavid Howells #define _set_L3CR(val) do { } while(0) 112b8b572e1SStephen Rothwell #endif 113b8b572e1SStephen Rothwell 114d6bfa02fSChristophe Leroy static inline void dcbz(void *addr) 115d6bfa02fSChristophe Leroy { 116ed4289e8SMichael Ellerman __asm__ __volatile__ ("dcbz 0, %0" : : "r"(addr) : "memory"); 117d6bfa02fSChristophe Leroy } 118d6bfa02fSChristophe Leroy 119d6bfa02fSChristophe Leroy static inline void dcbi(void *addr) 120d6bfa02fSChristophe Leroy { 121ed4289e8SMichael Ellerman __asm__ __volatile__ ("dcbi 0, %0" : : "r"(addr) : "memory"); 122d6bfa02fSChristophe Leroy } 123d6bfa02fSChristophe Leroy 124d6bfa02fSChristophe Leroy static inline void dcbf(void *addr) 125d6bfa02fSChristophe Leroy { 126ed4289e8SMichael Ellerman __asm__ __volatile__ ("dcbf 0, %0" : : "r"(addr) : "memory"); 127d6bfa02fSChristophe Leroy } 128d6bfa02fSChristophe Leroy 129d6bfa02fSChristophe Leroy static inline void dcbst(void *addr) 130d6bfa02fSChristophe Leroy { 131ed4289e8SMichael Ellerman __asm__ __volatile__ ("dcbst 0, %0" : : "r"(addr) : "memory"); 132d6bfa02fSChristophe Leroy } 13323eb7f56SAlastair D'Silva 13423eb7f56SAlastair D'Silva static inline void icbi(void *addr) 13523eb7f56SAlastair D'Silva { 13623eb7f56SAlastair D'Silva asm volatile ("icbi 0, %0" : : "r"(addr) : "memory"); 13723eb7f56SAlastair D'Silva } 13823eb7f56SAlastair D'Silva 13923eb7f56SAlastair D'Silva static inline void iccci(void *addr) 14023eb7f56SAlastair D'Silva { 14123eb7f56SAlastair D'Silva asm volatile ("iccci 0, %0" : : "r"(addr) : "memory"); 14223eb7f56SAlastair D'Silva } 14323eb7f56SAlastair D'Silva 144ae3a197eSDavid Howells #endif /* !__ASSEMBLY__ */ 145b8b572e1SStephen Rothwell #endif /* __KERNEL__ */ 146b8b572e1SStephen Rothwell #endif /* _ASM_POWERPC_CACHE_H */ 147