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 Jul 01 09:45:11 2015 +0100
Revision:
579:53297373a894
Parent:
390:35c2c1cf29cd
Child:
626:ba773d547214
Synchronized with git revision d5b4d2ab9c47edb4dc5776e7177b0c2263459081

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

Initial version of drivers for SAMR21

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