diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-05-31 13:59:47 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-05-31 15:20:33 +0200 |
commit | db42c079a0479c17add94e5fb5fb89db1dfa6799 (patch) | |
tree | 723eb41d04eddb021be998d57e8863806cc0d0a6 /c/src/lib/libcpu/arm/shared/include/arm-cp15.h | |
parent | smp: Add ARM support (diff) | |
download | rtems-db42c079a0479c17add94e5fb5fb89db1dfa6799.tar.bz2 |
bsps/arm: Add SMP support
Diffstat (limited to 'c/src/lib/libcpu/arm/shared/include/arm-cp15.h')
-rw-r--r-- | c/src/lib/libcpu/arm/shared/include/arm-cp15.h | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/c/src/lib/libcpu/arm/shared/include/arm-cp15.h b/c/src/lib/libcpu/arm/shared/include/arm-cp15.h index ffb2cc6573..6d7cf394cd 100644 --- a/c/src/lib/libcpu/arm/shared/include/arm-cp15.h +++ b/c/src/lib/libcpu/arm/shared/include/arm-cp15.h @@ -842,6 +842,63 @@ static inline void arm_cp15_wait_for_interrupt(void) ); } +static inline uint32_t arm_cp15_get_multiprocessor_affinity(void) +{ + ARM_SWITCH_REGISTERS; + uint32_t mpidr; + + __asm__ volatile ( + ARM_SWITCH_TO_ARM + "mrc p15, 0, %[mpidr], c0, c0, 5\n" + ARM_SWITCH_BACK + : [mpidr] "=&r" (mpidr) ARM_SWITCH_ADDITIONAL_OUTPUT + ); + + return mpidr & 0xff; +} + +static inline uint32_t arm_cortex_a9_get_multiprocessor_cpu_id(void) +{ + return arm_cp15_get_multiprocessor_affinity() & 0xff; +} + +#define ARM_CORTEX_A9_ACTL_FW (1U << 0) +#define ARM_CORTEX_A9_ACTL_L2_PREFETCH_HINT_ENABLE (1U << 1) +#define ARM_CORTEX_A9_ACTL_L1_PREFETCH_ENABLE (1U << 2) +#define ARM_CORTEX_A9_ACTL_WRITE_FULL_LINE_OF_ZEROS_MODE (1U << 3) +#define ARM_CORTEX_A9_ACTL_SMP (1U << 6) +#define ARM_CORTEX_A9_ACTL_EXCL (1U << 7) +#define ARM_CORTEX_A9_ACTL_ALLOC_IN_ONE_WAY (1U << 8) +#define ARM_CORTEX_A9_ACTL_PARITY_ON (1U << 9) + +static inline uint32_t arm_cp15_get_auxiliary_control(void) +{ + ARM_SWITCH_REGISTERS; + uint32_t val; + + __asm__ volatile ( + ARM_SWITCH_TO_ARM + "mrc p15, 0, %[val], c1, c0, 1\n" + ARM_SWITCH_BACK + : [val] "=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT + ); + + return val; +} + +static inline void arm_cp15_set_auxiliary_control(uint32_t val) +{ + ARM_SWITCH_REGISTERS; + + __asm__ volatile ( + ARM_SWITCH_TO_ARM + "mcr p15, 0, %[val], c1, c0, 1\n" + ARM_SWITCH_BACK + : ARM_SWITCH_OUTPUT + : [val] "r" (val) + ); +} + /** * @brief Sets the @a section_flags for the address range [@a begin, @a end). * |