0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/linkage.h>
0012 #include <linux/init.h>
0013 #include <asm/assembler.h>
0014 #include <asm/page.h>
0015 #include "proc-macros.S"
0016
0017
0018
0019
0020 #define CACHE_DLINESIZE 32
0021
0022
0023
0024
0025 #define CACHE_DSEGMENTS 8
0026
0027
0028
0029
0030 #define CACHE_DENTRIES 64
0031
0032
0033
0034
0035
0036
0037
0038
0039 #define CACHE_DLIMIT 16384
0040
0041
0042
0043
0044
0045
0046 ENTRY(v4wt_flush_icache_all)
0047 mov r0, #0
0048 mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache
0049 ret lr
0050 ENDPROC(v4wt_flush_icache_all)
0051
0052
0053
0054
0055
0056
0057
0058 ENTRY(v4wt_flush_user_cache_all)
0059
0060
0061
0062
0063
0064
0065 ENTRY(v4wt_flush_kern_cache_all)
0066 mov r2, #VM_EXEC
0067 mov ip, #0
0068 __flush_whole_cache:
0069 tst r2, #VM_EXEC
0070 mcrne p15, 0, ip, c7, c5, 0 @ invalidate I cache
0071 mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache
0072 ret lr
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084 ENTRY(v4wt_flush_user_cache_range)
0085 sub r3, r1, r0 @ calculate total size
0086 cmp r3, #CACHE_DLIMIT
0087 bhs __flush_whole_cache
0088
0089 1: mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry
0090 tst r2, #VM_EXEC
0091 mcrne p15, 0, r0, c7, c5, 1 @ invalidate I entry
0092 add r0, r0, #CACHE_DLINESIZE
0093 cmp r0, r1
0094 blo 1b
0095 ret lr
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107 ENTRY(v4wt_coherent_kern_range)
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120 ENTRY(v4wt_coherent_user_range)
0121 bic r0, r0, #CACHE_DLINESIZE - 1
0122 1: mcr p15, 0, r0, c7, c5, 1 @ invalidate I entry
0123 add r0, r0, #CACHE_DLINESIZE
0124 cmp r0, r1
0125 blo 1b
0126 mov r0, #0
0127 ret lr
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138 ENTRY(v4wt_flush_kern_dcache_area)
0139 mov r2, #0
0140 mcr p15, 0, r2, c7, c5, 0 @ invalidate I cache
0141 add r1, r0, r1
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155 v4wt_dma_inv_range:
0156 bic r0, r0, #CACHE_DLINESIZE - 1
0157 1: mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry
0158 add r0, r0, #CACHE_DLINESIZE
0159 cmp r0, r1
0160 blo 1b
0161 ret lr
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171 .globl v4wt_dma_flush_range
0172 .equ v4wt_dma_flush_range, v4wt_dma_inv_range
0173
0174
0175
0176
0177
0178
0179
0180 ENTRY(v4wt_dma_unmap_area)
0181 add r1, r1, r0
0182 teq r2, #DMA_TO_DEVICE
0183 bne v4wt_dma_inv_range
0184
0185
0186
0187
0188
0189
0190
0191
0192 ENTRY(v4wt_dma_map_area)
0193 ret lr
0194 ENDPROC(v4wt_dma_unmap_area)
0195 ENDPROC(v4wt_dma_map_area)
0196
0197 .globl v4wt_flush_kern_cache_louis
0198 .equ v4wt_flush_kern_cache_louis, v4wt_flush_kern_cache_all
0199
0200 __INITDATA
0201
0202 @ define struct cpu_cache_fns (see <asm/cacheflush.h> and proc-macros.S)
0203 define_cache_functions v4wt