diff options
Diffstat (limited to 'arch/arm/mm/cache-v7.S')
-rw-r--r-- | arch/arm/mm/cache-v7.S | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S index e1bd9759617f..06a90dcfc60a 100644 --- a/arch/arm/mm/cache-v7.S +++ b/arch/arm/mm/cache-v7.S | |||
@@ -167,7 +167,11 @@ ENTRY(v7_coherent_user_range) | |||
167 | cmp r0, r1 | 167 | cmp r0, r1 |
168 | blo 1b | 168 | blo 1b |
169 | mov r0, #0 | 169 | mov r0, #0 |
170 | #ifdef CONFIG_SMP | ||
171 | mcr p15, 0, r0, c7, c1, 6 @ invalidate BTB Inner Shareable | ||
172 | #else | ||
170 | mcr p15, 0, r0, c7, c5, 6 @ invalidate BTB | 173 | mcr p15, 0, r0, c7, c5, 6 @ invalidate BTB |
174 | #endif | ||
171 | dsb | 175 | dsb |
172 | isb | 176 | isb |
173 | mov pc, lr | 177 | mov pc, lr |
@@ -186,16 +190,17 @@ ENDPROC(v7_coherent_kern_range) | |||
186 | ENDPROC(v7_coherent_user_range) | 190 | ENDPROC(v7_coherent_user_range) |
187 | 191 | ||
188 | /* | 192 | /* |
189 | * v7_flush_kern_dcache_page(kaddr) | 193 | * v7_flush_kern_dcache_area(void *addr, size_t size) |
190 | * | 194 | * |
191 | * Ensure that the data held in the page kaddr is written back | 195 | * Ensure that the data held in the page kaddr is written back |
192 | * to the page in question. | 196 | * to the page in question. |
193 | * | 197 | * |
194 | * - kaddr - kernel address (guaranteed to be page aligned) | 198 | * - addr - kernel address |
199 | * - size - region size | ||
195 | */ | 200 | */ |
196 | ENTRY(v7_flush_kern_dcache_page) | 201 | ENTRY(v7_flush_kern_dcache_area) |
197 | dcache_line_size r2, r3 | 202 | dcache_line_size r2, r3 |
198 | add r1, r0, #PAGE_SZ | 203 | add r1, r0, r1 |
199 | 1: | 204 | 1: |
200 | mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D line / unified line | 205 | mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D line / unified line |
201 | add r0, r0, r2 | 206 | add r0, r0, r2 |
@@ -203,7 +208,7 @@ ENTRY(v7_flush_kern_dcache_page) | |||
203 | blo 1b | 208 | blo 1b |
204 | dsb | 209 | dsb |
205 | mov pc, lr | 210 | mov pc, lr |
206 | ENDPROC(v7_flush_kern_dcache_page) | 211 | ENDPROC(v7_flush_kern_dcache_area) |
207 | 212 | ||
208 | /* | 213 | /* |
209 | * v7_dma_inv_range(start,end) | 214 | * v7_dma_inv_range(start,end) |
@@ -215,7 +220,7 @@ ENDPROC(v7_flush_kern_dcache_page) | |||
215 | * - start - virtual start address of region | 220 | * - start - virtual start address of region |
216 | * - end - virtual end address of region | 221 | * - end - virtual end address of region |
217 | */ | 222 | */ |
218 | ENTRY(v7_dma_inv_range) | 223 | v7_dma_inv_range: |
219 | dcache_line_size r2, r3 | 224 | dcache_line_size r2, r3 |
220 | sub r3, r2, #1 | 225 | sub r3, r2, #1 |
221 | tst r0, r3 | 226 | tst r0, r3 |
@@ -239,7 +244,7 @@ ENDPROC(v7_dma_inv_range) | |||
239 | * - start - virtual start address of region | 244 | * - start - virtual start address of region |
240 | * - end - virtual end address of region | 245 | * - end - virtual end address of region |
241 | */ | 246 | */ |
242 | ENTRY(v7_dma_clean_range) | 247 | v7_dma_clean_range: |
243 | dcache_line_size r2, r3 | 248 | dcache_line_size r2, r3 |
244 | sub r3, r2, #1 | 249 | sub r3, r2, #1 |
245 | bic r0, r0, r3 | 250 | bic r0, r0, r3 |
@@ -270,6 +275,32 @@ ENTRY(v7_dma_flush_range) | |||
270 | mov pc, lr | 275 | mov pc, lr |
271 | ENDPROC(v7_dma_flush_range) | 276 | ENDPROC(v7_dma_flush_range) |
272 | 277 | ||
278 | /* | ||
279 | * dma_map_area(start, size, dir) | ||
280 | * - start - kernel virtual start address | ||
281 | * - size - size of region | ||
282 | * - dir - DMA direction | ||
283 | */ | ||
284 | ENTRY(v7_dma_map_area) | ||
285 | add r1, r1, r0 | ||
286 | teq r2, #DMA_FROM_DEVICE | ||
287 | beq v7_dma_inv_range | ||
288 | b v7_dma_clean_range | ||
289 | ENDPROC(v7_dma_map_area) | ||
290 | |||
291 | /* | ||
292 | * dma_unmap_area(start, size, dir) | ||
293 | * - start - kernel virtual start address | ||
294 | * - size - size of region | ||
295 | * - dir - DMA direction | ||
296 | */ | ||
297 | ENTRY(v7_dma_unmap_area) | ||
298 | add r1, r1, r0 | ||
299 | teq r2, #DMA_TO_DEVICE | ||
300 | bne v7_dma_inv_range | ||
301 | mov pc, lr | ||
302 | ENDPROC(v7_dma_unmap_area) | ||
303 | |||
273 | __INITDATA | 304 | __INITDATA |
274 | 305 | ||
275 | .type v7_cache_fns, #object | 306 | .type v7_cache_fns, #object |
@@ -279,8 +310,8 @@ ENTRY(v7_cache_fns) | |||
279 | .long v7_flush_user_cache_range | 310 | .long v7_flush_user_cache_range |
280 | .long v7_coherent_kern_range | 311 | .long v7_coherent_kern_range |
281 | .long v7_coherent_user_range | 312 | .long v7_coherent_user_range |
282 | .long v7_flush_kern_dcache_page | 313 | .long v7_flush_kern_dcache_area |
283 | .long v7_dma_inv_range | 314 | .long v7_dma_map_area |
284 | .long v7_dma_clean_range | 315 | .long v7_dma_unmap_area |
285 | .long v7_dma_flush_range | 316 | .long v7_dma_flush_range |
286 | .size v7_cache_fns, . - v7_cache_fns | 317 | .size v7_cache_fns, . - v7_cache_fns |