From cf1682130c096a52fff7b54b30720c6ee2732789 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 16 Oct 2020 06:34:39 +0200 Subject: 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. --- bsps/arm/include/bsp/arm-a9mpcore-start.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) 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 @@ -124,6 +124,21 @@ arm_a9mpcore_start_enable_smp_in_auxiliary_control(void) arm_cp15_set_auxiliary_control(actlr); } +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) { @@ -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 -- cgit v1.2.3