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