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.
This commit is contained in:
Sebastian Huber
2020-10-16 06:34:39 +02:00
parent 3d7da43562
commit e71e271ce1

View File

@@ -124,6 +124,21 @@ arm_a9mpcore_start_enable_smp_in_auxiliary_control(void)
arm_cp15_set_auxiliary_control(actlr); 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 BSP_START_TEXT_SECTION static inline void
arm_a9mpcore_start_errata_845369_handler(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 #ifdef RTEMS_SMP
arm_a9mpcore_start_errata_794072_handler();
arm_a9mpcore_start_errata_845369_handler(); arm_a9mpcore_start_errata_845369_handler();
arm_a9mpcore_start_enable_smp_in_auxiliary_control(); arm_a9mpcore_start_enable_smp_in_auxiliary_control();
#endif #endif