1/*
2 * SPDX-License-Identifier: BSD-3-Clause
3 * SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
4 */
5
6#include <arch.h>
7#include <asm_macros.S>
8
9	.globl	flush_dcache_range
10	.globl	clean_dcache_range
11	.globl	inv_dcache_range
12
13/*
14 * This macro can be used for implementing various data cache operations `op`
15 */
16.macro do_dcache_maintenance_by_mva op
17	/* Exit early if size is zero */
18	cbz	x1, exit_loop_\op
19	dcache_line_size x2, x3
20	add	x1, x0, x1
21	sub	x3, x2, #1
22	bic	x0, x0, x3
23loop_\op:
24	dc	\op, x0
25	add	x0, x0, x2
26	cmp	x0, x1
27	b.lo	loop_\op
28	dsb	sy
29exit_loop_\op:
30	ret
31.endm
32	/* ------------------------------------------
33	 * Clean+Invalidate from base address till
34	 * size. 'x0' = addr, 'x1' = size
35	 * ------------------------------------------
36	 */
37func flush_dcache_range
38	do_dcache_maintenance_by_mva civac
39endfunc flush_dcache_range
40
41	/* ------------------------------------------
42	 * Clean from base address till size.
43	 * 'x0' = addr, 'x1' = size
44	 * ------------------------------------------
45	 */
46func clean_dcache_range
47	do_dcache_maintenance_by_mva cvac
48endfunc clean_dcache_range
49
50	/* ------------------------------------------
51	 * Invalidate from base address till
52	 * size. 'x0' = addr, 'x1' = size
53	 * ------------------------------------------
54	 */
55func inv_dcache_range
56	do_dcache_maintenance_by_mva ivac
57endfunc inv_dcache_range
58