[rtems commit] bsps/arm: Add workaround for Errata 794072

Sebastian Huber sebh at rtems.org
Fri Oct 16 04:48:22 UTC 2020


Module:    rtems
Branch:    5
Commit:    e71e271ce15504559f3bda019f5adc9ddb4fd0bf
Changeset: http://git.rtems.org/rtems/commit/?id=e71e271ce15504559f3bda019f5adc9ddb4fd0bf

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri Oct 16 06:34:39 2020 +0200

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 #4114.

---

 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 83c84f1..724b335 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



More information about the vc mailing list