mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

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

Committer:
mbed_official
Date:
Wed Sep 30 17:00:09 2015 +0100
Revision:
635:a11c0372f0ba
Parent:
626:ba773d547214
Synchronized with git revision d29c98dae61be0946ddf3a3c641c7726056f9452

Full URL: https://github.com/mbedmicro/mbed/commit/d29c98dae61be0946ddf3a3c641c7726056f9452/

Added support for SAMW25

Who changed what in which revision?

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