0001
0002 #ifndef _ASM_POWERPC_CACHE_H
0003 #define _ASM_POWERPC_CACHE_H
0004
0005 #ifdef __KERNEL__
0006
0007
0008
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
0020 #if defined(CONFIG_PPC_47x)
0021 #define L1_CACHE_SHIFT 7
0022 #else
0023 #define L1_CACHE_SHIFT 5
0024 #endif
0025 #else
0026 #define L1_CACHE_SHIFT 7
0027 #define IFETCH_ALIGN_SHIFT 4
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;
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
0145 #endif
0146 #endif