blob: bd7a6c4699c1b8eca38ab7d7a056ca697110c237 [file] [log] [blame]
/*
* 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