0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #include <linux/linkage.h>
0014 #include <linux/init.h>
0015 #include <asm/assembler.h>
0016 #include <asm/memory.h>
0017 #include <asm/page.h>
0018
0019 #include "proc-macros.S"
0020
0021
0022
0023
0024 #define CACHE_DLINESIZE 16
0025
0026
0027
0028
0029 #ifdef CONFIG_ARCH_GEMINI
0030 #define CACHE_DSIZE 8192
0031 #else
0032 #define CACHE_DSIZE 16384
0033 #endif
0034
0035
0036 #define CACHE_DLIMIT (CACHE_DSIZE * 2)
0037
0038
0039
0040
0041
0042
0043 ENTRY(fa_flush_icache_all)
0044 mov r0, #0
0045 mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache
0046 ret lr
0047 ENDPROC(fa_flush_icache_all)
0048
0049
0050
0051
0052
0053
0054
0055 ENTRY(fa_flush_user_cache_all)
0056
0057
0058
0059
0060
0061
0062 ENTRY(fa_flush_kern_cache_all)
0063 mov ip, #0
0064 mov r2, #VM_EXEC
0065 __flush_whole_cache:
0066 mcr p15, 0, ip, c7, c14, 0 @ clean/invalidate D cache
0067 tst r2, #VM_EXEC
0068 mcrne p15, 0, ip, c7, c5, 0 @ invalidate I cache
0069 mcrne p15, 0, ip, c7, c5, 6 @ invalidate BTB
0070 mcrne p15, 0, ip, c7, c10, 4 @ drain write buffer
0071 mcrne p15, 0, ip, c7, c5, 4 @ prefetch flush
0072 ret lr
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084 ENTRY(fa_flush_user_cache_range)
0085 mov ip, #0
0086 sub r3, r1, r0 @ calculate total size
0087 cmp r3, #CACHE_DLIMIT @ total size >= limit?
0088 bhs __flush_whole_cache @ flush whole D cache
0089
0090 1: tst r2, #VM_EXEC
0091 mcrne p15, 0, r0, c7, c5, 1 @ invalidate I line
0092 mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D entry
0093 add r0, r0, #CACHE_DLINESIZE
0094 cmp r0, r1
0095 blo 1b
0096 tst r2, #VM_EXEC
0097 mcrne p15, 0, ip, c7, c5, 6 @ invalidate BTB
0098 mcrne p15, 0, ip, c7, c10, 4 @ data write barrier
0099 mcrne p15, 0, ip, c7, c5, 4 @ prefetch flush
0100 ret lr
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112 ENTRY(fa_coherent_kern_range)
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125 ENTRY(fa_coherent_user_range)
0126 bic r0, r0, #CACHE_DLINESIZE - 1
0127 1: mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D entry
0128 mcr p15, 0, r0, c7, c5, 1 @ invalidate I entry
0129 add r0, r0, #CACHE_DLINESIZE
0130 cmp r0, r1
0131 blo 1b
0132 mov r0, #0
0133 mcr p15, 0, r0, c7, c5, 6 @ invalidate BTB
0134 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer
0135 mcr p15, 0, r0, c7, c5, 4 @ prefetch flush
0136 ret lr
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147 ENTRY(fa_flush_kern_dcache_area)
0148 add r1, r0, r1
0149 1: mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D line
0150 add r0, r0, #CACHE_DLINESIZE
0151 cmp r0, r1
0152 blo 1b
0153 mov r0, #0
0154 mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache
0155 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer
0156 ret lr
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169 fa_dma_inv_range:
0170 tst r0, #CACHE_DLINESIZE - 1
0171 bic r0, r0, #CACHE_DLINESIZE - 1
0172 mcrne p15, 0, r0, c7, c14, 1 @ clean & invalidate D entry
0173 tst r1, #CACHE_DLINESIZE - 1
0174 bic r1, r1, #CACHE_DLINESIZE - 1
0175 mcrne p15, 0, r1, c7, c14, 1 @ clean & invalidate D entry
0176 1: mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry
0177 add r0, r0, #CACHE_DLINESIZE
0178 cmp r0, r1
0179 blo 1b
0180 mov r0, #0
0181 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer
0182 ret lr
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192 fa_dma_clean_range:
0193 bic r0, r0, #CACHE_DLINESIZE - 1
0194 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry
0195 add r0, r0, #CACHE_DLINESIZE
0196 cmp r0, r1
0197 blo 1b
0198 mov r0, #0
0199 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer
0200 ret lr
0201
0202
0203
0204
0205
0206
0207 ENTRY(fa_dma_flush_range)
0208 bic r0, r0, #CACHE_DLINESIZE - 1
0209 1: mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D entry
0210 add r0, r0, #CACHE_DLINESIZE
0211 cmp r0, r1
0212 blo 1b
0213 mov r0, #0
0214 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer
0215 ret lr
0216
0217
0218
0219
0220
0221
0222
0223 ENTRY(fa_dma_map_area)
0224 add r1, r1, r0
0225 cmp r2, #DMA_TO_DEVICE
0226 beq fa_dma_clean_range
0227 bcs fa_dma_inv_range
0228 b fa_dma_flush_range
0229 ENDPROC(fa_dma_map_area)
0230
0231
0232
0233
0234
0235
0236
0237 ENTRY(fa_dma_unmap_area)
0238 ret lr
0239 ENDPROC(fa_dma_unmap_area)
0240
0241 .globl fa_flush_kern_cache_louis
0242 .equ fa_flush_kern_cache_louis, fa_flush_kern_cache_all
0243
0244 __INITDATA
0245
0246 @ define struct cpu_cache_fns (see <asm/cacheflush.h> and proc-macros.S)
0247 define_cache_functions fa