xreg_cortexr5.h 16.6 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419
/******************************************************************************
* Copyright (c) 2014 - 2020 Xilinx, Inc.  All rights reserved.
* SPDX-License-Identifier: MIT
******************************************************************************/

/*****************************************************************************/
/**
*
* @file xreg_cortexr5.h
*
* This header file contains definitions for using inline assembler code. It is
* written specifically for the GNU, IAR, ARMCC compiler.
*
* All of the ARM Cortex R5 GPRs, SPRs, and Debug Registers are defined along
* with the positions of the bits within the registers.
*
* <pre>
* MODIFICATION HISTORY:
*
* Ver   Who      Date     Changes
* ----- -------- -------- -----------------------------------------------
* 5.00  pkp  02/10/14 Initial version
* </pre>
*
******************************************************************************/
#ifndef XREG_CORTEXR5_H /* prevent circular inclusions */
#define XREG_CORTEXR5_H /* by using protection macros */

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/* GPRs */
#define XREG_GPR0               r0
#define XREG_GPR1               r1
#define XREG_GPR2               r2
#define XREG_GPR3               r3
#define XREG_GPR4               r4
#define XREG_GPR5               r5
#define XREG_GPR6               r6
#define XREG_GPR7               r7
#define XREG_GPR8               r8
#define XREG_GPR9               r9
#define XREG_GPR10              r10
#define XREG_GPR11              r11
#define XREG_GPR12              r12
#define XREG_GPR13              r13
#define XREG_GPR14              r14
#define XREG_GPR15              r15
#define XREG_CPSR               cpsr

/* Coprocessor number defines */
#define XREG_CP0                0
#define XREG_CP1                1
#define XREG_CP2                2
#define XREG_CP3                3
#define XREG_CP4                4
#define XREG_CP5                5
#define XREG_CP6                6
#define XREG_CP7                7
#define XREG_CP8                8
#define XREG_CP9                9
#define XREG_CP10               10
#define XREG_CP11               11
#define XREG_CP12               12
#define XREG_CP13               13
#define XREG_CP14               14
#define XREG_CP15               15

/* Coprocessor control register defines */
#define XREG_CR0                cr0
#define XREG_CR1                cr1
#define XREG_CR2                cr2
#define XREG_CR3                cr3
#define XREG_CR4                cr4
#define XREG_CR5                cr5
#define XREG_CR6                cr6
#define XREG_CR7                cr7
#define XREG_CR8                cr8
#define XREG_CR9                cr9
#define XREG_CR10               cr10
#define XREG_CR11               cr11
#define XREG_CR12               cr12
#define XREG_CR13               cr13
#define XREG_CR14               cr14
#define XREG_CR15               cr15

/* Current Processor Status Register (CPSR) Bits */
#define XREG_CPSR_THUMB_MODE            0x20U
#define XREG_CPSR_MODE_BITS         0x1FU
#define XREG_CPSR_SYSTEM_MODE           0x1FU
#define XREG_CPSR_UNDEFINED_MODE        0x1BU
#define XREG_CPSR_DATA_ABORT_MODE       0x17U
#define XREG_CPSR_SVC_MODE          0x13U
#define XREG_CPSR_IRQ_MODE          0x12U
#define XREG_CPSR_FIQ_MODE          0x11U
#define XREG_CPSR_USER_MODE         0x10U

#define XREG_CPSR_IRQ_ENABLE            0x80U
#define XREG_CPSR_FIQ_ENABLE            0x40U

#define XREG_CPSR_N_BIT             0x80000000U
#define XREG_CPSR_Z_BIT             0x40000000U
#define XREG_CPSR_C_BIT             0x20000000U
#define XREG_CPSR_V_BIT             0x10000000U

/*MPU region definitions*/
#define REGION_32B     0x00000004U
#define REGION_64B     0x00000005U
#define REGION_128B    0x00000006U
#define REGION_256B    0x00000007U
#define REGION_512B    0x00000008U
#define REGION_1K      0x00000009U
#define REGION_2K      0x0000000AU
#define REGION_4K      0x0000000BU
#define REGION_8K      0x0000000CU
#define REGION_16K     0x0000000DU
#define REGION_32K     0x0000000EU
#define REGION_64K     0x0000000FU
#define REGION_128K    0x00000010U
#define REGION_256K    0x00000011U
#define REGION_512K    0x00000012U
#define REGION_1M      0x00000013U
#define REGION_2M      0x00000014U
#define REGION_4M      0x00000015U
#define REGION_8M      0x00000016U
#define REGION_16M     0x00000017U
#define REGION_32M     0x00000018U
#define REGION_64M     0x00000019U
#define REGION_128M    0x0000001AU
#define REGION_256M    0x0000001BU
#define REGION_512M    0x0000001CU
#define REGION_1G      0x0000001DU
#define REGION_2G      0x0000001EU
#define REGION_4G      0x0000001FU

#define REGION_EN  0x00000001U



#define SHAREABLE               0x00000004U     /*shareable */
#define STRONG_ORDERD_SHARED    0x00000000U /*strongly ordered, always shareable*/

#define DEVICE_SHARED           0x00000001U /*device, shareable*/
#define DEVICE_NONSHARED        0x00000010U /*device, non shareable*/

#define NORM_NSHARED_WT_NWA     0x00000002U     /*Outer and Inner write-through, no write-allocate non-shareable*/
#define NORM_SHARED_WT_NWA      0x00000006U     /*Outer and Inner write-through, no write-allocate shareable*/

#define NORM_NSHARED_WB_NWA     0x00000003U     /*Outer and Inner write-back, no write-allocate non shareable*/
#define NORM_SHARED_WB_NWA      0x00000007U     /*Outer and Inner write-back, no write-allocate shareable*/

#define NORM_NSHARED_NCACHE     0x00000008U     /*Outer and Inner Non cacheable  non shareable*/
#define NORM_SHARED_NCACHE      0x0000000CU     /*Outer and Inner Non cacheable shareable*/

#define NORM_NSHARED_WB_WA      0x0000000BU     /*Outer and Inner write-back non shared*/
#define NORM_SHARED_WB_WA       0x0000000FU     /*Outer and Inner write-back shared*/

/* inner and outer cache policies can be combined for different combinations */

#define NORM_IN_POLICY_NCACHE   0x00000020U /*inner non cacheable*/
#define NORM_IN_POLICY_WB_WA    0x00000021U /*inner write back write allocate*/
#define NORM_IN_POLICY_WT_NWA   0x00000022U /*inner write through no write allocate*/
#define NORM_IN_POLICY_WB_NWA   0x00000023U /*inner write back no write allocate*/

#define NORM_OUT_POLICY_NCACHE  0x00000020U /*outer non cacheable*/
#define NORM_OUT_POLICY_WB_WA   0x00000028U /*outer write back write allocate*/
#define NORM_OUT_POLICY_WT_NWA  0x00000030U /*outer write through no write allocate*/
#define NORM_OUT_POLICY_WB_NWA  0x00000038U /*outer write back no write allocate*/

#define NO_ACCESS               (0x00000000U<<8U)   /*No access*/
#define PRIV_RW_USER_NA         (0x00000001U<<8U) /*Privileged access only*/
#define PRIV_RW_USER_RO         (0x00000002U<<8U) /*Writes in User mode generate permission faults*/
#define PRIV_RW_USER_RW         (0x00000003U<<8U)   /*Full Access*/
#define PRIV_RO_USER_NA         (0x00000005U<<8U) /*Privileged eead only*/
#define PRIV_RO_USER_RO         (0x00000006U<<8U) /*Privileged/User read-only*/

#define EXECUTE_NEVER           (0x00000001U<<12U)  /* Bit 12*/


/* CP15 defines */

/* C0 Register defines */
#define XREG_CP15_MAIN_ID           "p15, 0, %0,  c0,  c0, 0"
#define XREG_CP15_CACHE_TYPE            "p15, 0, %0,  c0,  c0, 1"
#define XREG_CP15_TCM_TYPE          "p15, 0, %0,  c0,  c0, 2"
#define XREG_CP15_TLB_TYPE          "p15, 0, %0,  c0,  c0, 3"
#define XREG_CP15_MPU_TYPE          "p15, 0, %0,  c0,  c0, 4"
#define XREG_CP15_MULTI_PROC_AFFINITY       "p15, 0, %0,  c0,  c0, 5"

#define XREG_CP15_PROC_FEATURE_0        "p15, 0, %0,  c0,  c1, 0"
#define XREG_CP15_PROC_FEATURE_1        "p15, 0, %0,  c0,  c1, 1"
#define XREG_CP15_DEBUG_FEATURE_0       "p15, 0, %0,  c0,  c1, 2"
#define XREG_CP15_MEMORY_FEATURE_0      "p15, 0, %0,  c0,  c1, 4"
#define XREG_CP15_MEMORY_FEATURE_1      "p15, 0, %0,  c0,  c1, 5"
#define XREG_CP15_MEMORY_FEATURE_2      "p15, 0, %0,  c0,  c1, 6"
#define XREG_CP15_MEMORY_FEATURE_3      "p15, 0, %0,  c0,  c1, 7"

#define XREG_CP15_INST_FEATURE_0        "p15, 0, %0,  c0,  c2, 0"
#define XREG_CP15_INST_FEATURE_1        "p15, 0, %0,  c0,  c2, 1"
#define XREG_CP15_INST_FEATURE_2        "p15, 0, %0,  c0,  c2, 2"
#define XREG_CP15_INST_FEATURE_3        "p15, 0, %0,  c0,  c2, 3"
#define XREG_CP15_INST_FEATURE_4        "p15, 0, %0,  c0,  c2, 4"
#define XREG_CP15_INST_FEATURE_5        "p15, 0, %0,  c0,  c2, 5"

#define XREG_CP15_CACHE_SIZE_ID         "p15, 1, %0,  c0,  c0, 0"
#define XREG_CP15_CACHE_LEVEL_ID        "p15, 1, %0,  c0,  c0, 1"
#define XREG_CP15_AUXILARY_ID           "p15, 1, %0,  c0,  c0, 7"

#define XREG_CP15_CACHE_SIZE_SEL        "p15, 2, %0,  c0,  c0, 0"

/* C1 Register Defines */
#define XREG_CP15_SYS_CONTROL           "p15, 0, %0,  c1,  c0, 0"
#define XREG_CP15_AUX_CONTROL           "p15, 0, %0,  c1,  c0, 1"
#define XREG_CP15_CP_ACCESS_CONTROL     "p15, 0, %0,  c1,  c0, 2"


/* XREG_CP15_CONTROL bit defines */
#define XREG_CP15_CONTROL_TE_BIT        0x40000000U
#define XREG_CP15_CONTROL_AFE_BIT       0x20000000U
#define XREG_CP15_CONTROL_TRE_BIT       0x10000000U
#define XREG_CP15_CONTROL_NMFI_BIT      0x08000000U
#define XREG_CP15_CONTROL_EE_BIT        0x02000000U
#define XREG_CP15_CONTROL_HA_BIT        0x00020000U
#define XREG_CP15_CONTROL_RR_BIT        0x00004000U
#define XREG_CP15_CONTROL_V_BIT         0x00002000U
#define XREG_CP15_CONTROL_I_BIT         0x00001000U
#define XREG_CP15_CONTROL_Z_BIT         0x00000800U
#define XREG_CP15_CONTROL_SW_BIT        0x00000400U
#define XREG_CP15_CONTROL_B_BIT         0x00000080U
#define XREG_CP15_CONTROL_C_BIT         0x00000004U
#define XREG_CP15_CONTROL_A_BIT         0x00000002U
#define XREG_CP15_CONTROL_M_BIT         0x00000001U
/* C2 Register Defines */
/* Not Used */

/* C3 Register Defines */
/* Not Used */

/* C4 Register Defines */
/* Not Used */

/* C5 Register Defines */
#define XREG_CP15_DATA_FAULT_STATUS     "p15, 0, %0,  c5,  c0, 0"
#define XREG_CP15_INST_FAULT_STATUS     "p15, 0, %0,  c5,  c0, 1"

#define XREG_CP15_AUX_DATA_FAULT_STATUS     "p15, 0, %0,  c5,  c1, 0"
#define XREG_CP15_AUX_INST_FAULT_STATUS     "p15, 0, %0,  c5,  c1, 1"

/* C6 Register Defines */
#define XREG_CP15_DATA_FAULT_ADDRESS        "p15, 0, %0,  c6,  c0, 0"
#define XREG_CP15_INST_FAULT_ADDRESS        "p15, 0, %0,  c6,  c0, 2"

#define XREG_CP15_MPU_REG_BASEADDR          "p15, 0, %0,  c6,  c1, 0"
#define XREG_CP15_MPU_REG_SIZE_EN           "p15, 0, %0,  c6,  c1, 2"
#define XREG_CP15_MPU_REG_ACCESS_CTRL       "p15, 0, %0,  c6,  c1, 4"

#define XREG_CP15_MPU_MEMORY_REG_NUMBER         "p15, 0, %0,  c6,  c2, 0"

/* C7 Register Defines */
#define XREG_CP15_NOP               "p15, 0, %0,  c7,  c0, 4"

#define XREG_CP15_INVAL_IC_POU          "p15, 0, %0,  c7,  c5, 0"
#define XREG_CP15_INVAL_IC_LINE_MVA_POU     "p15, 0, %0,  c7,  c5, 1"

/* The CP15 register access below has been deprecated in favor of the new
 * isb instruction in Cortex R5.
 */
#define XREG_CP15_INST_SYNC_BARRIER     "p15, 0, %0,  c7,  c5, 4"
#define XREG_CP15_INVAL_BRANCH_ARRAY        "p15, 0, %0,  c7,  c5, 6"
#define XREG_CP15_INVAL_BRANCH_ARRAY_LINE       "p15, 0, %0,  c7,  c5, 7"

#define XREG_CP15_INVAL_DC_LINE_MVA_POC     "p15, 0, %0,  c7,  c6, 1"
#define XREG_CP15_INVAL_DC_LINE_SW      "p15, 0, %0,  c7,  c6, 2"


#define XREG_CP15_CLEAN_DC_LINE_MVA_POC     "p15, 0, %0,  c7, c10, 1"
#define XREG_CP15_CLEAN_DC_LINE_SW      "p15, 0, %0,  c7, c10, 2"

#define XREG_CP15_INVAL_DC_ALL      "p15, 0, %0,  c15, c5, 0"
/* The next two CP15 register accesses below have been deprecated in favor
 * of the new dsb and dmb instructions in Cortex R5.
 */
#define XREG_CP15_DATA_SYNC_BARRIER     "p15, 0, %0,  c7, c10, 4"
#define XREG_CP15_DATA_MEMORY_BARRIER       "p15, 0, %0,  c7, c10, 5"

#define XREG_CP15_CLEAN_DC_LINE_MVA_POU     "p15, 0, %0,  c7, c11, 1"

#define XREG_CP15_NOP2              "p15, 0, %0,  c7, c13, 1"

#define XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC   "p15, 0, %0,  c7, c14, 1"
#define XREG_CP15_CLEAN_INVAL_DC_LINE_SW    "p15, 0, %0,  c7, c14, 2"

/* C8 Register Defines */
/* Not Used */


/* C9 Register Defines */

#define XREG_CP15_ATCM_REG_SIZE_ADDR        "p15, 0, %0,  c9, c1, 1"
#define XREG_CP15_BTCM_REG_SIZE_ADDR        "p15, 0, %0,  c9, c1, 0"
#define XREG_CP15_TCM_SELECTION             "p15, 0, %0,  c9, c2, 0"

#define XREG_CP15_PERF_MONITOR_CTRL     "p15, 0, %0,  c9, c12, 0"
#define XREG_CP15_COUNT_ENABLE_SET      "p15, 0, %0,  c9, c12, 1"
#define XREG_CP15_COUNT_ENABLE_CLR      "p15, 0, %0,  c9, c12, 2"
#define XREG_CP15_V_FLAG_STATUS         "p15, 0, %0,  c9, c12, 3"
#define XREG_CP15_SW_INC            "p15, 0, %0,  c9, c12, 4"
#define XREG_CP15_EVENT_CNTR_SEL        "p15, 0, %0,  c9, c12, 5"

#define XREG_CP15_PERF_CYCLE_COUNTER        "p15, 0, %0,  c9, c13, 0"
#define XREG_CP15_EVENT_TYPE_SEL        "p15, 0, %0,  c9, c13, 1"
#define XREG_CP15_PERF_MONITOR_COUNT        "p15, 0, %0,  c9, c13, 2"

#define XREG_CP15_USER_ENABLE           "p15, 0, %0,  c9, c14, 0"
#define XREG_CP15_INTR_ENABLE_SET       "p15, 0, %0,  c9, c14, 1"
#define XREG_CP15_INTR_ENABLE_CLR       "p15, 0, %0,  c9, c14, 2"

/* C10 Register Defines */
/* Not used */

/* C11 Register Defines */
/* Not used */

/* C12 Register Defines */
/* Not used */

/* C13 Register Defines */
#define XREG_CP15_CONTEXT_ID            "p15, 0, %0, c13,  c0, 1"
#define USER_RW_THREAD_PID          "p15, 0, %0, c13,  c0, 2"
#define USER_RO_THREAD_PID          "p15, 0, %0, c13,  c0, 3"
#define USER_PRIV_THREAD_PID            "p15, 0, %0, c13,  c0, 4"

/* C14 Register Defines */
/* not used */

/* C15 Register Defines */
#define XREG_CP15_SEC_AUX_CTRL          "p15, 0, %0, c15,  c0, 0"




/* MPE register definitions */
#define XREG_FPSID              c0
#define XREG_FPSCR              c1
#define XREG_MVFR1              c6
#define XREG_MVFR0              c7
#define XREG_FPEXC              c8
#define XREG_FPINST             c9
#define XREG_FPINST2            c10

/* FPSID bits */
#define XREG_FPSID_IMPLEMENTER_BIT  (24U)
#define XREG_FPSID_IMPLEMENTER_MASK (0x000000FFU << FPSID_IMPLEMENTER_BIT)
#define XREG_FPSID_SOFTWARE     (0X00000001U << 23U)
#define XREG_FPSID_ARCH_BIT     (16U)
#define XREG_FPSID_ARCH_MASK        (0x0000000FU  << FPSID_ARCH_BIT)
#define XREG_FPSID_PART_BIT     (8U)
#define XREG_FPSID_PART_MASK        (0x000000FFU << FPSID_PART_BIT)
#define XREG_FPSID_VARIANT_BIT      (4U)
#define XREG_FPSID_VARIANT_MASK     (0x0000000FU  << FPSID_VARIANT_BIT)
#define XREG_FPSID_REV_BIT      (0U)
#define XREG_FPSID_REV_MASK     (0x0000000FU  << FPSID_REV_BIT)

/* FPSCR bits */
#define XREG_FPSCR_N_BIT        (0X00000001U << 31U)
#define XREG_FPSCR_Z_BIT        (0X00000001U << 30U)
#define XREG_FPSCR_C_BIT        (0X00000001U << 29U)
#define XREG_FPSCR_V_BIT        (0X00000001U << 28U)
#define XREG_FPSCR_QC           (0X00000001U << 27U)
#define XREG_FPSCR_AHP          (0X00000001U << 26U)
#define XREG_FPSCR_DEFAULT_NAN      (0X00000001U << 25U)
#define XREG_FPSCR_FLUSHTOZERO      (0X00000001U << 24U)
#define XREG_FPSCR_ROUND_NEAREST    (0X00000000U << 22U)
#define XREG_FPSCR_ROUND_PLUSINF    (0X00000001U << 22U)
#define XREG_FPSCR_ROUND_MINUSINF   (0X00000002U << 22U)
#define XREG_FPSCR_ROUND_TOZERO     (0X00000003U << 22U)
#define XREG_FPSCR_RMODE_BIT        (22U)
#define XREG_FPSCR_RMODE_MASK       (0X00000003U << FPSCR_RMODE_BIT)
#define XREG_FPSCR_STRIDE_BIT       (20U)
#define XREG_FPSCR_STRIDE_MASK      (0X00000003U << FPSCR_STRIDE_BIT)
#define XREG_FPSCR_LENGTH_BIT       (16U)
#define XREG_FPSCR_LENGTH_MASK      (0X00000007U << FPSCR_LENGTH_BIT)
#define XREG_FPSCR_IDC          (0X00000001U << 7U)
#define XREG_FPSCR_IXC          (0X00000001U << 4U)
#define XREG_FPSCR_UFC          (0X00000001U << 3U)
#define XREG_FPSCR_OFC          (0X00000001U << 2U)
#define XREG_FPSCR_DZC          (0X00000001U << 1U)
#define XREG_FPSCR_IOC          (0X00000001U << 0U)

/* MVFR0 bits */
#define XREG_MVFR0_RMODE_BIT        (28U)
#define XREG_MVFR0_RMODE_MASK       (0x0000000FU << XREG_MVFR0_RMODE_BIT)
#define XREG_MVFR0_SHORT_VEC_BIT    (24U)
#define XREG_MVFR0_SHORT_VEC_MASK   (0x0000000FU << XREG_MVFR0_SHORT_VEC_BIT)
#define XREG_MVFR0_SQRT_BIT     (20U)
#define XREG_MVFR0_SQRT_MASK        (0x0000000FU << XREG_MVFR0_SQRT_BIT)
#define XREG_MVFR0_DIVIDE_BIT       (16U)
#define XREG_MVFR0_DIVIDE_MASK      (0x0000000FU << XREG_MVFR0_DIVIDE_BIT)
#define XREG_MVFR0_EXEC_TRAP_BIT    (12U)
#define XREG_MVFR0_EXEC_TRAP_MASK   (0x0000000FU << XREG_MVFR0_EXEC_TRAP_BIT)
#define XREG_MVFR0_DP_BIT       (8U)
#define XREG_MVFR0_DP_MASK      (0x0000000FU << XREG_MVFR0_DP_BIT)
#define XREG_MVFR0_SP_BIT       (4U)
#define XREG_MVFR0_SP_MASK      (0x0000000FU << XREG_MVFR0_SP_BIT)
#define XREG_MVFR0_A_SIMD_BIT       (0U)
#define XREG_MVFR0_A_SIMD_MASK      (0x0000000FU << MVFR0_A_SIMD_BIT)

/* FPEXC bits */
#define XREG_FPEXC_EX           (0X00000001U << 31U)
#define XREG_FPEXC_EN           (0X00000001U << 30U)
#define XREG_FPEXC_DEX          (0X00000001U << 29U)


#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* XREG_CORTEXR5_H */