1/*
2 * Copyright (c) 2016-2017, 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
22typedef struct mem_region_t {
23	uintptr_t base;
24	size_t nbytes;
25} mem_region_t;
26
27/*
28 * zero_normalmem all the regions defined in tbl.
29 */
30void clear_mem_regions(mem_region_t *tbl, size_t nregions);
31
32
33/*
34 * checks that a region (addr + nbytes-1) of memory is totally covered by
35 * one of the regions defined in tbl. Caller must ensure that (addr+nbytes-1)
36 * doesn't overflow.
37 */
38int mem_region_in_array_chk(mem_region_t *tbl, size_t nregions,
39			    uintptr_t addr, size_t nbytes);
40
41/*
42 * Fill a region of normal memory of size "length" in bytes with zero bytes.
43 *
44 * WARNING: This function can only operate on normal memory. This means that
45 *          the MMU must be enabled when using this function. Otherwise, use
46 *          zeromem.
47 */
48void zero_normalmem(void *mem, u_register_t length);
49
50/*
51 * Fill a region of memory of size "length" in bytes with null bytes.
52 *
53 * Unlike zero_normalmem, this function has no restriction on the type of
54 * memory targeted and can be used for any device memory as well as normal
55 * memory. This function must be used instead of zero_normalmem when MMU is
56 * disabled.
57 *
58 * NOTE: When data cache and MMU are enabled, prefer zero_normalmem for faster
59 *       zeroing.
60 */
61void zeromem(void *mem, u_register_t length);
62#endif /* !(defined(__LINKER__) || defined(__ASSEMBLY__)) */
63
64#endif /* __UTILS_H__ */
65