| /* |
| * SPDX-License-Identifier: BSD-3-Clause |
| * SPDX-FileCopyrightText: Copyright TF-RMM Contributors. |
| */ |
| |
| #include <arch.h> |
| #include <asm_macros.S> |
| |
| .globl flush_dcache_range |
| .globl clean_dcache_range |
| .globl inv_dcache_range |
| .globl flush_dcache_range_to_poe |
| |
| /* |
| * sys #4, c7, c14, #0, x0 |
| * DC CIPAE, X0 |
| */ |
| #define dc_cipae_x0 0xd50c7e00 |
| |
| /* |
| * This macro can be used for implementing various data cache operations `op` |
| */ |
| .macro do_dcache_maintenance_by_mva op |
| /* Exit early if size is zero */ |
| cbz x1, exit_loop_\op |
| dcache_line_size x2, x3 |
| add x1, x0, x1 |
| sub x3, x2, #1 |
| bic x0, x0, x3 |
| loop_\op: |
| dc \op, x0 |
| add x0, x0, x2 |
| cmp x0, x1 |
| b.lo loop_\op |
| dsb sy |
| exit_loop_\op: |
| ret |
| .endm |
| |
| /* op: the hexadecimal instruction opcode for the cache operation */ |
| .macro do_dcache_maintenance_instr op |
| /* Exit early if size is zero */ |
| cbz x1, exit_loop_\op |
| dcache_line_size x2, x3 |
| add x1, x0, x1 |
| sub x3, x2, #1 |
| bic x0, x0, x3 |
| loop_\op: |
| .inst \op |
| add x0, x0, x2 |
| cmp x0, x1 |
| b.lo loop_\op |
| dsb sy |
| exit_loop_\op: |
| ret |
| .endm |
| |
| /* ------------------------------------------ |
| * Clean+Invalidate from base address till |
| * size. 'x0' = addr, 'x1' = size |
| * ------------------------------------------ |
| */ |
| func flush_dcache_range |
| do_dcache_maintenance_by_mva civac |
| endfunc flush_dcache_range |
| |
| /* ------------------------------------------ |
| * Clean from base address till size. |
| * 'x0' = addr, 'x1' = size |
| * ------------------------------------------ |
| */ |
| func clean_dcache_range |
| do_dcache_maintenance_by_mva cvac |
| endfunc clean_dcache_range |
| |
| /* ------------------------------------------ |
| * Invalidate from base address till |
| * size. 'x0' = addr, 'x1' = size |
| * ------------------------------------------ |
| */ |
| func inv_dcache_range |
| do_dcache_maintenance_by_mva ivac |
| endfunc inv_dcache_range |
| |
| /* ------------------------------------------ |
| * Clean and invalidate to point of |
| * encryption from base address till size. |
| * 'x0' = physical addr, 'x1' = size |
| * ------------------------------------------ |
| */ |
| func flush_dcache_range_to_poe |
| do_dcache_maintenance_instr dc_cipae_x0 |
| endfunc flush_dcache_range_to_poe |