diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2020-10-16 06:34:39 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2020-10-16 06:36:53 +0200 |
commit | cf1682130c096a52fff7b54b30720c6ee2732789 (patch) | |
tree | 7fa4cdfc40750fd8a542c469d1d96e94f104d943 /bsps/arm | |
parent | e7b878e42f0c358379206c025059feccd711804e (diff) |
bsps/arm: Add workaround for Errata 794072
Add a workaround for Cortex-A9 Errata 845369: A short loop including a DMB
instruction might cause a denial of service on another which executes a CP15
broadcast operation.
Close #4115.
Diffstat (limited to 'bsps/arm')
-rw-r--r-- | bsps/arm/include/bsp/arm-a9mpcore-start.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/bsps/arm/include/bsp/arm-a9mpcore-start.h b/bsps/arm/include/bsp/arm-a9mpcore-start.h index 8f9da486b5..5f870acec7 100644 --- a/bsps/arm/include/bsp/arm-a9mpcore-start.h +++ b/bsps/arm/include/bsp/arm-a9mpcore-start.h @@ -125,6 +125,21 @@ arm_a9mpcore_start_enable_smp_in_auxiliary_control(void) } BSP_START_TEXT_SECTION static inline void +arm_a9mpcore_start_errata_794072_handler(void) +{ + uint32_t diag; + + /* + * Workaround for Errata 794072: A short loop including a DMB instruction + * might cause a denial of service on another which executes a CP15 broadcast + * operation. + */ + diag = arm_cp15_get_diagnostic_control(); + diag |= 1U << 4; + arm_cp15_set_diagnostic_control(diag); +} + +BSP_START_TEXT_SECTION static inline void arm_a9mpcore_start_errata_845369_handler(void) { uint32_t diag; @@ -152,6 +167,7 @@ BSP_START_TEXT_SECTION static inline void arm_a9mpcore_start_hook_0(void) } #ifdef RTEMS_SMP + arm_a9mpcore_start_errata_794072_handler(); arm_a9mpcore_start_errata_845369_handler(); arm_a9mpcore_start_enable_smp_in_auxiliary_control(); #endif |