Jasper Lee / mbed_helloworld

Dependents:   twr_helloworld

Committer:
Jasper_lee
Date:
Tue Dec 23 03:35:08 2014 +0000
Revision:
0:b16d94660a33
change some io setting used in TWR-K22F120M

Who changed what in which revision?

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