blob: 09ec8d99b39b4488ae315c71902c68c0fd64fe08 [file] [log] [blame]
Sandrine Bailleux7659a262016-07-05 09:55:03 +01001/*
Roberto Vargas550eb082018-01-05 16:00:05 +00002 * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
Sandrine Bailleux7659a262016-07-05 09:55:03 +01003 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Sandrine Bailleux7659a262016-07-05 09:55:03 +01005 */
6
7#ifndef __UTILS_H__
8#define __UTILS_H__
9
Scott Brandenbf404c02017-04-10 11:45:52 -070010#if !ERROR_DEPRECATED
11#include <utils_def.h>
David Cunado2e36de82017-01-19 10:26:16 +000012#endif
13
Douglas Raillard21362a92016-12-02 13:51:54 +000014/*
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
Antonio Nino Diaz4b32e622018-08-16 16:52:57 +010020#include <stdint.h>
Douglas Raillard21362a92016-12-02 13:51:54 +000021
Masahiro Yamadaff3ecb62018-01-16 23:15:38 +090022typedef struct mem_region {
Roberto Vargasc5907702017-08-03 08:56:38 +010023 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
Roberto Vargas550eb082018-01-05 16:00:05 +000032/*
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 */
Roberto Vargas85664f52018-02-12 12:36:17 +000040void clear_map_dyn_mem_regions(struct mem_region *regions,
Roberto Vargas550eb082018-01-05 16:00:05 +000041 size_t nregions,
42 uintptr_t va,
Roberto Vargas85664f52018-02-12 12:36:17 +000043 size_t chunk);
Roberto Vargasc5907702017-08-03 08:56:38 +010044
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 */
50int mem_region_in_array_chk(mem_region_t *tbl, size_t nregions,
51 uintptr_t addr, size_t nbytes);
52
Douglas Raillard21362a92016-12-02 13:51:54 +000053/*
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 */
60void 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 */
73void zeromem(void *mem, u_register_t length);
74#endif /* !(defined(__LINKER__) || defined(__ASSEMBLY__)) */
75
Sandrine Bailleux7659a262016-07-05 09:55:03 +010076#endif /* __UTILS_H__ */