Commit bd393704 authored by Ambroise Vincent's avatar Ambroise Vincent
Browse files

Cortex-A53: Workarounds for 819472, 824069 and 827319



The workarounds for these errata are so closely related that it is
better to only have one patch to make it easier to understand.

Change-Id: I0287fa69aefa8b72f884833f6ed0e7775ca834e9
Signed-off-by: default avatarAmbroise Vincent <ambroise.vincent@arm.com>
parent 5bd2c24f
...@@ -73,9 +73,18 @@ will enable it. ...@@ -73,9 +73,18 @@ will enable it.
For Cortex-A53, the following errata build flags are defined : For Cortex-A53, the following errata build flags are defined :
- ``ERRATA_A53_819472``: This applies errata 819472 workaround to all
CPUs. This needs to be enabled only for revision <= r0p1 of Cortex-A53.
- ``ERRATA_A53_824069``: This applies errata 824069 workaround to all
CPUs. This needs to be enabled only for revision <= r0p2 of Cortex-A53.
- ``ERRATA_A53_826319``: This applies errata 826319 workaround to Cortex-A53 - ``ERRATA_A53_826319``: This applies errata 826319 workaround to Cortex-A53
CPU. This needs to be enabled only for revision <= r0p2 of the CPU. CPU. This needs to be enabled only for revision <= r0p2 of the CPU.
- ``ERRATA_A53_827319``: This applies errata 827319 workaround to all
CPUs. This needs to be enabled only for revision <= r0p2 of Cortex-A53.
- ``ERRATA_A53_835769``: This applies erratum 835769 workaround at compile and - ``ERRATA_A53_835769``: This applies erratum 835769 workaround at compile and
link time to Cortex-A53 CPU. This needs to be enabled for some variants of link time to Cortex-A53 CPU. This needs to be enabled for some variants of
revision <= r0p4. This workaround can lead the linker to create ``*.stub`` revision <= r0p4. This workaround can lead the linker to create ``*.stub``
......
...@@ -71,7 +71,11 @@ ...@@ -71,7 +71,11 @@
/* Data Cache set/way op type defines */ /* Data Cache set/way op type defines */
#define DC_OP_ISW U(0x0) #define DC_OP_ISW U(0x0)
#define DC_OP_CISW U(0x1) #define DC_OP_CISW U(0x1)
#if ERRATA_A53_827319
#define DC_OP_CSW DC_OP_CISW
#else
#define DC_OP_CSW U(0x2) #define DC_OP_CSW U(0x2)
#endif
/******************************************************************************* /*******************************************************************************
* Generic timer memory mapped registers & offsets * Generic timer memory mapped registers & offsets
......
...@@ -328,7 +328,11 @@ DEFINE_BPIOP_FUNC(allis, BPIALLIS) ...@@ -328,7 +328,11 @@ DEFINE_BPIOP_FUNC(allis, BPIALLIS)
*/ */
DEFINE_DCOP_PARAM_FUNC(civac, DCCIMVAC) DEFINE_DCOP_PARAM_FUNC(civac, DCCIMVAC)
DEFINE_DCOP_PARAM_FUNC(ivac, DCIMVAC) DEFINE_DCOP_PARAM_FUNC(ivac, DCIMVAC)
#if ERRATA_A53_819472 || ERRATA_A53_824069 || ERRATA_A53_827319
DEFINE_DCOP_PARAM_FUNC(cvac, DCCIMVAC)
#else
DEFINE_DCOP_PARAM_FUNC(cvac, DCCMVAC) DEFINE_DCOP_PARAM_FUNC(cvac, DCCMVAC)
#endif
/* Previously defined accessor functions with incomplete register names */ /* Previously defined accessor functions with incomplete register names */
#define dsb() dsbsy() #define dsb() dsbsy()
......
...@@ -119,7 +119,11 @@ ...@@ -119,7 +119,11 @@
/* Data cache set/way op type defines */ /* Data cache set/way op type defines */
#define DCISW U(0x0) #define DCISW U(0x0)
#define DCCISW U(0x1) #define DCCISW U(0x1)
#if ERRATA_A53_827319
#define DCCSW DCCISW
#else
#define DCCSW U(0x2) #define DCCSW U(0x2)
#endif
/* ID_AA64PFR0_EL1 definitions */ /* ID_AA64PFR0_EL1 definitions */
#define ID_AA64PFR0_EL0_SHIFT U(0) #define ID_AA64PFR0_EL0_SHIFT U(0)
......
...@@ -113,6 +113,18 @@ static inline void tlbi ## _type(uint64_t v) \ ...@@ -113,6 +113,18 @@ static inline void tlbi ## _type(uint64_t v) \
} }
#endif /* ERRATA_A57_813419 */ #endif /* ERRATA_A57_813419 */
#if ERRATA_A53_819472 || ERRATA_A53_824069 || ERRATA_A53_827319
/*
* Define function for DC instruction with register parameter that enables
* the workaround for errata 819472, 824069 and 827319 of Cortex-A53.
*/
#define DEFINE_DCOP_ERRATA_A53_TYPE_PARAM_FUNC(_name, _type) \
static inline void dc ## _name(uint64_t v) \
{ \
__asm__("dc " #_type ", %0" : : "r" (v)); \
}
#endif /* ERRATA_A53_819472 || ERRATA_A53_824069 || ERRATA_A53_827319 */
DEFINE_SYSOP_TYPE_FUNC(tlbi, alle1) DEFINE_SYSOP_TYPE_FUNC(tlbi, alle1)
DEFINE_SYSOP_TYPE_FUNC(tlbi, alle1is) DEFINE_SYSOP_TYPE_FUNC(tlbi, alle1is)
DEFINE_SYSOP_TYPE_FUNC(tlbi, alle2) DEFINE_SYSOP_TYPE_FUNC(tlbi, alle2)
...@@ -143,11 +155,23 @@ DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vale3is) ...@@ -143,11 +155,23 @@ DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vale3is)
******************************************************************************/ ******************************************************************************/
DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, isw) DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, isw)
DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, cisw) DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, cisw)
#if ERRATA_A53_827319
DEFINE_DCOP_ERRATA_A53_TYPE_PARAM_FUNC(csw, cisw)
#else
DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, csw) DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, csw)
#endif
#if ERRATA_A53_819472 || ERRATA_A53_824069 || ERRATA_A53_827319
DEFINE_DCOP_ERRATA_A53_TYPE_PARAM_FUNC(cvac, civac)
#else
DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, cvac) DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, cvac)
#endif
DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, ivac) DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, ivac)
DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, civac) DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, civac)
#if ERRATA_A53_819472 || ERRATA_A53_824069 || ERRATA_A53_827319
DEFINE_DCOP_ERRATA_A53_TYPE_PARAM_FUNC(cvau, civac)
#else
DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, cvau) DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, cvau)
#endif
DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, zva) DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, zva)
/******************************************************************************* /*******************************************************************************
......
/* /*
* Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -29,6 +29,36 @@ func cortex_a53_disable_smp ...@@ -29,6 +29,36 @@ func cortex_a53_disable_smp
bx lr bx lr
endfunc cortex_a53_disable_smp endfunc cortex_a53_disable_smp
/* ---------------------------------------------------
* Errata Workaround for Cortex A53 Errata #819472.
* This applies only to revision <= r0p1 of Cortex A53.
* ---------------------------------------------------
*/
func check_errata_819472
/*
* Even though this is only needed for revision <= r0p1, it
* is always applied due to limitations of the current
* errata framework.
*/
mov r0, #ERRATA_APPLIES
bx lr
endfunc check_errata_819472
/* ---------------------------------------------------
* Errata Workaround for Cortex A53 Errata #824069.
* This applies only to revision <= r0p2 of Cortex A53.
* ---------------------------------------------------
*/
func check_errata_824069
/*
* Even though this is only needed for revision <= r0p2, it
* is always applied due to limitations of the current
* errata framework.
*/
mov r0, #ERRATA_APPLIES
bx lr
endfunc check_errata_824069
/* -------------------------------------------------- /* --------------------------------------------------
* Errata Workaround for Cortex A53 Errata #826319. * Errata Workaround for Cortex A53 Errata #826319.
* This applies only to revision <= r0p2 of Cortex A53. * This applies only to revision <= r0p2 of Cortex A53.
...@@ -59,6 +89,21 @@ func check_errata_826319 ...@@ -59,6 +89,21 @@ func check_errata_826319
b cpu_rev_var_ls b cpu_rev_var_ls
endfunc check_errata_826319 endfunc check_errata_826319
/* ---------------------------------------------------
* Errata Workaround for Cortex A53 Errata #827319.
* This applies only to revision <= r0p2 of Cortex A53.
* ---------------------------------------------------
*/
func check_errata_827319
/*
* Even though this is only needed for revision <= r0p2, it
* is always applied due to limitations of the current
* errata framework.
*/
mov r0, #ERRATA_APPLIES
bx lr
endfunc check_errata_827319
/* --------------------------------------------------------------------- /* ---------------------------------------------------------------------
* Disable the cache non-temporal hint. * Disable the cache non-temporal hint.
* *
...@@ -253,7 +298,10 @@ func cortex_a53_errata_report ...@@ -253,7 +298,10 @@ func cortex_a53_errata_report
* Report all errata. The revision-variant information is passed to * Report all errata. The revision-variant information is passed to
* checking functions of each errata. * checking functions of each errata.
*/ */
report_errata ERRATA_A53_819472, cortex_a53, 819472
report_errata ERRATA_A53_824069, cortex_a53, 824069
report_errata ERRATA_A53_826319, cortex_a53, 826319 report_errata ERRATA_A53_826319, cortex_a53, 826319
report_errata ERRATA_A53_827319, cortex_a53, 827319
report_errata ERRATA_A53_836870, cortex_a53, disable_non_temporal_hint report_errata ERRATA_A53_836870, cortex_a53, disable_non_temporal_hint
report_errata ERRATA_A53_855873, cortex_a53, 855873 report_errata ERRATA_A53_855873, cortex_a53, 855873
......
/* /*
* Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2014-2019, ARM Limited and Contributors. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -42,6 +42,36 @@ func cortex_a53_disable_smp ...@@ -42,6 +42,36 @@ func cortex_a53_disable_smp
ret ret
endfunc cortex_a53_disable_smp endfunc cortex_a53_disable_smp
/* ---------------------------------------------------
* Errata Workaround for Cortex A53 Errata #819472.
* This applies only to revision <= r0p1 of Cortex A53.
* ---------------------------------------------------
*/
func check_errata_819472
/*
* Even though this is only needed for revision <= r0p1, it
* is always applied due to limitations of the current
* errata framework.
*/
mov x0, #ERRATA_APPLIES
ret
endfunc check_errata_819472
/* ---------------------------------------------------
* Errata Workaround for Cortex A53 Errata #824069.
* This applies only to revision <= r0p2 of Cortex A53.
* ---------------------------------------------------
*/
func check_errata_824069
/*
* Even though this is only needed for revision <= r0p2, it
* is always applied due to limitations of the current
* errata framework.
*/
mov x0, #ERRATA_APPLIES
ret
endfunc check_errata_824069
/* -------------------------------------------------- /* --------------------------------------------------
* Errata Workaround for Cortex A53 Errata #826319. * Errata Workaround for Cortex A53 Errata #826319.
* This applies only to revision <= r0p2 of Cortex A53. * This applies only to revision <= r0p2 of Cortex A53.
...@@ -70,6 +100,21 @@ func check_errata_826319 ...@@ -70,6 +100,21 @@ func check_errata_826319
b cpu_rev_var_ls b cpu_rev_var_ls
endfunc check_errata_826319 endfunc check_errata_826319
/* ---------------------------------------------------
* Errata Workaround for Cortex A53 Errata #827319.
* This applies only to revision <= r0p2 of Cortex A53.
* ---------------------------------------------------
*/
func check_errata_827319
/*
* Even though this is only needed for revision <= r0p2, it
* is always applied due to limitations of the current
* errata framework.
*/
mov x0, #ERRATA_APPLIES
ret
endfunc check_errata_827319
/* --------------------------------------------------------------------- /* ---------------------------------------------------------------------
* Disable the cache non-temporal hint. * Disable the cache non-temporal hint.
* *
...@@ -304,7 +349,10 @@ func cortex_a53_errata_report ...@@ -304,7 +349,10 @@ func cortex_a53_errata_report
* Report all errata. The revision-variant information is passed to * Report all errata. The revision-variant information is passed to
* checking functions of each errata. * checking functions of each errata.
*/ */
report_errata ERRATA_A53_819472, cortex_a53, 819472
report_errata ERRATA_A53_824069, cortex_a53, 824069
report_errata ERRATA_A53_826319, cortex_a53, 826319 report_errata ERRATA_A53_826319, cortex_a53, 826319
report_errata ERRATA_A53_827319, cortex_a53, 827319
report_errata ERRATA_A53_835769, cortex_a53, 835769 report_errata ERRATA_A53_835769, cortex_a53, 835769
report_errata ERRATA_A53_836870, cortex_a53, disable_non_temporal_hint report_errata ERRATA_A53_836870, cortex_a53, disable_non_temporal_hint
report_errata ERRATA_A53_843419, cortex_a53, 843419 report_errata ERRATA_A53_843419, cortex_a53, 843419
......
...@@ -53,10 +53,22 @@ endif ...@@ -53,10 +53,22 @@ endif
# These should be enabled by the platform if the erratum workaround needs to be # These should be enabled by the platform if the erratum workaround needs to be
# applied. # applied.
# Flag to apply erratum 819472 workaround during reset. This erratum applies
# only to revision <= r0p1 of the Cortex A53 cpu.
ERRATA_A53_819472 ?=0
# Flag to apply erratum 824069 workaround during reset. This erratum applies
# only to revision <= r0p2 of the Cortex A53 cpu.
ERRATA_A53_824069 ?=0
# Flag to apply erratum 826319 workaround during reset. This erratum applies # Flag to apply erratum 826319 workaround during reset. This erratum applies
# only to revision <= r0p2 of the Cortex A53 cpu. # only to revision <= r0p2 of the Cortex A53 cpu.
ERRATA_A53_826319 ?=0 ERRATA_A53_826319 ?=0
# Flag to apply erratum 827319 workaround during reset. This erratum applies
# only to revision <= r0p2 of the Cortex A53 cpu.
ERRATA_A53_827319 ?=0
# Flag to apply erratum 835769 workaround at compile and link time. This # Flag to apply erratum 835769 workaround at compile and link time. This
# erratum applies to revision <= r0p4 of the Cortex A53 cpu. Enabling this # erratum applies to revision <= r0p4 of the Cortex A53 cpu. Enabling this
# workaround can lead the linker to create "*.stub" sections. # workaround can lead the linker to create "*.stub" sections.
...@@ -156,10 +168,22 @@ ERRATA_N1_1043202 ?=1 ...@@ -156,10 +168,22 @@ ERRATA_N1_1043202 ?=1
# higher DSU power consumption on idle. # higher DSU power consumption on idle.
ERRATA_DSU_936184 ?=0 ERRATA_DSU_936184 ?=0
# Process ERRATA_A53_819472 flag
$(eval $(call assert_boolean,ERRATA_A53_819472))
$(eval $(call add_define,ERRATA_A53_819472))
# Process ERRATA_A53_824069 flag
$(eval $(call assert_boolean,ERRATA_A53_824069))
$(eval $(call add_define,ERRATA_A53_824069))
# Process ERRATA_A53_826319 flag # Process ERRATA_A53_826319 flag
$(eval $(call assert_boolean,ERRATA_A53_826319)) $(eval $(call assert_boolean,ERRATA_A53_826319))
$(eval $(call add_define,ERRATA_A53_826319)) $(eval $(call add_define,ERRATA_A53_826319))
# Process ERRATA_A53_827319 flag
$(eval $(call assert_boolean,ERRATA_A53_827319))
$(eval $(call add_define,ERRATA_A53_827319))
# Process ERRATA_A53_835769 flag # Process ERRATA_A53_835769 flag
$(eval $(call assert_boolean,ERRATA_A53_835769)) $(eval $(call assert_boolean,ERRATA_A53_835769))
$(eval $(call add_define,ERRATA_A53_835769)) $(eval $(call add_define,ERRATA_A53_835769))
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment