xref: /rk3399_ARM-atf/include/lib/utils.h (revision 638b034cc34ecdc54b9c790d5192229a027c8156)
1 /*
2  * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef __UTILS_H__
8 #define __UTILS_H__
9 
10 #if !ERROR_DEPRECATED
11 #include <utils_def.h>
12 #endif
13 
14 /*
15  * C code should be put in this part of the header to avoid breaking ASM files
16  * or linker scripts including it.
17  */
18 #if !(defined(__LINKER__) || defined(__ASSEMBLY__))
19 
20 #include <types.h>
21 
22 typedef struct mem_region {
23 	uintptr_t base;
24 	size_t nbytes;
25 } mem_region_t;
26 
27 /*
28  * zero_normalmem all the regions defined in tbl.
29  */
30 void clear_mem_regions(mem_region_t *tbl, size_t nregions);
31 
32 /*
33  * zero_normalmem all the regions defined in region. It dynamically
34  * maps chunks of 'chunk_size' in 'va' virtual address and clears them.
35  * For this reason memory regions must be multiple of chunk_size and
36  * must be aligned to it as well. chunk_size and va can be selected
37  * in a way that they minimize the number of entries used in the
38  * translation tables.
39  */
40 void clear_map_dyn_mem_regions(mem_region_t *region,
41 			       size_t nregions,
42 			       uintptr_t va,
43 			       size_t chunk_size);
44 
45 /*
46  * checks that a region (addr + nbytes-1) of memory is totally covered by
47  * one of the regions defined in tbl. Caller must ensure that (addr+nbytes-1)
48  * doesn't overflow.
49  */
50 int mem_region_in_array_chk(mem_region_t *tbl, size_t nregions,
51 			    uintptr_t addr, size_t nbytes);
52 
53 /*
54  * Fill a region of normal memory of size "length" in bytes with zero bytes.
55  *
56  * WARNING: This function can only operate on normal memory. This means that
57  *          the MMU must be enabled when using this function. Otherwise, use
58  *          zeromem.
59  */
60 void zero_normalmem(void *mem, u_register_t length);
61 
62 /*
63  * Fill a region of memory of size "length" in bytes with null bytes.
64  *
65  * Unlike zero_normalmem, this function has no restriction on the type of
66  * memory targeted and can be used for any device memory as well as normal
67  * memory. This function must be used instead of zero_normalmem when MMU is
68  * disabled.
69  *
70  * NOTE: When data cache and MMU are enabled, prefer zero_normalmem for faster
71  *       zeroing.
72  */
73 void zeromem(void *mem, u_register_t length);
74 #endif /* !(defined(__LINKER__) || defined(__ASSEMBLY__)) */
75 
76 #endif /* __UTILS_H__ */
77