Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _ASM_POWERPC_CACHE_H
0003 #define _ASM_POWERPC_CACHE_H
0004 
0005 #ifdef __KERNEL__
0006 
0007 
0008 /* bytes per L1 cache line */
0009 #if defined(CONFIG_PPC_8xx)
0010 #define L1_CACHE_SHIFT      4
0011 #define MAX_COPY_PREFETCH   1
0012 #define IFETCH_ALIGN_SHIFT  2
0013 #elif defined(CONFIG_PPC_E500MC)
0014 #define L1_CACHE_SHIFT      6
0015 #define MAX_COPY_PREFETCH   4
0016 #define IFETCH_ALIGN_SHIFT  3
0017 #elif defined(CONFIG_PPC32)
0018 #define MAX_COPY_PREFETCH   4
0019 #define IFETCH_ALIGN_SHIFT  3   /* 603 fetches 2 insn at a time */
0020 #if defined(CONFIG_PPC_47x)
0021 #define L1_CACHE_SHIFT      7
0022 #else
0023 #define L1_CACHE_SHIFT      5
0024 #endif
0025 #else /* CONFIG_PPC64 */
0026 #define L1_CACHE_SHIFT      7
0027 #define IFETCH_ALIGN_SHIFT  4 /* POWER8,9 */
0028 #endif
0029 
0030 #define L1_CACHE_BYTES      (1 << L1_CACHE_SHIFT)
0031 
0032 #define SMP_CACHE_BYTES     L1_CACHE_BYTES
0033 
0034 #define IFETCH_ALIGN_BYTES  (1 << IFETCH_ALIGN_SHIFT)
0035 
0036 #if !defined(__ASSEMBLY__)
0037 #ifdef CONFIG_PPC64
0038 
0039 struct ppc_cache_info {
0040     u32 size;
0041     u32 line_size;
0042     u32 block_size; /* L1 only */
0043     u32 log_block_size;
0044     u32 blocks_per_page;
0045     u32 sets;
0046     u32 assoc;
0047 };
0048 
0049 struct ppc64_caches {
0050     struct ppc_cache_info l1d;
0051     struct ppc_cache_info l1i;
0052     struct ppc_cache_info l2;
0053     struct ppc_cache_info l3;
0054 };
0055 
0056 extern struct ppc64_caches ppc64_caches;
0057 
0058 static inline u32 l1_dcache_shift(void)
0059 {
0060     return ppc64_caches.l1d.log_block_size;
0061 }
0062 
0063 static inline u32 l1_dcache_bytes(void)
0064 {
0065     return ppc64_caches.l1d.block_size;
0066 }
0067 
0068 static inline u32 l1_icache_shift(void)
0069 {
0070     return ppc64_caches.l1i.log_block_size;
0071 }
0072 
0073 static inline u32 l1_icache_bytes(void)
0074 {
0075     return ppc64_caches.l1i.block_size;
0076 }
0077 #else
0078 static inline u32 l1_dcache_shift(void)
0079 {
0080     return L1_CACHE_SHIFT;
0081 }
0082 
0083 static inline u32 l1_dcache_bytes(void)
0084 {
0085     return L1_CACHE_BYTES;
0086 }
0087 
0088 static inline u32 l1_icache_shift(void)
0089 {
0090     return L1_CACHE_SHIFT;
0091 }
0092 
0093 static inline u32 l1_icache_bytes(void)
0094 {
0095     return L1_CACHE_BYTES;
0096 }
0097 
0098 #endif
0099 
0100 #define __read_mostly __section(".data..read_mostly")
0101 
0102 #ifdef CONFIG_PPC_BOOK3S_32
0103 extern long _get_L2CR(void);
0104 extern long _get_L3CR(void);
0105 extern void _set_L2CR(unsigned long);
0106 extern void _set_L3CR(unsigned long);
0107 #else
0108 #define _get_L2CR() 0L
0109 #define _get_L3CR() 0L
0110 #define _set_L2CR(val)  do { } while(0)
0111 #define _set_L3CR(val)  do { } while(0)
0112 #endif
0113 
0114 static inline void dcbz(void *addr)
0115 {
0116     __asm__ __volatile__ ("dcbz 0, %0" : : "r"(addr) : "memory");
0117 }
0118 
0119 static inline void dcbi(void *addr)
0120 {
0121     __asm__ __volatile__ ("dcbi 0, %0" : : "r"(addr) : "memory");
0122 }
0123 
0124 static inline void dcbf(void *addr)
0125 {
0126     __asm__ __volatile__ ("dcbf 0, %0" : : "r"(addr) : "memory");
0127 }
0128 
0129 static inline void dcbst(void *addr)
0130 {
0131     __asm__ __volatile__ ("dcbst 0, %0" : : "r"(addr) : "memory");
0132 }
0133 
0134 static inline void icbi(void *addr)
0135 {
0136     asm volatile ("icbi 0, %0" : : "r"(addr) : "memory");
0137 }
0138 
0139 static inline void iccci(void *addr)
0140 {
0141     asm volatile ("iccci 0, %0" : : "r"(addr) : "memory");
0142 }
0143 
0144 #endif /* !__ASSEMBLY__ */
0145 #endif /* __KERNEL__ */
0146 #endif /* _ASM_POWERPC_CACHE_H */