xlat_tables_v2.h 7.31 KB
Newer Older
1
/*
2
 * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3
 *
dp-arm's avatar
dp-arm committed
4
 * SPDX-License-Identifier: BSD-3-Clause
5
6
 */

7
8
#ifndef __XLAT_TABLES_V2_H__
#define __XLAT_TABLES_V2_H__
9

10
#include <xlat_tables_defs.h>
11
12

#ifndef __ASSEMBLY__
13
#include <stddef.h>
14
#include <stdint.h>
15
#include <xlat_mmu_helpers.h>
16
#include <xlat_tables_v2_helpers.h>
17

18
19
20
21
22
23
24
/*
 * Default granularity size for an mmap_region_t.
 * Useful when no specific granularity is required.
 *
 * By default, choose the biggest possible block size allowed by the
 * architectural state and granule size in order to minimize the number of page
 * tables required for the mapping.
25
 */
26
27
28
29
30
#define REGION_DEFAULT_GRANULARITY	XLAT_BLOCK_SIZE(MIN_LVL_BLOCK_DESC)

/* Helper macro to define an mmap_region_t. */
#define MAP_REGION(_pa, _va, _sz, _attr)	\
	_MAP_REGION_FULL_SPEC(_pa, _va, _sz, _attr, REGION_DEFAULT_GRANULARITY)
31

32
33
34
35
36
37
38
39
40
41
42
43
44
/* Helper macro to define an mmap_region_t with an identity mapping. */
#define MAP_REGION_FLAT(_adr, _sz, _attr)			\
	MAP_REGION(_adr, _adr, _sz, _attr)

/*
 * Helper macro to define an mmap_region_t to map with the desired granularity
 * of translation tables.
 *
 * The granularity value passed to this macro must be a valid block or page
 * size. When using a 4KB translation granule, this might be 4KB, 2MB or 1GB.
 * Passing REGION_DEFAULT_GRANULARITY is also allowed and means that the library
 * is free to choose the granularity for this region. In this case, it is
 * equivalent to the MAP_REGION() macro.
45
 */
46
47
#define MAP_REGION2(_pa, _va, _sz, _attr, _gr)			\
	_MAP_REGION_FULL_SPEC(_pa, _va, _sz, _attr, _gr)
48

49
/*
50
51
 * Shifts and masks to access fields of an mmap_attr_t
 */
52
#define MT_TYPE_MASK		U(0x7)
53
#define MT_TYPE(_attr)		((_attr) & MT_TYPE_MASK)
54
/* Access permissions (RO/RW) */
55
#define MT_PERM_SHIFT		U(3)
56
/* Security state (SECURE/NS) */
57
#define MT_SEC_SHIFT		U(4)
58
/* Access permissions for instruction execution (EXECUTE/EXECUTE_NEVER) */
59
#define MT_EXECUTE_SHIFT	U(5)
60
/* All other bits are reserved */
61
62
63

/*
 * Memory mapping attributes
64
65
 */
typedef enum  {
66
67
68
69
70
71
72
73
74
75
	/*
	 * Memory types supported.
	 * These are organised so that, going down the list, the memory types
	 * are getting weaker; conversely going up the list the memory types are
	 * getting stronger.
	 */
	MT_DEVICE,
	MT_NON_CACHEABLE,
	MT_MEMORY,
	/* Values up to 7 are reserved to add new memory types in the future */
76

77
78
	MT_RO		= U(0) << MT_PERM_SHIFT,
	MT_RW		= U(1) << MT_PERM_SHIFT,
79

80
81
	MT_SECURE	= U(0) << MT_SEC_SHIFT,
	MT_NS		= U(1) << MT_SEC_SHIFT,
82
83
84
85
86
87
88
89

	/*
	 * Access permissions for instruction execution are only relevant for
	 * normal read-only memory, i.e. MT_MEMORY | MT_RO. They are ignored
	 * (and potentially overridden) otherwise:
	 *  - Device memory is always marked as execute-never.
	 *  - Read-write normal memory is always marked as execute-never.
	 */
90
91
	MT_EXECUTE		= U(0) << MT_EXECUTE_SHIFT,
	MT_EXECUTE_NEVER	= U(1) << MT_EXECUTE_SHIFT,
92
} mmap_attr_t;
93

94
95
96
#define MT_CODE		(MT_MEMORY | MT_RO | MT_EXECUTE)
#define MT_RO_DATA	(MT_MEMORY | MT_RO | MT_EXECUTE_NEVER)

97
98
99
/*
 * Structure for specifying a single region of memory.
 */
100
typedef struct mmap_region {
101
102
103
104
	unsigned long long	base_pa;
	uintptr_t		base_va;
	size_t			size;
	mmap_attr_t		attr;
105
106
	/* Desired granularity. See the MAP_REGION2() macro for more details. */
	size_t			granularity;
107
} mmap_region_t;
108

109
110
111
112
113
114
115
116
/*
 * Translation regimes supported by this library.
 */
typedef enum xlat_regime {
	EL1_EL0_REGIME,
	EL3_REGIME,
} xlat_regime_t;

117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*
 * Declare the translation context type.
 * Its definition is private.
 */
typedef struct xlat_ctx xlat_ctx_t;

/*
 * Statically allocate a translation context and associated structures. Also
 * initialize them.
 *
 * _ctx_name:
 *   Prefix for the translation context variable.
 *   E.g. If _ctx_name is 'foo', the variable will be called 'foo_xlat_ctx'.
 *   Useful to distinguish multiple contexts from one another.
 *
 * _mmap_count:
 *   Number of mmap_region_t to allocate.
 *   Would typically be MAX_MMAP_REGIONS for the translation context describing
 *   the BL image currently executing.
 *
 * _xlat_tables_count:
 *   Number of sub-translation tables to allocate.
 *   Would typically be MAX_XLAT_TABLES for the translation context describing
 *   the BL image currently executing.
 *   Note that this is only for sub-tables ; at the initial lookup level, there
 *   is always a single table.
 *
 * _virt_addr_space_size, _phy_addr_space_size:
 *   Size (in bytes) of the virtual (resp. physical) address space.
 *   Would typically be PLAT_VIRT_ADDR_SPACE_SIZE
 *   (resp. PLAT_PHY_ADDR_SPACE_SIZE) for the translation context describing the
 *   BL image currently executing.
 */
#define REGISTER_XLAT_CONTEXT(_ctx_name, _mmap_count, _xlat_tables_count,	\
			_virt_addr_space_size, _phy_addr_space_size)		\
	_REGISTER_XLAT_CONTEXT(_ctx_name, _mmap_count, _xlat_tables_count,	\
		_virt_addr_space_size, _phy_addr_space_size)

155
156
157
158
159
160
161
/******************************************************************************
 * Generic translation table APIs.
 * Each API comes in 2 variants:
 * - one that acts on the current translation context for this BL image
 * - another that acts on the given translation context instead. This variant
 *   is named after the 1st version, with an additional '_ctx' suffix.
 *****************************************************************************/
162
163
164
165
166
167

/*
 * Initialize translation tables from the current list of mmap regions. Calling
 * this function marks the transition point after which static regions can no
 * longer be added.
 */
168
void init_xlat_tables(void);
169
void init_xlat_tables_ctx(xlat_ctx_t *ctx);
170
171

/*
172
173
174
 * Add a static region with defined base PA and base VA. This function can only
 * be used before initializing the translation tables. The region cannot be
 * removed afterwards.
175
 */
176
void mmap_add_region(unsigned long long base_pa, uintptr_t base_va,
177
				size_t size, mmap_attr_t attr);
178
void mmap_add_region_ctx(xlat_ctx_t *ctx, const mmap_region_t *mm);
179

180
181
182
183
184
185
186
187
188
189
/*
 * Add an array of static regions with defined base PA and base VA. This
 * function can only be used before initializing the translation tables. The
 * regions cannot be removed afterwards.
 */
void mmap_add(const mmap_region_t *mm);
void mmap_add_ctx(xlat_ctx_t *ctx, const mmap_region_t *mm);


#if PLAT_XLAT_TABLES_DYNAMIC
190
/*
191
192
 * Add a dynamic region with defined base PA and base VA. This type of region
 * can be added and removed even after the translation tables are initialized.
193
194
195
196
197
198
199
200
201
 *
 * Returns:
 *        0: Success.
 *   EINVAL: Invalid values were used as arguments.
 *   ERANGE: Memory limits were surpassed.
 *   ENOMEM: Not enough space in the mmap array or not enough free xlat tables.
 *    EPERM: It overlaps another region in an invalid way.
 */
int mmap_add_dynamic_region(unsigned long long base_pa, uintptr_t base_va,
202
				size_t size, mmap_attr_t attr);
203
int mmap_add_dynamic_region_ctx(xlat_ctx_t *ctx, mmap_region_t *mm);
204

205
206
/*
 * Remove a region with the specified base VA and size. Only dynamic regions can
207
208
 * be removed, and they can be removed even if the translation tables are
 * initialized.
209
210
211
212
213
214
215
 *
 * Returns:
 *        0: Success.
 *   EINVAL: The specified region wasn't found.
 *    EPERM: Trying to remove a static region.
 */
int mmap_remove_dynamic_region(uintptr_t base_va, size_t size);
216
217
218
219
220
int mmap_remove_dynamic_region_ctx(xlat_ctx_t *ctx,
				uintptr_t base_va,
				size_t size);

#endif /* PLAT_XLAT_TABLES_DYNAMIC */
221

222
#endif /*__ASSEMBLY__*/
223
#endif /* __XLAT_TABLES_V2_H__ */