aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mm/cache-v4wb.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mm/cache-v4wb.S')
-rw-r--r--arch/arm/mm/cache-v4wb.S43
1 files changed, 34 insertions, 9 deletions
diff --git a/arch/arm/mm/cache-v4wb.S b/arch/arm/mm/cache-v4wb.S
index 2ebc1b3bf856..df8368afa102 100644
--- a/arch/arm/mm/cache-v4wb.S
+++ b/arch/arm/mm/cache-v4wb.S
@@ -114,15 +114,16 @@ ENTRY(v4wb_flush_user_cache_range)
114 mov pc, lr 114 mov pc, lr
115 115
116/* 116/*
117 * flush_kern_dcache_page(void *page) 117 * flush_kern_dcache_area(void *addr, size_t size)
118 * 118 *
119 * Ensure no D cache aliasing occurs, either with itself or 119 * Ensure no D cache aliasing occurs, either with itself or
120 * the I cache 120 * the I cache
121 * 121 *
122 * - addr - page aligned address 122 * - addr - kernel address
123 * - size - region size
123 */ 124 */
124ENTRY(v4wb_flush_kern_dcache_page) 125ENTRY(v4wb_flush_kern_dcache_area)
125 add r1, r0, #PAGE_SZ 126 add r1, r0, r1
126 /* fall through */ 127 /* fall through */
127 128
128/* 129/*
@@ -172,7 +173,7 @@ ENTRY(v4wb_coherent_user_range)
172 * - start - virtual start address 173 * - start - virtual start address
173 * - end - virtual end address 174 * - end - virtual end address
174 */ 175 */
175ENTRY(v4wb_dma_inv_range) 176v4wb_dma_inv_range:
176 tst r0, #CACHE_DLINESIZE - 1 177 tst r0, #CACHE_DLINESIZE - 1
177 bic r0, r0, #CACHE_DLINESIZE - 1 178 bic r0, r0, #CACHE_DLINESIZE - 1
178 mcrne p15, 0, r0, c7, c10, 1 @ clean D entry 179 mcrne p15, 0, r0, c7, c10, 1 @ clean D entry
@@ -193,7 +194,7 @@ ENTRY(v4wb_dma_inv_range)
193 * - start - virtual start address 194 * - start - virtual start address
194 * - end - virtual end address 195 * - end - virtual end address
195 */ 196 */
196ENTRY(v4wb_dma_clean_range) 197v4wb_dma_clean_range:
197 bic r0, r0, #CACHE_DLINESIZE - 1 198 bic r0, r0, #CACHE_DLINESIZE - 1
1981: mcr p15, 0, r0, c7, c10, 1 @ clean D entry 1991: mcr p15, 0, r0, c7, c10, 1 @ clean D entry
199 add r0, r0, #CACHE_DLINESIZE 200 add r0, r0, #CACHE_DLINESIZE
@@ -215,6 +216,30 @@ ENTRY(v4wb_dma_clean_range)
215 .globl v4wb_dma_flush_range 216 .globl v4wb_dma_flush_range
216 .set v4wb_dma_flush_range, v4wb_coherent_kern_range 217 .set v4wb_dma_flush_range, v4wb_coherent_kern_range
217 218
219/*
220 * dma_map_area(start, size, dir)
221 * - start - kernel virtual start address
222 * - size - size of region
223 * - dir - DMA direction
224 */
225ENTRY(v4wb_dma_map_area)
226 add r1, r1, r0
227 cmp r2, #DMA_TO_DEVICE
228 beq v4wb_dma_clean_range
229 bcs v4wb_dma_inv_range
230 b v4wb_dma_flush_range
231ENDPROC(v4wb_dma_map_area)
232
233/*
234 * dma_unmap_area(start, size, dir)
235 * - start - kernel virtual start address
236 * - size - size of region
237 * - dir - DMA direction
238 */
239ENTRY(v4wb_dma_unmap_area)
240 mov pc, lr
241ENDPROC(v4wb_dma_unmap_area)
242
218 __INITDATA 243 __INITDATA
219 244
220 .type v4wb_cache_fns, #object 245 .type v4wb_cache_fns, #object
@@ -224,8 +249,8 @@ ENTRY(v4wb_cache_fns)
224 .long v4wb_flush_user_cache_range 249 .long v4wb_flush_user_cache_range
225 .long v4wb_coherent_kern_range 250 .long v4wb_coherent_kern_range
226 .long v4wb_coherent_user_range 251 .long v4wb_coherent_user_range
227 .long v4wb_flush_kern_dcache_page 252 .long v4wb_flush_kern_dcache_area
228 .long v4wb_dma_inv_range 253 .long v4wb_dma_map_area
229 .long v4wb_dma_clean_range 254 .long v4wb_dma_unmap_area
230 .long v4wb_dma_flush_range 255 .long v4wb_dma_flush_range
231 .size v4wb_cache_fns, . - v4wb_cache_fns 256 .size v4wb_cache_fns, . - v4wb_cache_fns