bsps/arm: Workaround for Errata 845369

Add a workaround for Cortex-A9 Errata 845369: Under Very Rare Timing
Circumstances Transition into Streaming Mode Might Create Data Corruption.

Update #4114.
This commit is contained in:
Sebastian Huber
2020-10-02 11:36:20 +02:00
parent 40f23ceae6
commit 3d7da43562
2 changed files with 47 additions and 0 deletions

View File

@@ -123,6 +123,20 @@ arm_a9mpcore_start_enable_smp_in_auxiliary_control(void)
actlr |= ARM_CORTEX_A9_ACTL_SMP | ARM_CORTEX_A9_ACTL_FW;
arm_cp15_set_auxiliary_control(actlr);
}
BSP_START_TEXT_SECTION static inline void
arm_a9mpcore_start_errata_845369_handler(void)
{
uint32_t diag;
/*
* Workaround for Errata 845369: Under Very Rare Timing Circumstances
* Transition into Streaming Mode Might Create Data Corruption.
*/
diag = arm_cp15_get_diagnostic_control();
diag |= 1U << 22;
arm_cp15_set_diagnostic_control(diag);
}
#endif
BSP_START_TEXT_SECTION static inline void arm_a9mpcore_start_hook_0(void)
@@ -138,6 +152,7 @@ BSP_START_TEXT_SECTION static inline void arm_a9mpcore_start_hook_0(void)
}
#ifdef RTEMS_SMP
arm_a9mpcore_start_errata_845369_handler();
arm_a9mpcore_start_enable_smp_in_auxiliary_control();
#endif

View File

@@ -2292,6 +2292,38 @@ arm_cp15_set_counter_virtual_offset(uint64_t val)
);
}
/* Diagnostic Control Register */
ARM_CP15_TEXT_SECTION static inline uint32_t
arm_cp15_get_diagnostic_control(void)
{
ARM_SWITCH_REGISTERS;
uint32_t val;
__asm__ volatile (
ARM_SWITCH_TO_ARM
"mrc p15, 0, %[val], c15, c0, 1\n"
ARM_SWITCH_BACK
: [val] "=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
);
return val;
}
/* Diagnostic Control Register */
ARM_CP15_TEXT_SECTION static inline void
arm_cp15_set_diagnostic_control(uint32_t val)
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
ARM_SWITCH_TO_ARM
"mcr p15, 0, %[val], c15, 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).
*