The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

mbed 2

This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.

Committer:
AnnaBridge
Date:
Thu Nov 09 11:14:10 2017 +0000
Revision:
157:e7ca05fa8600
Parent:
156:ff21514d8981
Release 155 of the mbed library.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 156:ff21514d8981 1 ;/**************************************************************************//**
AnnaBridge 156:ff21514d8981 2 ; * @file core_ca_mmu.h
AnnaBridge 156:ff21514d8981 3 ; * @brief MMU Startup File for A9_MP Device Series
AnnaBridge 156:ff21514d8981 4 ; * @version V1.01
AnnaBridge 156:ff21514d8981 5 ; * @date 10 Sept 2014
AnnaBridge 156:ff21514d8981 6 ; *
AnnaBridge 156:ff21514d8981 7 ; * @note
AnnaBridge 156:ff21514d8981 8 ; *
AnnaBridge 156:ff21514d8981 9 ; ******************************************************************************/
AnnaBridge 156:ff21514d8981 10 ;/* Copyright (c) 2012-2014 ARM LIMITED
AnnaBridge 156:ff21514d8981 11 ;
AnnaBridge 156:ff21514d8981 12 ; All rights reserved.
AnnaBridge 156:ff21514d8981 13 ; Redistribution and use in source and binary forms, with or without
AnnaBridge 156:ff21514d8981 14 ; modification, are permitted provided that the following conditions are met:
AnnaBridge 156:ff21514d8981 15 ; - Redistributions of source code must retain the above copyright
AnnaBridge 156:ff21514d8981 16 ; notice, this list of conditions and the following disclaimer.
AnnaBridge 156:ff21514d8981 17 ; - Redistributions in binary form must reproduce the above copyright
AnnaBridge 156:ff21514d8981 18 ; notice, this list of conditions and the following disclaimer in the
AnnaBridge 156:ff21514d8981 19 ; documentation and/or other materials provided with the distribution.
AnnaBridge 156:ff21514d8981 20 ; - Neither the name of ARM nor the names of its contributors may be used
AnnaBridge 156:ff21514d8981 21 ; to endorse or promote products derived from this software without
AnnaBridge 156:ff21514d8981 22 ; specific prior written permission.
AnnaBridge 156:ff21514d8981 23 ; *
AnnaBridge 156:ff21514d8981 24 ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AnnaBridge 156:ff21514d8981 25 ; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
AnnaBridge 156:ff21514d8981 26 ; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
AnnaBridge 156:ff21514d8981 27 ; ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
AnnaBridge 156:ff21514d8981 28 ; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
AnnaBridge 156:ff21514d8981 29 ; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
AnnaBridge 156:ff21514d8981 30 ; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
AnnaBridge 156:ff21514d8981 31 ; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
AnnaBridge 156:ff21514d8981 32 ; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
AnnaBridge 156:ff21514d8981 33 ; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
AnnaBridge 156:ff21514d8981 34 ; POSSIBILITY OF SUCH DAMAGE.
AnnaBridge 156:ff21514d8981 35 ; ---------------------------------------------------------------------------*/
AnnaBridge 156:ff21514d8981 36
AnnaBridge 156:ff21514d8981 37 #ifdef __cplusplus
AnnaBridge 156:ff21514d8981 38 extern "C" {
AnnaBridge 156:ff21514d8981 39 #endif
AnnaBridge 156:ff21514d8981 40
AnnaBridge 156:ff21514d8981 41 #ifndef _MMU_FUNC_H
AnnaBridge 156:ff21514d8981 42 #define _MMU_FUNC_H
AnnaBridge 156:ff21514d8981 43
AnnaBridge 156:ff21514d8981 44 #define SECTION_DESCRIPTOR (0x2)
AnnaBridge 156:ff21514d8981 45 #define SECTION_MASK (0xFFFFFFFC)
AnnaBridge 156:ff21514d8981 46
AnnaBridge 156:ff21514d8981 47 #define SECTION_TEXCB_MASK (0xFFFF8FF3)
AnnaBridge 156:ff21514d8981 48 #define SECTION_B_SHIFT (2)
AnnaBridge 156:ff21514d8981 49 #define SECTION_C_SHIFT (3)
AnnaBridge 156:ff21514d8981 50 #define SECTION_TEX0_SHIFT (12)
AnnaBridge 156:ff21514d8981 51 #define SECTION_TEX1_SHIFT (13)
AnnaBridge 156:ff21514d8981 52 #define SECTION_TEX2_SHIFT (14)
AnnaBridge 156:ff21514d8981 53
AnnaBridge 156:ff21514d8981 54 #define SECTION_XN_MASK (0xFFFFFFEF)
AnnaBridge 156:ff21514d8981 55 #define SECTION_XN_SHIFT (4)
AnnaBridge 156:ff21514d8981 56
AnnaBridge 156:ff21514d8981 57 #define SECTION_DOMAIN_MASK (0xFFFFFE1F)
AnnaBridge 156:ff21514d8981 58 #define SECTION_DOMAIN_SHIFT (5)
AnnaBridge 156:ff21514d8981 59
AnnaBridge 156:ff21514d8981 60 #define SECTION_P_MASK (0xFFFFFDFF)
AnnaBridge 156:ff21514d8981 61 #define SECTION_P_SHIFT (9)
AnnaBridge 156:ff21514d8981 62
AnnaBridge 156:ff21514d8981 63 #define SECTION_AP_MASK (0xFFFF73FF)
AnnaBridge 156:ff21514d8981 64 #define SECTION_AP_SHIFT (10)
AnnaBridge 156:ff21514d8981 65 #define SECTION_AP2_SHIFT (15)
AnnaBridge 156:ff21514d8981 66
AnnaBridge 156:ff21514d8981 67 #define SECTION_S_MASK (0xFFFEFFFF)
AnnaBridge 156:ff21514d8981 68 #define SECTION_S_SHIFT (16)
AnnaBridge 156:ff21514d8981 69
AnnaBridge 156:ff21514d8981 70 #define SECTION_NG_MASK (0xFFFDFFFF)
AnnaBridge 156:ff21514d8981 71 #define SECTION_NG_SHIFT (17)
AnnaBridge 156:ff21514d8981 72
AnnaBridge 156:ff21514d8981 73 #define SECTION_NS_MASK (0xFFF7FFFF)
AnnaBridge 156:ff21514d8981 74 #define SECTION_NS_SHIFT (19)
AnnaBridge 156:ff21514d8981 75
AnnaBridge 156:ff21514d8981 76
AnnaBridge 156:ff21514d8981 77 #define PAGE_L1_DESCRIPTOR (0x1)
AnnaBridge 156:ff21514d8981 78 #define PAGE_L1_MASK (0xFFFFFFFC)
AnnaBridge 156:ff21514d8981 79
AnnaBridge 156:ff21514d8981 80 #define PAGE_L2_4K_DESC (0x2)
AnnaBridge 156:ff21514d8981 81 #define PAGE_L2_4K_MASK (0xFFFFFFFD)
AnnaBridge 156:ff21514d8981 82
AnnaBridge 156:ff21514d8981 83 #define PAGE_L2_64K_DESC (0x1)
AnnaBridge 156:ff21514d8981 84 #define PAGE_L2_64K_MASK (0xFFFFFFFC)
AnnaBridge 156:ff21514d8981 85
AnnaBridge 156:ff21514d8981 86 #define PAGE_4K_TEXCB_MASK (0xFFFFFE33)
AnnaBridge 156:ff21514d8981 87 #define PAGE_4K_B_SHIFT (2)
AnnaBridge 156:ff21514d8981 88 #define PAGE_4K_C_SHIFT (3)
AnnaBridge 156:ff21514d8981 89 #define PAGE_4K_TEX0_SHIFT (6)
AnnaBridge 156:ff21514d8981 90 #define PAGE_4K_TEX1_SHIFT (7)
AnnaBridge 156:ff21514d8981 91 #define PAGE_4K_TEX2_SHIFT (8)
AnnaBridge 156:ff21514d8981 92
AnnaBridge 156:ff21514d8981 93 #define PAGE_64K_TEXCB_MASK (0xFFFF8FF3)
AnnaBridge 156:ff21514d8981 94 #define PAGE_64K_B_SHIFT (2)
AnnaBridge 156:ff21514d8981 95 #define PAGE_64K_C_SHIFT (3)
AnnaBridge 156:ff21514d8981 96 #define PAGE_64K_TEX0_SHIFT (12)
AnnaBridge 156:ff21514d8981 97 #define PAGE_64K_TEX1_SHIFT (13)
AnnaBridge 156:ff21514d8981 98 #define PAGE_64K_TEX2_SHIFT (14)
AnnaBridge 156:ff21514d8981 99
AnnaBridge 156:ff21514d8981 100 #define PAGE_TEXCB_MASK (0xFFFF8FF3)
AnnaBridge 156:ff21514d8981 101 #define PAGE_B_SHIFT (2)
AnnaBridge 156:ff21514d8981 102 #define PAGE_C_SHIFT (3)
AnnaBridge 156:ff21514d8981 103 #define PAGE_TEX_SHIFT (12)
AnnaBridge 156:ff21514d8981 104
AnnaBridge 156:ff21514d8981 105 #define PAGE_XN_4K_MASK (0xFFFFFFFE)
AnnaBridge 156:ff21514d8981 106 #define PAGE_XN_4K_SHIFT (0)
AnnaBridge 156:ff21514d8981 107 #define PAGE_XN_64K_MASK (0xFFFF7FFF)
AnnaBridge 156:ff21514d8981 108 #define PAGE_XN_64K_SHIFT (15)
AnnaBridge 156:ff21514d8981 109
AnnaBridge 156:ff21514d8981 110
AnnaBridge 156:ff21514d8981 111 #define PAGE_DOMAIN_MASK (0xFFFFFE1F)
AnnaBridge 156:ff21514d8981 112 #define PAGE_DOMAIN_SHIFT (5)
AnnaBridge 156:ff21514d8981 113
AnnaBridge 156:ff21514d8981 114 #define PAGE_P_MASK (0xFFFFFDFF)
AnnaBridge 156:ff21514d8981 115 #define PAGE_P_SHIFT (9)
AnnaBridge 156:ff21514d8981 116
AnnaBridge 156:ff21514d8981 117 #define PAGE_AP_MASK (0xFFFFFDCF)
AnnaBridge 156:ff21514d8981 118 #define PAGE_AP_SHIFT (4)
AnnaBridge 156:ff21514d8981 119 #define PAGE_AP2_SHIFT (9)
AnnaBridge 156:ff21514d8981 120
AnnaBridge 156:ff21514d8981 121 #define PAGE_S_MASK (0xFFFFFBFF)
AnnaBridge 156:ff21514d8981 122 #define PAGE_S_SHIFT (10)
AnnaBridge 156:ff21514d8981 123
AnnaBridge 156:ff21514d8981 124 #define PAGE_NG_MASK (0xFFFFF7FF)
AnnaBridge 156:ff21514d8981 125 #define PAGE_NG_SHIFT (11)
AnnaBridge 156:ff21514d8981 126
AnnaBridge 156:ff21514d8981 127 #define PAGE_NS_MASK (0xFFFFFFF7)
AnnaBridge 156:ff21514d8981 128 #define PAGE_NS_SHIFT (3)
AnnaBridge 156:ff21514d8981 129
AnnaBridge 156:ff21514d8981 130 #define OFFSET_1M (0x00100000)
AnnaBridge 156:ff21514d8981 131 #define OFFSET_64K (0x00010000)
AnnaBridge 156:ff21514d8981 132 #define OFFSET_4K (0x00001000)
AnnaBridge 156:ff21514d8981 133
AnnaBridge 156:ff21514d8981 134 #define DESCRIPTOR_FAULT (0x00000000)
AnnaBridge 156:ff21514d8981 135
AnnaBridge 156:ff21514d8981 136 /* ########################### MMU Function Access ########################### */
AnnaBridge 156:ff21514d8981 137 /** \ingroup MMU_FunctionInterface
AnnaBridge 156:ff21514d8981 138 \defgroup MMU_Functions MMU Functions Interface
AnnaBridge 156:ff21514d8981 139 @{
AnnaBridge 156:ff21514d8981 140 */
AnnaBridge 156:ff21514d8981 141
AnnaBridge 156:ff21514d8981 142 /* Attributes enumerations */
AnnaBridge 156:ff21514d8981 143
AnnaBridge 156:ff21514d8981 144 /* Region size attributes */
AnnaBridge 156:ff21514d8981 145 typedef enum
AnnaBridge 156:ff21514d8981 146 {
AnnaBridge 156:ff21514d8981 147 SECTION,
AnnaBridge 156:ff21514d8981 148 PAGE_4k,
AnnaBridge 156:ff21514d8981 149 PAGE_64k,
AnnaBridge 156:ff21514d8981 150 } mmu_region_size_Type;
AnnaBridge 156:ff21514d8981 151
AnnaBridge 156:ff21514d8981 152 /* Region type attributes */
AnnaBridge 156:ff21514d8981 153 typedef enum
AnnaBridge 156:ff21514d8981 154 {
AnnaBridge 156:ff21514d8981 155 NORMAL,
AnnaBridge 156:ff21514d8981 156 DEVICE,
AnnaBridge 156:ff21514d8981 157 SHARED_DEVICE,
AnnaBridge 156:ff21514d8981 158 NON_SHARED_DEVICE,
AnnaBridge 156:ff21514d8981 159 STRONGLY_ORDERED
AnnaBridge 156:ff21514d8981 160 } mmu_memory_Type;
AnnaBridge 156:ff21514d8981 161
AnnaBridge 156:ff21514d8981 162 /* Region cacheability attributes */
AnnaBridge 156:ff21514d8981 163 typedef enum
AnnaBridge 156:ff21514d8981 164 {
AnnaBridge 156:ff21514d8981 165 NON_CACHEABLE,
AnnaBridge 156:ff21514d8981 166 WB_WA,
AnnaBridge 156:ff21514d8981 167 WT,
AnnaBridge 156:ff21514d8981 168 WB_NO_WA,
AnnaBridge 156:ff21514d8981 169 } mmu_cacheability_Type;
AnnaBridge 156:ff21514d8981 170
AnnaBridge 156:ff21514d8981 171 /* Region parity check attributes */
AnnaBridge 156:ff21514d8981 172 typedef enum
AnnaBridge 156:ff21514d8981 173 {
AnnaBridge 156:ff21514d8981 174 ECC_DISABLED,
AnnaBridge 156:ff21514d8981 175 ECC_ENABLED,
AnnaBridge 156:ff21514d8981 176 } mmu_ecc_check_Type;
AnnaBridge 156:ff21514d8981 177
AnnaBridge 156:ff21514d8981 178 /* Region execution attributes */
AnnaBridge 156:ff21514d8981 179 typedef enum
AnnaBridge 156:ff21514d8981 180 {
AnnaBridge 156:ff21514d8981 181 EXECUTE,
AnnaBridge 156:ff21514d8981 182 NON_EXECUTE,
AnnaBridge 156:ff21514d8981 183 } mmu_execute_Type;
AnnaBridge 156:ff21514d8981 184
AnnaBridge 156:ff21514d8981 185 /* Region global attributes */
AnnaBridge 156:ff21514d8981 186 typedef enum
AnnaBridge 156:ff21514d8981 187 {
AnnaBridge 156:ff21514d8981 188 GLOBAL,
AnnaBridge 156:ff21514d8981 189 NON_GLOBAL,
AnnaBridge 156:ff21514d8981 190 } mmu_global_Type;
AnnaBridge 156:ff21514d8981 191
AnnaBridge 156:ff21514d8981 192 /* Region shareability attributes */
AnnaBridge 156:ff21514d8981 193 typedef enum
AnnaBridge 156:ff21514d8981 194 {
AnnaBridge 156:ff21514d8981 195 NON_SHARED,
AnnaBridge 156:ff21514d8981 196 SHARED,
AnnaBridge 156:ff21514d8981 197 } mmu_shared_Type;
AnnaBridge 156:ff21514d8981 198
AnnaBridge 156:ff21514d8981 199 /* Region security attributes */
AnnaBridge 156:ff21514d8981 200 typedef enum
AnnaBridge 156:ff21514d8981 201 {
AnnaBridge 156:ff21514d8981 202 SECURE,
AnnaBridge 156:ff21514d8981 203 NON_SECURE,
AnnaBridge 156:ff21514d8981 204 } mmu_secure_Type;
AnnaBridge 156:ff21514d8981 205
AnnaBridge 156:ff21514d8981 206 /* Region access attributes */
AnnaBridge 156:ff21514d8981 207 typedef enum
AnnaBridge 156:ff21514d8981 208 {
AnnaBridge 156:ff21514d8981 209 NO_ACCESS,
AnnaBridge 156:ff21514d8981 210 RW,
AnnaBridge 156:ff21514d8981 211 READ,
AnnaBridge 156:ff21514d8981 212 } mmu_access_Type;
AnnaBridge 156:ff21514d8981 213
AnnaBridge 156:ff21514d8981 214 /* Memory Region definition */
AnnaBridge 156:ff21514d8981 215 typedef struct RegionStruct {
AnnaBridge 156:ff21514d8981 216 mmu_region_size_Type rg_t;
AnnaBridge 156:ff21514d8981 217 mmu_memory_Type mem_t;
AnnaBridge 156:ff21514d8981 218 uint8_t domain;
AnnaBridge 156:ff21514d8981 219 mmu_cacheability_Type inner_norm_t;
AnnaBridge 156:ff21514d8981 220 mmu_cacheability_Type outer_norm_t;
AnnaBridge 156:ff21514d8981 221 mmu_ecc_check_Type e_t;
AnnaBridge 156:ff21514d8981 222 mmu_execute_Type xn_t;
AnnaBridge 156:ff21514d8981 223 mmu_global_Type g_t;
AnnaBridge 156:ff21514d8981 224 mmu_secure_Type sec_t;
AnnaBridge 156:ff21514d8981 225 mmu_access_Type priv_t;
AnnaBridge 156:ff21514d8981 226 mmu_access_Type user_t;
AnnaBridge 156:ff21514d8981 227 mmu_shared_Type sh_t;
AnnaBridge 156:ff21514d8981 228
AnnaBridge 156:ff21514d8981 229 } mmu_region_attributes_Type;
AnnaBridge 156:ff21514d8981 230
AnnaBridge 156:ff21514d8981 231 /** \brief Set section execution-never attribute
AnnaBridge 156:ff21514d8981 232
AnnaBridge 156:ff21514d8981 233 The function sets section execution-never attribute
AnnaBridge 156:ff21514d8981 234
AnnaBridge 156:ff21514d8981 235 \param [out] descriptor_l1 L1 descriptor.
AnnaBridge 156:ff21514d8981 236 \param [in] xn Section execution-never attribute : EXECUTE , NON_EXECUTE.
AnnaBridge 156:ff21514d8981 237
AnnaBridge 156:ff21514d8981 238 \return 0
AnnaBridge 156:ff21514d8981 239 */
AnnaBridge 156:ff21514d8981 240 __STATIC_INLINE int __xn_section(uint32_t *descriptor_l1, mmu_execute_Type xn)
AnnaBridge 156:ff21514d8981 241 {
AnnaBridge 156:ff21514d8981 242 *descriptor_l1 &= SECTION_XN_MASK;
AnnaBridge 156:ff21514d8981 243 *descriptor_l1 |= ((xn & 0x1) << SECTION_XN_SHIFT);
AnnaBridge 156:ff21514d8981 244 return 0;
AnnaBridge 156:ff21514d8981 245 }
AnnaBridge 156:ff21514d8981 246
AnnaBridge 156:ff21514d8981 247 /** \brief Set section domain
AnnaBridge 156:ff21514d8981 248
AnnaBridge 156:ff21514d8981 249 The function sets section domain
AnnaBridge 156:ff21514d8981 250
AnnaBridge 156:ff21514d8981 251 \param [out] descriptor_l1 L1 descriptor.
AnnaBridge 156:ff21514d8981 252 \param [in] domain Section domain
AnnaBridge 156:ff21514d8981 253
AnnaBridge 156:ff21514d8981 254 \return 0
AnnaBridge 156:ff21514d8981 255 */
AnnaBridge 156:ff21514d8981 256 __STATIC_INLINE int __domain_section(uint32_t *descriptor_l1, uint8_t domain)
AnnaBridge 156:ff21514d8981 257 {
AnnaBridge 156:ff21514d8981 258 *descriptor_l1 &= SECTION_DOMAIN_MASK;
AnnaBridge 156:ff21514d8981 259 *descriptor_l1 |= ((domain & 0xF) << SECTION_DOMAIN_SHIFT);
AnnaBridge 156:ff21514d8981 260 return 0;
AnnaBridge 156:ff21514d8981 261 }
AnnaBridge 156:ff21514d8981 262
AnnaBridge 156:ff21514d8981 263 /** \brief Set section parity check
AnnaBridge 156:ff21514d8981 264
AnnaBridge 156:ff21514d8981 265 The function sets section parity check
AnnaBridge 156:ff21514d8981 266
AnnaBridge 156:ff21514d8981 267 \param [out] descriptor_l1 L1 descriptor.
AnnaBridge 156:ff21514d8981 268 \param [in] p_bit Parity check: ECC_DISABLED, ECC_ENABLED
AnnaBridge 156:ff21514d8981 269
AnnaBridge 156:ff21514d8981 270 \return 0
AnnaBridge 156:ff21514d8981 271 */
AnnaBridge 156:ff21514d8981 272 __STATIC_INLINE int __p_section(uint32_t *descriptor_l1, mmu_ecc_check_Type p_bit)
AnnaBridge 156:ff21514d8981 273 {
AnnaBridge 156:ff21514d8981 274 *descriptor_l1 &= SECTION_P_MASK;
AnnaBridge 156:ff21514d8981 275 *descriptor_l1 |= ((p_bit & 0x1) << SECTION_P_SHIFT);
AnnaBridge 156:ff21514d8981 276 return 0;
AnnaBridge 156:ff21514d8981 277 }
AnnaBridge 156:ff21514d8981 278
AnnaBridge 156:ff21514d8981 279 /** \brief Set section access privileges
AnnaBridge 156:ff21514d8981 280
AnnaBridge 156:ff21514d8981 281 The function sets section access privileges
AnnaBridge 156:ff21514d8981 282
AnnaBridge 156:ff21514d8981 283 \param [out] descriptor_l1 L1 descriptor.
AnnaBridge 156:ff21514d8981 284 \param [in] user User Level Access: NO_ACCESS, RW, READ
AnnaBridge 156:ff21514d8981 285 \param [in] priv Privilege Level Access: NO_ACCESS, RW, READ
AnnaBridge 156:ff21514d8981 286 \param [in] afe Access flag enable
AnnaBridge 156:ff21514d8981 287
AnnaBridge 156:ff21514d8981 288 \return 0
AnnaBridge 156:ff21514d8981 289 */
AnnaBridge 156:ff21514d8981 290 __STATIC_INLINE int __ap_section(uint32_t *descriptor_l1, mmu_access_Type user, mmu_access_Type priv, uint32_t afe)
AnnaBridge 156:ff21514d8981 291 {
AnnaBridge 156:ff21514d8981 292 uint32_t ap = 0;
AnnaBridge 156:ff21514d8981 293
AnnaBridge 156:ff21514d8981 294 if (afe == 0) { //full access
AnnaBridge 156:ff21514d8981 295 if ((priv == NO_ACCESS) && (user == NO_ACCESS)) { ap = 0x0; }
AnnaBridge 156:ff21514d8981 296 else if ((priv == RW) && (user == NO_ACCESS)) { ap = 0x1; }
AnnaBridge 156:ff21514d8981 297 else if ((priv == RW) && (user == READ)) { ap = 0x2; }
AnnaBridge 156:ff21514d8981 298 else if ((priv == RW) && (user == RW)) { ap = 0x3; }
AnnaBridge 156:ff21514d8981 299 else if ((priv == READ) && (user == NO_ACCESS)) { ap = 0x5; }
AnnaBridge 156:ff21514d8981 300 else if ((priv == READ) && (user == READ)) { ap = 0x7; }
AnnaBridge 156:ff21514d8981 301 }
AnnaBridge 156:ff21514d8981 302
AnnaBridge 156:ff21514d8981 303 else { //Simplified access
AnnaBridge 156:ff21514d8981 304 if ((priv == RW) && (user == NO_ACCESS)) { ap = 0x1; }
AnnaBridge 156:ff21514d8981 305 else if ((priv == RW) && (user == RW)) { ap = 0x3; }
AnnaBridge 156:ff21514d8981 306 else if ((priv == READ) && (user == NO_ACCESS)) { ap = 0x5; }
AnnaBridge 156:ff21514d8981 307 else if ((priv == READ) && (user == READ)) { ap = 0x7; }
AnnaBridge 156:ff21514d8981 308 }
AnnaBridge 156:ff21514d8981 309
AnnaBridge 156:ff21514d8981 310 *descriptor_l1 &= SECTION_AP_MASK;
AnnaBridge 156:ff21514d8981 311 *descriptor_l1 |= (ap & 0x3) << SECTION_AP_SHIFT;
AnnaBridge 156:ff21514d8981 312 *descriptor_l1 |= ((ap & 0x4)>>2) << SECTION_AP2_SHIFT;
AnnaBridge 156:ff21514d8981 313
AnnaBridge 156:ff21514d8981 314 return 0;
AnnaBridge 156:ff21514d8981 315 }
AnnaBridge 156:ff21514d8981 316
AnnaBridge 156:ff21514d8981 317 /** \brief Set section shareability
AnnaBridge 156:ff21514d8981 318
AnnaBridge 156:ff21514d8981 319 The function sets section shareability
AnnaBridge 156:ff21514d8981 320
AnnaBridge 156:ff21514d8981 321 \param [out] descriptor_l1 L1 descriptor.
AnnaBridge 156:ff21514d8981 322 \param [in] s_bit Section shareability: NON_SHARED, SHARED
AnnaBridge 156:ff21514d8981 323
AnnaBridge 156:ff21514d8981 324 \return 0
AnnaBridge 156:ff21514d8981 325 */
AnnaBridge 156:ff21514d8981 326 __STATIC_INLINE int __shared_section(uint32_t *descriptor_l1, mmu_shared_Type s_bit)
AnnaBridge 156:ff21514d8981 327 {
AnnaBridge 156:ff21514d8981 328 *descriptor_l1 &= SECTION_S_MASK;
AnnaBridge 156:ff21514d8981 329 *descriptor_l1 |= ((s_bit & 0x1) << SECTION_S_SHIFT);
AnnaBridge 156:ff21514d8981 330 return 0;
AnnaBridge 156:ff21514d8981 331 }
AnnaBridge 156:ff21514d8981 332
AnnaBridge 156:ff21514d8981 333 /** \brief Set section Global attribute
AnnaBridge 156:ff21514d8981 334
AnnaBridge 156:ff21514d8981 335 The function sets section Global attribute
AnnaBridge 156:ff21514d8981 336
AnnaBridge 156:ff21514d8981 337 \param [out] descriptor_l1 L1 descriptor.
AnnaBridge 156:ff21514d8981 338 \param [in] g_bit Section attribute: GLOBAL, NON_GLOBAL
AnnaBridge 156:ff21514d8981 339
AnnaBridge 156:ff21514d8981 340 \return 0
AnnaBridge 156:ff21514d8981 341 */
AnnaBridge 156:ff21514d8981 342 __STATIC_INLINE int __global_section(uint32_t *descriptor_l1, mmu_global_Type g_bit)
AnnaBridge 156:ff21514d8981 343 {
AnnaBridge 156:ff21514d8981 344 *descriptor_l1 &= SECTION_NG_MASK;
AnnaBridge 156:ff21514d8981 345 *descriptor_l1 |= ((g_bit & 0x1) << SECTION_NG_SHIFT);
AnnaBridge 156:ff21514d8981 346 return 0;
AnnaBridge 156:ff21514d8981 347 }
AnnaBridge 156:ff21514d8981 348
AnnaBridge 156:ff21514d8981 349 /** \brief Set section Security attribute
AnnaBridge 156:ff21514d8981 350
AnnaBridge 156:ff21514d8981 351 The function sets section Global attribute
AnnaBridge 156:ff21514d8981 352
AnnaBridge 156:ff21514d8981 353 \param [out] descriptor_l1 L1 descriptor.
AnnaBridge 156:ff21514d8981 354 \param [in] s_bit Section Security attribute: SECURE, NON_SECURE
AnnaBridge 156:ff21514d8981 355
AnnaBridge 156:ff21514d8981 356 \return 0
AnnaBridge 156:ff21514d8981 357 */
AnnaBridge 156:ff21514d8981 358 __STATIC_INLINE int __secure_section(uint32_t *descriptor_l1, mmu_secure_Type s_bit)
AnnaBridge 156:ff21514d8981 359 {
AnnaBridge 156:ff21514d8981 360 *descriptor_l1 &= SECTION_NS_MASK;
AnnaBridge 156:ff21514d8981 361 *descriptor_l1 |= ((s_bit & 0x1) << SECTION_NS_SHIFT);
AnnaBridge 156:ff21514d8981 362 return 0;
AnnaBridge 156:ff21514d8981 363 }
AnnaBridge 156:ff21514d8981 364
AnnaBridge 156:ff21514d8981 365 /* Page 4k or 64k */
AnnaBridge 156:ff21514d8981 366 /** \brief Set 4k/64k page execution-never attribute
AnnaBridge 156:ff21514d8981 367
AnnaBridge 156:ff21514d8981 368 The function sets 4k/64k page execution-never attribute
AnnaBridge 156:ff21514d8981 369
AnnaBridge 156:ff21514d8981 370 \param [out] descriptor_l2 L2 descriptor.
AnnaBridge 156:ff21514d8981 371 \param [in] xn Page execution-never attribute : EXECUTE , NON_EXECUTE.
AnnaBridge 156:ff21514d8981 372 \param [in] page Page size: PAGE_4k, PAGE_64k,
AnnaBridge 156:ff21514d8981 373
AnnaBridge 156:ff21514d8981 374 \return 0
AnnaBridge 156:ff21514d8981 375 */
AnnaBridge 156:ff21514d8981 376 __STATIC_INLINE int __xn_page(uint32_t *descriptor_l2, mmu_execute_Type xn, mmu_region_size_Type page)
AnnaBridge 156:ff21514d8981 377 {
AnnaBridge 156:ff21514d8981 378 if (page == PAGE_4k)
AnnaBridge 156:ff21514d8981 379 {
AnnaBridge 156:ff21514d8981 380 *descriptor_l2 &= PAGE_XN_4K_MASK;
AnnaBridge 156:ff21514d8981 381 *descriptor_l2 |= ((xn & 0x1) << PAGE_XN_4K_SHIFT);
AnnaBridge 156:ff21514d8981 382 }
AnnaBridge 156:ff21514d8981 383 else
AnnaBridge 156:ff21514d8981 384 {
AnnaBridge 156:ff21514d8981 385 *descriptor_l2 &= PAGE_XN_64K_MASK;
AnnaBridge 156:ff21514d8981 386 *descriptor_l2 |= ((xn & 0x1) << PAGE_XN_64K_SHIFT);
AnnaBridge 156:ff21514d8981 387 }
AnnaBridge 156:ff21514d8981 388 return 0;
AnnaBridge 156:ff21514d8981 389 }
AnnaBridge 156:ff21514d8981 390
AnnaBridge 156:ff21514d8981 391 /** \brief Set 4k/64k page domain
AnnaBridge 156:ff21514d8981 392
AnnaBridge 156:ff21514d8981 393 The function sets 4k/64k page domain
AnnaBridge 156:ff21514d8981 394
AnnaBridge 156:ff21514d8981 395 \param [out] descriptor_l1 L1 descriptor.
AnnaBridge 156:ff21514d8981 396 \param [in] domain Page domain
AnnaBridge 156:ff21514d8981 397
AnnaBridge 156:ff21514d8981 398 \return 0
AnnaBridge 156:ff21514d8981 399 */
AnnaBridge 156:ff21514d8981 400 __STATIC_INLINE int __domain_page(uint32_t *descriptor_l1, uint8_t domain)
AnnaBridge 156:ff21514d8981 401 {
AnnaBridge 156:ff21514d8981 402 *descriptor_l1 &= PAGE_DOMAIN_MASK;
AnnaBridge 156:ff21514d8981 403 *descriptor_l1 |= ((domain & 0xf) << PAGE_DOMAIN_SHIFT);
AnnaBridge 156:ff21514d8981 404 return 0;
AnnaBridge 156:ff21514d8981 405 }
AnnaBridge 156:ff21514d8981 406
AnnaBridge 156:ff21514d8981 407 /** \brief Set 4k/64k page parity check
AnnaBridge 156:ff21514d8981 408
AnnaBridge 156:ff21514d8981 409 The function sets 4k/64k page parity check
AnnaBridge 156:ff21514d8981 410
AnnaBridge 156:ff21514d8981 411 \param [out] descriptor_l1 L1 descriptor.
AnnaBridge 156:ff21514d8981 412 \param [in] p_bit Parity check: ECC_DISABLED, ECC_ENABLED
AnnaBridge 156:ff21514d8981 413
AnnaBridge 156:ff21514d8981 414 \return 0
AnnaBridge 156:ff21514d8981 415 */
AnnaBridge 156:ff21514d8981 416 __STATIC_INLINE int __p_page(uint32_t *descriptor_l1, mmu_ecc_check_Type p_bit)
AnnaBridge 156:ff21514d8981 417 {
AnnaBridge 156:ff21514d8981 418 *descriptor_l1 &= SECTION_P_MASK;
AnnaBridge 156:ff21514d8981 419 *descriptor_l1 |= ((p_bit & 0x1) << SECTION_P_SHIFT);
AnnaBridge 156:ff21514d8981 420 return 0;
AnnaBridge 156:ff21514d8981 421 }
AnnaBridge 156:ff21514d8981 422
AnnaBridge 156:ff21514d8981 423 /** \brief Set 4k/64k page access privileges
AnnaBridge 156:ff21514d8981 424
AnnaBridge 156:ff21514d8981 425 The function sets 4k/64k page access privileges
AnnaBridge 156:ff21514d8981 426
AnnaBridge 156:ff21514d8981 427 \param [out] descriptor_l2 L2 descriptor.
AnnaBridge 156:ff21514d8981 428 \param [in] user User Level Access: NO_ACCESS, RW, READ
AnnaBridge 156:ff21514d8981 429 \param [in] priv Privilege Level Access: NO_ACCESS, RW, READ
AnnaBridge 156:ff21514d8981 430 \param [in] afe Access flag enable
AnnaBridge 156:ff21514d8981 431
AnnaBridge 156:ff21514d8981 432 \return 0
AnnaBridge 156:ff21514d8981 433 */
AnnaBridge 156:ff21514d8981 434 __STATIC_INLINE int __ap_page(uint32_t *descriptor_l2, mmu_access_Type user, mmu_access_Type priv, uint32_t afe)
AnnaBridge 156:ff21514d8981 435 {
AnnaBridge 156:ff21514d8981 436 uint32_t ap = 0;
AnnaBridge 156:ff21514d8981 437
AnnaBridge 156:ff21514d8981 438 if (afe == 0) { //full access
AnnaBridge 156:ff21514d8981 439 if ((priv == NO_ACCESS) && (user == NO_ACCESS)) { ap = 0x0; }
AnnaBridge 156:ff21514d8981 440 else if ((priv == RW) && (user == NO_ACCESS)) { ap = 0x1; }
AnnaBridge 156:ff21514d8981 441 else if ((priv == RW) && (user == READ)) { ap = 0x2; }
AnnaBridge 156:ff21514d8981 442 else if ((priv == RW) && (user == RW)) { ap = 0x3; }
AnnaBridge 156:ff21514d8981 443 else if ((priv == READ) && (user == NO_ACCESS)) { ap = 0x5; }
AnnaBridge 156:ff21514d8981 444 else if ((priv == READ) && (user == READ)) { ap = 0x6; }
AnnaBridge 156:ff21514d8981 445 }
AnnaBridge 156:ff21514d8981 446
AnnaBridge 156:ff21514d8981 447 else { //Simplified access
AnnaBridge 156:ff21514d8981 448 if ((priv == RW) && (user == NO_ACCESS)) { ap = 0x1; }
AnnaBridge 156:ff21514d8981 449 else if ((priv == RW) && (user == RW)) { ap = 0x3; }
AnnaBridge 156:ff21514d8981 450 else if ((priv == READ) && (user == NO_ACCESS)) { ap = 0x5; }
AnnaBridge 156:ff21514d8981 451 else if ((priv == READ) && (user == READ)) { ap = 0x7; }
AnnaBridge 156:ff21514d8981 452 }
AnnaBridge 156:ff21514d8981 453
AnnaBridge 156:ff21514d8981 454 *descriptor_l2 &= PAGE_AP_MASK;
AnnaBridge 156:ff21514d8981 455 *descriptor_l2 |= (ap & 0x3) << PAGE_AP_SHIFT;
AnnaBridge 156:ff21514d8981 456 *descriptor_l2 |= ((ap & 0x4)>>2) << PAGE_AP2_SHIFT;
AnnaBridge 156:ff21514d8981 457
AnnaBridge 156:ff21514d8981 458 return 0;
AnnaBridge 156:ff21514d8981 459 }
AnnaBridge 156:ff21514d8981 460
AnnaBridge 156:ff21514d8981 461 /** \brief Set 4k/64k page shareability
AnnaBridge 156:ff21514d8981 462
AnnaBridge 156:ff21514d8981 463 The function sets 4k/64k page shareability
AnnaBridge 156:ff21514d8981 464
AnnaBridge 156:ff21514d8981 465 \param [out] descriptor_l2 L2 descriptor.
AnnaBridge 156:ff21514d8981 466 \param [in] s_bit 4k/64k page shareability: NON_SHARED, SHARED
AnnaBridge 156:ff21514d8981 467
AnnaBridge 156:ff21514d8981 468 \return 0
AnnaBridge 156:ff21514d8981 469 */
AnnaBridge 156:ff21514d8981 470 __STATIC_INLINE int __shared_page(uint32_t *descriptor_l2, mmu_shared_Type s_bit)
AnnaBridge 156:ff21514d8981 471 {
AnnaBridge 156:ff21514d8981 472 *descriptor_l2 &= PAGE_S_MASK;
AnnaBridge 156:ff21514d8981 473 *descriptor_l2 |= ((s_bit & 0x1) << PAGE_S_SHIFT);
AnnaBridge 156:ff21514d8981 474 return 0;
AnnaBridge 156:ff21514d8981 475 }
AnnaBridge 156:ff21514d8981 476
AnnaBridge 156:ff21514d8981 477 /** \brief Set 4k/64k page Global attribute
AnnaBridge 156:ff21514d8981 478
AnnaBridge 156:ff21514d8981 479 The function sets 4k/64k page Global attribute
AnnaBridge 156:ff21514d8981 480
AnnaBridge 156:ff21514d8981 481 \param [out] descriptor_l2 L2 descriptor.
AnnaBridge 156:ff21514d8981 482 \param [in] g_bit 4k/64k page attribute: GLOBAL, NON_GLOBAL
AnnaBridge 156:ff21514d8981 483
AnnaBridge 156:ff21514d8981 484 \return 0
AnnaBridge 156:ff21514d8981 485 */
AnnaBridge 156:ff21514d8981 486 __STATIC_INLINE int __global_page(uint32_t *descriptor_l2, mmu_global_Type g_bit)
AnnaBridge 156:ff21514d8981 487 {
AnnaBridge 156:ff21514d8981 488 *descriptor_l2 &= PAGE_NG_MASK;
AnnaBridge 156:ff21514d8981 489 *descriptor_l2 |= ((g_bit & 0x1) << PAGE_NG_SHIFT);
AnnaBridge 156:ff21514d8981 490 return 0;
AnnaBridge 156:ff21514d8981 491 }
AnnaBridge 156:ff21514d8981 492
AnnaBridge 156:ff21514d8981 493 /** \brief Set 4k/64k page Security attribute
AnnaBridge 156:ff21514d8981 494
AnnaBridge 156:ff21514d8981 495 The function sets 4k/64k page Global attribute
AnnaBridge 156:ff21514d8981 496
AnnaBridge 156:ff21514d8981 497 \param [out] descriptor_l1 L1 descriptor.
AnnaBridge 156:ff21514d8981 498 \param [in] s_bit 4k/64k page Security attribute: SECURE, NON_SECURE
AnnaBridge 156:ff21514d8981 499
AnnaBridge 156:ff21514d8981 500 \return 0
AnnaBridge 156:ff21514d8981 501 */
AnnaBridge 156:ff21514d8981 502 __STATIC_INLINE int __secure_page(uint32_t *descriptor_l1, mmu_secure_Type s_bit)
AnnaBridge 156:ff21514d8981 503 {
AnnaBridge 156:ff21514d8981 504 *descriptor_l1 &= PAGE_NS_MASK;
AnnaBridge 156:ff21514d8981 505 *descriptor_l1 |= ((s_bit & 0x1) << PAGE_NS_SHIFT);
AnnaBridge 156:ff21514d8981 506 return 0;
AnnaBridge 156:ff21514d8981 507 }
AnnaBridge 156:ff21514d8981 508
AnnaBridge 156:ff21514d8981 509
AnnaBridge 156:ff21514d8981 510 /** \brief Set Section memory attributes
AnnaBridge 156:ff21514d8981 511
AnnaBridge 156:ff21514d8981 512 The function sets section memory attributes
AnnaBridge 156:ff21514d8981 513
AnnaBridge 156:ff21514d8981 514 \param [out] descriptor_l1 L1 descriptor.
AnnaBridge 156:ff21514d8981 515 \param [in] mem Section memory type: NORMAL, DEVICE, SHARED_DEVICE, NON_SHARED_DEVICE, STRONGLY_ORDERED
AnnaBridge 156:ff21514d8981 516 \param [in] outer Outer cacheability: NON_CACHEABLE, WB_WA, WT, WB_NO_WA,
AnnaBridge 156:ff21514d8981 517 \param [in] inner Inner cacheability: NON_CACHEABLE, WB_WA, WT, WB_NO_WA,
AnnaBridge 156:ff21514d8981 518
AnnaBridge 156:ff21514d8981 519 \return 0
AnnaBridge 156:ff21514d8981 520 */
AnnaBridge 156:ff21514d8981 521 __STATIC_INLINE int __memory_section(uint32_t *descriptor_l1, mmu_memory_Type mem, mmu_cacheability_Type outer, mmu_cacheability_Type inner)
AnnaBridge 156:ff21514d8981 522 {
AnnaBridge 156:ff21514d8981 523 *descriptor_l1 &= SECTION_TEXCB_MASK;
AnnaBridge 156:ff21514d8981 524
AnnaBridge 156:ff21514d8981 525 if (STRONGLY_ORDERED == mem)
AnnaBridge 156:ff21514d8981 526 {
AnnaBridge 156:ff21514d8981 527 return 0;
AnnaBridge 156:ff21514d8981 528 }
AnnaBridge 156:ff21514d8981 529 else if (SHARED_DEVICE == mem)
AnnaBridge 156:ff21514d8981 530 {
AnnaBridge 156:ff21514d8981 531 *descriptor_l1 |= (1 << SECTION_B_SHIFT);
AnnaBridge 156:ff21514d8981 532 }
AnnaBridge 156:ff21514d8981 533 else if (NON_SHARED_DEVICE == mem)
AnnaBridge 156:ff21514d8981 534 {
AnnaBridge 156:ff21514d8981 535 *descriptor_l1 |= (1 << SECTION_TEX1_SHIFT);
AnnaBridge 156:ff21514d8981 536 }
AnnaBridge 156:ff21514d8981 537 else if (NORMAL == mem)
AnnaBridge 156:ff21514d8981 538 {
AnnaBridge 156:ff21514d8981 539 *descriptor_l1 |= 1 << SECTION_TEX2_SHIFT;
AnnaBridge 156:ff21514d8981 540 switch(inner)
AnnaBridge 156:ff21514d8981 541 {
AnnaBridge 156:ff21514d8981 542 case NON_CACHEABLE:
AnnaBridge 156:ff21514d8981 543 break;
AnnaBridge 156:ff21514d8981 544 case WB_WA:
AnnaBridge 156:ff21514d8981 545 *descriptor_l1 |= (1 << SECTION_B_SHIFT);
AnnaBridge 156:ff21514d8981 546 break;
AnnaBridge 156:ff21514d8981 547 case WT:
AnnaBridge 156:ff21514d8981 548 *descriptor_l1 |= 1 << SECTION_C_SHIFT;
AnnaBridge 156:ff21514d8981 549 break;
AnnaBridge 156:ff21514d8981 550 case WB_NO_WA:
AnnaBridge 156:ff21514d8981 551 *descriptor_l1 |= (1 << SECTION_B_SHIFT) | (1 << SECTION_C_SHIFT);
AnnaBridge 156:ff21514d8981 552 break;
AnnaBridge 156:ff21514d8981 553 }
AnnaBridge 156:ff21514d8981 554 switch(outer)
AnnaBridge 156:ff21514d8981 555 {
AnnaBridge 156:ff21514d8981 556 case NON_CACHEABLE:
AnnaBridge 156:ff21514d8981 557 break;
AnnaBridge 156:ff21514d8981 558 case WB_WA:
AnnaBridge 156:ff21514d8981 559 *descriptor_l1 |= (1 << SECTION_TEX0_SHIFT);
AnnaBridge 156:ff21514d8981 560 break;
AnnaBridge 156:ff21514d8981 561 case WT:
AnnaBridge 156:ff21514d8981 562 *descriptor_l1 |= 1 << SECTION_TEX1_SHIFT;
AnnaBridge 156:ff21514d8981 563 break;
AnnaBridge 156:ff21514d8981 564 case WB_NO_WA:
AnnaBridge 156:ff21514d8981 565 *descriptor_l1 |= (1 << SECTION_TEX0_SHIFT) | (1 << SECTION_TEX0_SHIFT);
AnnaBridge 156:ff21514d8981 566 break;
AnnaBridge 156:ff21514d8981 567 }
AnnaBridge 156:ff21514d8981 568 }
AnnaBridge 156:ff21514d8981 569
AnnaBridge 156:ff21514d8981 570 return 0;
AnnaBridge 156:ff21514d8981 571 }
AnnaBridge 156:ff21514d8981 572
AnnaBridge 156:ff21514d8981 573 /** \brief Set 4k/64k page memory attributes
AnnaBridge 156:ff21514d8981 574
AnnaBridge 156:ff21514d8981 575 The function sets 4k/64k page memory attributes
AnnaBridge 156:ff21514d8981 576
AnnaBridge 156:ff21514d8981 577 \param [out] descriptor_l2 L2 descriptor.
AnnaBridge 156:ff21514d8981 578 \param [in] mem 4k/64k page memory type: NORMAL, DEVICE, SHARED_DEVICE, NON_SHARED_DEVICE, STRONGLY_ORDERED
AnnaBridge 156:ff21514d8981 579 \param [in] outer Outer cacheability: NON_CACHEABLE, WB_WA, WT, WB_NO_WA,
AnnaBridge 156:ff21514d8981 580 \param [in] inner Inner cacheability: NON_CACHEABLE, WB_WA, WT, WB_NO_WA,
AnnaBridge 156:ff21514d8981 581
AnnaBridge 156:ff21514d8981 582 \return 0
AnnaBridge 156:ff21514d8981 583 */
AnnaBridge 156:ff21514d8981 584 __STATIC_INLINE int __memory_page(uint32_t *descriptor_l2, mmu_memory_Type mem, mmu_cacheability_Type outer, mmu_cacheability_Type inner, mmu_region_size_Type page)
AnnaBridge 156:ff21514d8981 585 {
AnnaBridge 156:ff21514d8981 586 *descriptor_l2 &= PAGE_4K_TEXCB_MASK;
AnnaBridge 156:ff21514d8981 587
AnnaBridge 156:ff21514d8981 588 if (page == PAGE_64k)
AnnaBridge 156:ff21514d8981 589 {
AnnaBridge 156:ff21514d8981 590 //same as section
AnnaBridge 156:ff21514d8981 591 __memory_section(descriptor_l2, mem, outer, inner);
AnnaBridge 156:ff21514d8981 592 }
AnnaBridge 156:ff21514d8981 593 else
AnnaBridge 156:ff21514d8981 594 {
AnnaBridge 156:ff21514d8981 595 if (STRONGLY_ORDERED == mem)
AnnaBridge 156:ff21514d8981 596 {
AnnaBridge 156:ff21514d8981 597 return 0;
AnnaBridge 156:ff21514d8981 598 }
AnnaBridge 156:ff21514d8981 599 else if (SHARED_DEVICE == mem)
AnnaBridge 156:ff21514d8981 600 {
AnnaBridge 156:ff21514d8981 601 *descriptor_l2 |= (1 << PAGE_4K_B_SHIFT);
AnnaBridge 156:ff21514d8981 602 }
AnnaBridge 156:ff21514d8981 603 else if (NON_SHARED_DEVICE == mem)
AnnaBridge 156:ff21514d8981 604 {
AnnaBridge 156:ff21514d8981 605 *descriptor_l2 |= (1 << PAGE_4K_TEX1_SHIFT);
AnnaBridge 156:ff21514d8981 606 }
AnnaBridge 156:ff21514d8981 607 else if (NORMAL == mem)
AnnaBridge 156:ff21514d8981 608 {
AnnaBridge 156:ff21514d8981 609 *descriptor_l2 |= 1 << PAGE_4K_TEX2_SHIFT;
AnnaBridge 156:ff21514d8981 610 switch(inner)
AnnaBridge 156:ff21514d8981 611 {
AnnaBridge 156:ff21514d8981 612 case NON_CACHEABLE:
AnnaBridge 156:ff21514d8981 613 break;
AnnaBridge 156:ff21514d8981 614 case WB_WA:
AnnaBridge 156:ff21514d8981 615 *descriptor_l2 |= (1 << PAGE_4K_B_SHIFT);
AnnaBridge 156:ff21514d8981 616 break;
AnnaBridge 156:ff21514d8981 617 case WT:
AnnaBridge 156:ff21514d8981 618 *descriptor_l2 |= 1 << PAGE_4K_C_SHIFT;
AnnaBridge 156:ff21514d8981 619 break;
AnnaBridge 156:ff21514d8981 620 case WB_NO_WA:
AnnaBridge 156:ff21514d8981 621 *descriptor_l2 |= (1 << PAGE_4K_B_SHIFT) | (1 << PAGE_4K_C_SHIFT);
AnnaBridge 156:ff21514d8981 622 break;
AnnaBridge 156:ff21514d8981 623 }
AnnaBridge 156:ff21514d8981 624 switch(outer)
AnnaBridge 156:ff21514d8981 625 {
AnnaBridge 156:ff21514d8981 626 case NON_CACHEABLE:
AnnaBridge 156:ff21514d8981 627 break;
AnnaBridge 156:ff21514d8981 628 case WB_WA:
AnnaBridge 156:ff21514d8981 629 *descriptor_l2 |= (1 << PAGE_4K_TEX0_SHIFT);
AnnaBridge 156:ff21514d8981 630 break;
AnnaBridge 156:ff21514d8981 631 case WT:
AnnaBridge 156:ff21514d8981 632 *descriptor_l2 |= 1 << PAGE_4K_TEX1_SHIFT;
AnnaBridge 156:ff21514d8981 633 break;
AnnaBridge 156:ff21514d8981 634 case WB_NO_WA:
AnnaBridge 156:ff21514d8981 635 *descriptor_l2 |= (1 << PAGE_4K_TEX0_SHIFT) | (1 << PAGE_4K_TEX0_SHIFT);
AnnaBridge 156:ff21514d8981 636 break;
AnnaBridge 156:ff21514d8981 637 }
AnnaBridge 156:ff21514d8981 638 }
AnnaBridge 156:ff21514d8981 639 }
AnnaBridge 156:ff21514d8981 640
AnnaBridge 156:ff21514d8981 641 return 0;
AnnaBridge 156:ff21514d8981 642 }
AnnaBridge 156:ff21514d8981 643
AnnaBridge 156:ff21514d8981 644 /** \brief Create a L1 section descriptor
AnnaBridge 156:ff21514d8981 645
AnnaBridge 156:ff21514d8981 646 The function creates a section descriptor.
AnnaBridge 156:ff21514d8981 647
AnnaBridge 156:ff21514d8981 648 Assumptions:
AnnaBridge 156:ff21514d8981 649 - 16MB super sections not supported
AnnaBridge 156:ff21514d8981 650 - TEX remap disabled, so memory type and attributes are described directly by bits in the descriptor
AnnaBridge 156:ff21514d8981 651 - Functions always return 0
AnnaBridge 156:ff21514d8981 652
AnnaBridge 156:ff21514d8981 653 \param [out] descriptor L1 descriptor
AnnaBridge 156:ff21514d8981 654 \param [out] descriptor2 L2 descriptor
AnnaBridge 156:ff21514d8981 655 \param [in] reg Section attributes
AnnaBridge 156:ff21514d8981 656
AnnaBridge 156:ff21514d8981 657 \return 0
AnnaBridge 156:ff21514d8981 658 */
AnnaBridge 156:ff21514d8981 659 __STATIC_INLINE int __get_section_descriptor(uint32_t *descriptor, mmu_region_attributes_Type reg)
AnnaBridge 156:ff21514d8981 660 {
AnnaBridge 156:ff21514d8981 661 *descriptor = 0;
AnnaBridge 156:ff21514d8981 662
AnnaBridge 156:ff21514d8981 663 __memory_section(descriptor, reg.mem_t, reg.outer_norm_t, reg.inner_norm_t);
AnnaBridge 156:ff21514d8981 664 __xn_section(descriptor,reg.xn_t);
AnnaBridge 156:ff21514d8981 665 __domain_section(descriptor, reg.domain);
AnnaBridge 156:ff21514d8981 666 __p_section(descriptor, reg.e_t);
AnnaBridge 156:ff21514d8981 667 __ap_section(descriptor, reg.priv_t, reg.user_t, 1);
AnnaBridge 156:ff21514d8981 668 __shared_section(descriptor,reg.sh_t);
AnnaBridge 156:ff21514d8981 669 __global_section(descriptor,reg.g_t);
AnnaBridge 156:ff21514d8981 670 __secure_section(descriptor,reg.sec_t);
AnnaBridge 156:ff21514d8981 671 *descriptor &= SECTION_MASK;
AnnaBridge 156:ff21514d8981 672 *descriptor |= SECTION_DESCRIPTOR;
AnnaBridge 156:ff21514d8981 673
AnnaBridge 156:ff21514d8981 674 return 0;
AnnaBridge 156:ff21514d8981 675
AnnaBridge 156:ff21514d8981 676 }
AnnaBridge 156:ff21514d8981 677
AnnaBridge 156:ff21514d8981 678
AnnaBridge 156:ff21514d8981 679 /** \brief Create a L1 and L2 4k/64k page descriptor
AnnaBridge 156:ff21514d8981 680
AnnaBridge 156:ff21514d8981 681 The function creates a 4k/64k page descriptor.
AnnaBridge 156:ff21514d8981 682 Assumptions:
AnnaBridge 156:ff21514d8981 683 - TEX remap disabled, so memory type and attributes are described directly by bits in the descriptor
AnnaBridge 156:ff21514d8981 684 - Functions always return 0
AnnaBridge 156:ff21514d8981 685
AnnaBridge 156:ff21514d8981 686 \param [out] descriptor L1 descriptor
AnnaBridge 156:ff21514d8981 687 \param [out] descriptor2 L2 descriptor
AnnaBridge 156:ff21514d8981 688 \param [in] reg 4k/64k page attributes
AnnaBridge 156:ff21514d8981 689
AnnaBridge 156:ff21514d8981 690 \return 0
AnnaBridge 156:ff21514d8981 691 */
AnnaBridge 156:ff21514d8981 692 __STATIC_INLINE int __get_page_descriptor(uint32_t *descriptor, uint32_t *descriptor2, mmu_region_attributes_Type reg)
AnnaBridge 156:ff21514d8981 693 {
AnnaBridge 156:ff21514d8981 694 *descriptor = 0;
AnnaBridge 156:ff21514d8981 695 *descriptor2 = 0;
AnnaBridge 156:ff21514d8981 696
AnnaBridge 156:ff21514d8981 697 switch (reg.rg_t)
AnnaBridge 156:ff21514d8981 698 {
AnnaBridge 156:ff21514d8981 699 case PAGE_4k:
AnnaBridge 156:ff21514d8981 700 __memory_page(descriptor2, reg.mem_t, reg.outer_norm_t, reg.inner_norm_t, PAGE_4k);
AnnaBridge 156:ff21514d8981 701 __xn_page(descriptor2, reg.xn_t, PAGE_4k);
AnnaBridge 156:ff21514d8981 702 __domain_page(descriptor, reg.domain);
AnnaBridge 156:ff21514d8981 703 __p_page(descriptor, reg.e_t);
AnnaBridge 156:ff21514d8981 704 __ap_page(descriptor2, reg.priv_t, reg.user_t, 1);
AnnaBridge 156:ff21514d8981 705 __shared_page(descriptor2,reg.sh_t);
AnnaBridge 156:ff21514d8981 706 __global_page(descriptor2,reg.g_t);
AnnaBridge 156:ff21514d8981 707 __secure_page(descriptor,reg.sec_t);
AnnaBridge 156:ff21514d8981 708 *descriptor &= PAGE_L1_MASK;
AnnaBridge 156:ff21514d8981 709 *descriptor |= PAGE_L1_DESCRIPTOR;
AnnaBridge 156:ff21514d8981 710 *descriptor2 &= PAGE_L2_4K_MASK;
AnnaBridge 156:ff21514d8981 711 *descriptor2 |= PAGE_L2_4K_DESC;
AnnaBridge 156:ff21514d8981 712 break;
AnnaBridge 156:ff21514d8981 713
AnnaBridge 156:ff21514d8981 714 case PAGE_64k:
AnnaBridge 156:ff21514d8981 715 __memory_page(descriptor2, reg.mem_t, reg.outer_norm_t, reg.inner_norm_t, PAGE_64k);
AnnaBridge 156:ff21514d8981 716 __xn_page(descriptor2, reg.xn_t, PAGE_64k);
AnnaBridge 156:ff21514d8981 717 __domain_page(descriptor, reg.domain);
AnnaBridge 156:ff21514d8981 718 __p_page(descriptor, reg.e_t);
AnnaBridge 156:ff21514d8981 719 __ap_page(descriptor2, reg.priv_t, reg.user_t, 1);
AnnaBridge 156:ff21514d8981 720 __shared_page(descriptor2,reg.sh_t);
AnnaBridge 156:ff21514d8981 721 __global_page(descriptor2,reg.g_t);
AnnaBridge 156:ff21514d8981 722 __secure_page(descriptor,reg.sec_t);
AnnaBridge 156:ff21514d8981 723 *descriptor &= PAGE_L1_MASK;
AnnaBridge 156:ff21514d8981 724 *descriptor |= PAGE_L1_DESCRIPTOR;
AnnaBridge 156:ff21514d8981 725 *descriptor2 &= PAGE_L2_64K_MASK;
AnnaBridge 156:ff21514d8981 726 *descriptor2 |= PAGE_L2_64K_DESC;
AnnaBridge 156:ff21514d8981 727 break;
AnnaBridge 156:ff21514d8981 728
AnnaBridge 156:ff21514d8981 729 case SECTION:
AnnaBridge 156:ff21514d8981 730 //error
AnnaBridge 156:ff21514d8981 731 break;
AnnaBridge 156:ff21514d8981 732
AnnaBridge 156:ff21514d8981 733 }
AnnaBridge 156:ff21514d8981 734
AnnaBridge 156:ff21514d8981 735 return 0;
AnnaBridge 156:ff21514d8981 736
AnnaBridge 156:ff21514d8981 737 }
AnnaBridge 156:ff21514d8981 738
AnnaBridge 156:ff21514d8981 739 /** \brief Create a 1MB Section
AnnaBridge 156:ff21514d8981 740
AnnaBridge 156:ff21514d8981 741 \param [in] ttb Translation table base address
AnnaBridge 156:ff21514d8981 742 \param [in] base_address Section base address
AnnaBridge 156:ff21514d8981 743 \param [in] count Number of sections to create
AnnaBridge 156:ff21514d8981 744 \param [in] descriptor_l1 L1 descriptor (region attributes)
AnnaBridge 156:ff21514d8981 745
AnnaBridge 156:ff21514d8981 746 */
AnnaBridge 156:ff21514d8981 747 __STATIC_INLINE void __TTSection(uint32_t *ttb, uint32_t base_address, uint32_t count, uint32_t descriptor_l1)
AnnaBridge 156:ff21514d8981 748 {
AnnaBridge 156:ff21514d8981 749 uint32_t offset;
AnnaBridge 156:ff21514d8981 750 uint32_t entry;
AnnaBridge 156:ff21514d8981 751 uint32_t i;
AnnaBridge 156:ff21514d8981 752
AnnaBridge 156:ff21514d8981 753 offset = base_address >> 20;
AnnaBridge 156:ff21514d8981 754 entry = (base_address & 0xFFF00000) | descriptor_l1;
AnnaBridge 156:ff21514d8981 755
AnnaBridge 156:ff21514d8981 756 //4 bytes aligned
AnnaBridge 156:ff21514d8981 757 ttb = ttb + offset;
AnnaBridge 156:ff21514d8981 758
AnnaBridge 156:ff21514d8981 759 for (i = 0; i < count; i++ )
AnnaBridge 156:ff21514d8981 760 {
AnnaBridge 156:ff21514d8981 761 //4 bytes aligned
AnnaBridge 156:ff21514d8981 762 *ttb++ = entry;
AnnaBridge 156:ff21514d8981 763 entry += OFFSET_1M;
AnnaBridge 156:ff21514d8981 764 }
AnnaBridge 156:ff21514d8981 765 }
AnnaBridge 156:ff21514d8981 766
AnnaBridge 156:ff21514d8981 767 /** \brief Create a 4k page entry
AnnaBridge 156:ff21514d8981 768
AnnaBridge 156:ff21514d8981 769 \param [in] ttb L1 table base address
AnnaBridge 156:ff21514d8981 770 \param [in] base_address 4k base address
AnnaBridge 156:ff21514d8981 771 \param [in] count Number of 4k pages to create
AnnaBridge 156:ff21514d8981 772 \param [in] descriptor_l1 L1 descriptor (region attributes)
AnnaBridge 156:ff21514d8981 773 \param [in] ttb_l2 L2 table base address
AnnaBridge 156:ff21514d8981 774 \param [in] descriptor_l2 L2 descriptor (region attributes)
AnnaBridge 156:ff21514d8981 775
AnnaBridge 156:ff21514d8981 776 */
AnnaBridge 156:ff21514d8981 777 __STATIC_INLINE void __TTPage_4k(uint32_t *ttb, uint32_t base_address, uint32_t count, uint32_t descriptor_l1, uint32_t *ttb_l2, uint32_t descriptor_l2 )
AnnaBridge 156:ff21514d8981 778 {
AnnaBridge 156:ff21514d8981 779
AnnaBridge 156:ff21514d8981 780 uint32_t offset, offset2;
AnnaBridge 156:ff21514d8981 781 uint32_t entry, entry2;
AnnaBridge 156:ff21514d8981 782 uint32_t i;
AnnaBridge 156:ff21514d8981 783
AnnaBridge 156:ff21514d8981 784
AnnaBridge 156:ff21514d8981 785 offset = base_address >> 20;
AnnaBridge 156:ff21514d8981 786 entry = ((int)ttb_l2 & 0xFFFFFC00) | descriptor_l1;
AnnaBridge 156:ff21514d8981 787
AnnaBridge 156:ff21514d8981 788 //4 bytes aligned
AnnaBridge 156:ff21514d8981 789 ttb += offset;
AnnaBridge 156:ff21514d8981 790 //create l1_entry
AnnaBridge 156:ff21514d8981 791 *ttb = entry;
AnnaBridge 156:ff21514d8981 792
AnnaBridge 156:ff21514d8981 793 offset2 = (base_address & 0xff000) >> 12;
AnnaBridge 156:ff21514d8981 794 ttb_l2 += offset2;
AnnaBridge 156:ff21514d8981 795 entry2 = (base_address & 0xFFFFF000) | descriptor_l2;
AnnaBridge 156:ff21514d8981 796 for (i = 0; i < count; i++ )
AnnaBridge 156:ff21514d8981 797 {
AnnaBridge 156:ff21514d8981 798 //4 bytes aligned
AnnaBridge 156:ff21514d8981 799 *ttb_l2++ = entry2;
AnnaBridge 156:ff21514d8981 800 entry2 += OFFSET_4K;
AnnaBridge 156:ff21514d8981 801 }
AnnaBridge 156:ff21514d8981 802 }
AnnaBridge 156:ff21514d8981 803
AnnaBridge 156:ff21514d8981 804 /** \brief Create a 64k page entry
AnnaBridge 156:ff21514d8981 805
AnnaBridge 156:ff21514d8981 806 \param [in] ttb L1 table base address
AnnaBridge 156:ff21514d8981 807 \param [in] base_address 64k base address
AnnaBridge 156:ff21514d8981 808 \param [in] count Number of 64k pages to create
AnnaBridge 156:ff21514d8981 809 \param [in] descriptor_l1 L1 descriptor (region attributes)
AnnaBridge 156:ff21514d8981 810 \param [in] ttb_l2 L2 table base address
AnnaBridge 156:ff21514d8981 811 \param [in] descriptor_l2 L2 descriptor (region attributes)
AnnaBridge 156:ff21514d8981 812
AnnaBridge 156:ff21514d8981 813 */
AnnaBridge 156:ff21514d8981 814 __STATIC_INLINE void __TTPage_64k(uint32_t *ttb, uint32_t base_address, uint32_t count, uint32_t descriptor_l1, uint32_t *ttb_l2, uint32_t descriptor_l2 )
AnnaBridge 156:ff21514d8981 815 {
AnnaBridge 156:ff21514d8981 816 uint32_t offset, offset2;
AnnaBridge 156:ff21514d8981 817 uint32_t entry, entry2;
AnnaBridge 156:ff21514d8981 818 uint32_t i,j;
AnnaBridge 156:ff21514d8981 819
AnnaBridge 156:ff21514d8981 820
AnnaBridge 156:ff21514d8981 821 offset = base_address >> 20;
AnnaBridge 156:ff21514d8981 822 entry = ((int)ttb_l2 & 0xFFFFFC00) | descriptor_l1;
AnnaBridge 156:ff21514d8981 823
AnnaBridge 156:ff21514d8981 824 //4 bytes aligned
AnnaBridge 156:ff21514d8981 825 ttb += offset;
AnnaBridge 156:ff21514d8981 826 //create l1_entry
AnnaBridge 156:ff21514d8981 827 *ttb = entry;
AnnaBridge 156:ff21514d8981 828
AnnaBridge 156:ff21514d8981 829 offset2 = (base_address & 0xff000) >> 12;
AnnaBridge 156:ff21514d8981 830 ttb_l2 += offset2;
AnnaBridge 156:ff21514d8981 831 entry2 = (base_address & 0xFFFF0000) | descriptor_l2;
AnnaBridge 156:ff21514d8981 832 for (i = 0; i < count; i++ )
AnnaBridge 156:ff21514d8981 833 {
AnnaBridge 156:ff21514d8981 834 //create 16 entries
AnnaBridge 156:ff21514d8981 835 for (j = 0; j < 16; j++)
AnnaBridge 156:ff21514d8981 836 //4 bytes aligned
AnnaBridge 156:ff21514d8981 837 *ttb_l2++ = entry2;
AnnaBridge 156:ff21514d8981 838 entry2 += OFFSET_64K;
AnnaBridge 156:ff21514d8981 839 }
AnnaBridge 156:ff21514d8981 840 }
AnnaBridge 156:ff21514d8981 841
AnnaBridge 156:ff21514d8981 842 /*@} end of MMU_Functions */
AnnaBridge 156:ff21514d8981 843 #endif
AnnaBridge 156:ff21514d8981 844
AnnaBridge 156:ff21514d8981 845 #ifdef __cplusplus
AnnaBridge 156:ff21514d8981 846 }
AnnaBridge 156:ff21514d8981 847 #endif