Biomimetics MBED Library w/ Added Support for CAN3

Dependents:   CAN_TEST SPIne_Plus_DYNO_SENSORS SPIne_Plus_v2 SPIne_Plus_Dyno_v2

Committer:
saloutos
Date:
Thu Nov 26 04:08:56 2020 +0000
Revision:
0:083111ae2a11
first commit of leaned mbed dev lib

Who changed what in which revision?

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