mbed-os for GR-LYCHEE

Dependents:   mbed-os-example-blinky-gr-lychee GR-Boads_Camera_sample GR-Boards_Audio_Recoder GR-Boads_Camera_DisplayApp ... more

Committer:
dkato
Date:
Fri Feb 02 05:42:23 2018 +0000
Revision:
0:f782d9c66c49
mbed-os for GR-LYCHEE

Who changed what in which revision?

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