|
@@ -105,19 +105,20 @@ ENTRY(__clean_dcache_area_pou)
|
|
|
ENDPROC(__clean_dcache_area_pou)
|
|
|
|
|
|
/*
|
|
|
- * __inval_cache_range(start, end)
|
|
|
- * - start - start address of region
|
|
|
- * - end - end address of region
|
|
|
+ * __dma_inv_area(start, size)
|
|
|
+ * - start - virtual start address of region
|
|
|
+ * - size - size in question
|
|
|
*/
|
|
|
-ENTRY(__inval_cache_range)
|
|
|
+__dma_inv_area:
|
|
|
+ add x1, x1, x0
|
|
|
/* FALLTHROUGH */
|
|
|
|
|
|
/*
|
|
|
- * __dma_inv_range(start, end)
|
|
|
- * - start - virtual start address of region
|
|
|
- * - end - virtual end address of region
|
|
|
+ * __inval_cache_range(start, end)
|
|
|
+ * - start - start address of region
|
|
|
+ * - end - end address of region
|
|
|
*/
|
|
|
-__dma_inv_range:
|
|
|
+ENTRY(__inval_cache_range)
|
|
|
dcache_line_size x2, x3
|
|
|
sub x3, x2, #1
|
|
|
tst x1, x3 // end cache line aligned?
|
|
@@ -136,46 +137,43 @@ __dma_inv_range:
|
|
|
dsb sy
|
|
|
ret
|
|
|
ENDPIPROC(__inval_cache_range)
|
|
|
-ENDPROC(__dma_inv_range)
|
|
|
+ENDPROC(__dma_inv_area)
|
|
|
+
|
|
|
+/*
|
|
|
+ * __clean_dcache_area_poc(kaddr, size)
|
|
|
+ *
|
|
|
+ * Ensure that any D-cache lines for the interval [kaddr, kaddr+size)
|
|
|
+ * are cleaned to the PoC.
|
|
|
+ *
|
|
|
+ * - kaddr - kernel address
|
|
|
+ * - size - size in question
|
|
|
+ */
|
|
|
+ENTRY(__clean_dcache_area_poc)
|
|
|
+ /* FALLTHROUGH */
|
|
|
|
|
|
/*
|
|
|
- * __dma_clean_range(start, end)
|
|
|
+ * __dma_clean_area(start, size)
|
|
|
* - start - virtual start address of region
|
|
|
- * - end - virtual end address of region
|
|
|
+ * - size - size in question
|
|
|
*/
|
|
|
-__dma_clean_range:
|
|
|
- dcache_line_size x2, x3
|
|
|
- sub x3, x2, #1
|
|
|
- bic x0, x0, x3
|
|
|
-1:
|
|
|
-alternative_if_not ARM64_WORKAROUND_CLEAN_CACHE
|
|
|
- dc cvac, x0
|
|
|
-alternative_else
|
|
|
- dc civac, x0
|
|
|
-alternative_endif
|
|
|
- add x0, x0, x2
|
|
|
- cmp x0, x1
|
|
|
- b.lo 1b
|
|
|
- dsb sy
|
|
|
+__dma_clean_area:
|
|
|
+ dcache_by_line_op cvac, sy, x0, x1, x2, x3
|
|
|
ret
|
|
|
-ENDPROC(__dma_clean_range)
|
|
|
+ENDPIPROC(__clean_dcache_area_poc)
|
|
|
+ENDPROC(__dma_clean_area)
|
|
|
|
|
|
/*
|
|
|
- * __dma_flush_range(start, end)
|
|
|
+ * __dma_flush_area(start, size)
|
|
|
+ *
|
|
|
+ * clean & invalidate D / U line
|
|
|
+ *
|
|
|
* - start - virtual start address of region
|
|
|
- * - end - virtual end address of region
|
|
|
+ * - size - size in question
|
|
|
*/
|
|
|
-ENTRY(__dma_flush_range)
|
|
|
- dcache_line_size x2, x3
|
|
|
- sub x3, x2, #1
|
|
|
- bic x0, x0, x3
|
|
|
-1: dc civac, x0 // clean & invalidate D / U line
|
|
|
- add x0, x0, x2
|
|
|
- cmp x0, x1
|
|
|
- b.lo 1b
|
|
|
- dsb sy
|
|
|
+ENTRY(__dma_flush_area)
|
|
|
+ dcache_by_line_op civac, sy, x0, x1, x2, x3
|
|
|
ret
|
|
|
-ENDPIPROC(__dma_flush_range)
|
|
|
+ENDPIPROC(__dma_flush_area)
|
|
|
|
|
|
/*
|
|
|
* __dma_map_area(start, size, dir)
|
|
@@ -184,10 +182,9 @@ ENDPIPROC(__dma_flush_range)
|
|
|
* - dir - DMA direction
|
|
|
*/
|
|
|
ENTRY(__dma_map_area)
|
|
|
- add x1, x1, x0
|
|
|
cmp w2, #DMA_FROM_DEVICE
|
|
|
- b.eq __dma_inv_range
|
|
|
- b __dma_clean_range
|
|
|
+ b.eq __dma_inv_area
|
|
|
+ b __dma_clean_area
|
|
|
ENDPIPROC(__dma_map_area)
|
|
|
|
|
|
/*
|
|
@@ -197,8 +194,7 @@ ENDPIPROC(__dma_map_area)
|
|
|
* - dir - DMA direction
|
|
|
*/
|
|
|
ENTRY(__dma_unmap_area)
|
|
|
- add x1, x1, x0
|
|
|
cmp w2, #DMA_TO_DEVICE
|
|
|
- b.ne __dma_inv_range
|
|
|
+ b.ne __dma_inv_area
|
|
|
ret
|
|
|
ENDPIPROC(__dma_unmap_area)
|