Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
7607204c
Commit
7607204c
authored
Apr 22, 2016
by
danh-arm
Browse files
Merge pull request #601 from sandrine-bailleux-arm/sb/a57-errata-workarounds
Cortex-A57 errata workarounds
parents
7ee532a1
86d8948c
Changes
4
Hide whitespace changes
Inline
Side-by-side
docs/cpu-specific-build-macros.md
View file @
7607204c
...
...
@@ -22,14 +22,19 @@ for a specific CPU on a platform.
ARM Trusted Firmware exports a series of build flags which control the
errata workarounds that are applied to each CPU by the reset handler. The
errata details can be found in the CPU specific errata documents published
by ARM. The errata workarounds are implemented for a particular revision
or a set of processor revisions. This is checked by reset handler at runtime.
Each errata workaround is identified by its
`ID`
as specified in the processor's
by ARM:
*
[
Cortex-A53 MPCore Software Developers Errata Notice
][
A53 Errata Notice
]
*
[
Cortex-A57 MPCore Software Developers Errata Notice
][
A57 Errata Notice
]
The errata workarounds are implemented for a particular revision or a set of
processor revisions. This is checked by the reset handler at runtime. Each
errata workaround is identified by its
`ID`
as specified in the processor's
errata notice document. The format of the define used to enable/disable the
errata workaround is
`ERRATA_<Processor name>_<ID>`
, where the
`Processor name`
is for example
`A57`
for the
`Cortex_A57`
CPU.
All workarounds are disabled by default. The platform is reponsible for
All workarounds are disabled by default. The platform is re
s
ponsible for
enabling these workarounds according to its requirement by defining the
errata workaround build flags in the platform specific makefile. In case
these workarounds are enabled for the wrong CPU revision then the errata
...
...
@@ -60,6 +65,21 @@ For Cortex-A57, following errata build flags are defined :
*
`ERRATA_A57_813420`
: This applies errata 813420 workaround to Cortex-A57
CPU. This needs to be enabled only for revision r0p0 of the CPU.
*
`ERRATA_A57_826974`
: This applies errata 826974 workaround to Cortex-A57
CPU. This needs to be enabled only for revision <= r1p1 of the CPU.
*
`ERRATA_A57_826977`
: This applies errata 826977 workaround to Cortex-A57
CPU. This needs to be enabled only for revision <= r1p1 of the CPU.
*
`ERRATA_A57_828024`
: This applies errata 828024 workaround to Cortex-A57
CPU. This needs to be enabled only for revision <= r1p1 of the CPU.
*
`ERRATA_A57_829520`
: This applies errata 829520 workaround to Cortex-A57
CPU. This needs to be enabled only for revision <= r1p2 of the CPU.
*
`ERRATA_A57_833471`
: This applies errata 833471 workaround to Cortex-A57
CPU. This needs to be enabled only for revision <= r1p2 of the CPU.
3.
CPU Specific optimizations
------------------------------
...
...
@@ -94,3 +114,5 @@ architecture that can be enabled by the platform as desired.
_Copyright (c) 2014-2016, ARM Limited and Contributors. All rights reserved._
[
A57 SW Optimization Guide
]:
http://infocenter.arm.com/help/topic/com.arm.doc.uan0015b/Cortex_A57_Software_Optimization_Guide_external.pdf
[
A53 Errata Notice
]:
http://infocenter.arm.com/help/topic/com.arm.doc.epm048406/index.html
[
A57 Errata Notice
]:
http://infocenter.arm.com/help/topic/com.arm.doc.epm049219/cortex_a57_mpcore_software_developers_errata_notice.pdf
include/lib/cpus/aarch64/cortex_a57.h
View file @
7607204c
...
...
@@ -61,9 +61,15 @@
******************************************************************************/
#define CPUACTLR_EL1 S3_1_C15_C2_0
/* Instruction def. */
#define CPUACTLR_DIS_LOAD_PASS_DMB (1 << 59)
#define CPUACTLR_GRE_NGRE_AS_NGNRE (1 << 54)
#define CPUACTLR_DIS_OVERREAD (1 << 52)
#define CPUACTLR_NO_ALLOC_WBWA (1 << 49)
#define CPUACTLR_DCC_AS_DCCI (1 << 44)
#define CPUACTLR_FORCE_FPSCR_FLUSH (1 << 38)
#define CPUACTLR_DIS_STREAMING (3 << 27)
#define CPUACTLR_DIS_L1_STREAMING (3 << 25)
#define CPUACTLR_DIS_INDIRECT_PREDICTOR (1 << 4)
/*******************************************************************************
* L2 Control register specific definitions.
...
...
lib/cpus/aarch64/cortex_a57.S
View file @
7607204c
...
...
@@ -167,6 +167,142 @@ disable_hint:
ret
endfunc
a57_disable_ldnp_overread
/
*
---------------------------------------------------
*
Errata
Workaround
for
Cortex
A57
Errata
#
826974
.
*
This
applies
only
to
revision
<=
r1p1
of
Cortex
A57
.
*
Inputs
:
*
x0
:
variant
[
4
:
7
]
and
revision
[
0
:
3
]
of
current
cpu
.
*
Clobbers
:
x0
-
x5
*
---------------------------------------------------
*/
func
errata_a57_826974_wa
/
*
*
Compare
x0
against
revision
r1p1
*/
cmp
x0
,
#
0x11
b.ls
apply_826974
#if LOG_LEVEL >= LOG_LEVEL_VERBOSE
b
print_revision_warning
#else
ret
#endif
apply_826974
:
mrs
x1
,
CPUACTLR_EL1
orr
x1
,
x1
,
#
CPUACTLR_DIS_LOAD_PASS_DMB
msr
CPUACTLR_EL1
,
x1
ret
endfunc
errata_a57_826974_wa
/
*
---------------------------------------------------
*
Errata
Workaround
for
Cortex
A57
Errata
#
826977
.
*
This
applies
only
to
revision
<=
r1p1
of
Cortex
A57
.
*
Inputs
:
*
x0
:
variant
[
4
:
7
]
and
revision
[
0
:
3
]
of
current
cpu
.
*
Clobbers
:
x0
-
x5
*
---------------------------------------------------
*/
func
errata_a57_826977_wa
/
*
*
Compare
x0
against
revision
r1p1
*/
cmp
x0
,
#
0x11
b.ls
apply_826977
#if LOG_LEVEL >= LOG_LEVEL_VERBOSE
b
print_revision_warning
#else
ret
#endif
apply_826977
:
mrs
x1
,
CPUACTLR_EL1
orr
x1
,
x1
,
#
CPUACTLR_GRE_NGRE_AS_NGNRE
msr
CPUACTLR_EL1
,
x1
ret
endfunc
errata_a57_826977_wa
/
*
---------------------------------------------------
*
Errata
Workaround
for
Cortex
A57
Errata
#
828024
.
*
This
applies
only
to
revision
<=
r1p1
of
Cortex
A57
.
*
Inputs
:
*
x0
:
variant
[
4
:
7
]
and
revision
[
0
:
3
]
of
current
cpu
.
*
Clobbers
:
x0
-
x5
*
---------------------------------------------------
*/
func
errata_a57_828024_wa
/
*
*
Compare
x0
against
revision
r1p1
*/
cmp
x0
,
#
0x11
b.ls
apply_828024
#if LOG_LEVEL >= LOG_LEVEL_VERBOSE
b
print_revision_warning
#else
ret
#endif
apply_828024
:
mrs
x1
,
CPUACTLR_EL1
/
*
*
Setting
the
relevant
bits
in
CPUACTLR_EL1
has
to
be
done
in
2
*
instructions
here
because
the
resulting
bitmask
doesn
't fit in a
*
16
-
bit
value
so
it
cannot
be
encoded
in
a
single
instruction
.
*/
orr
x1
,
x1
,
#
CPUACTLR_NO_ALLOC_WBWA
orr
x1
,
x1
,
#(
CPUACTLR_DIS_L1_STREAMING
|
CPUACTLR_DIS_STREAMING
)
msr
CPUACTLR_EL1
,
x1
ret
endfunc
errata_a57_828024_wa
/
*
---------------------------------------------------
*
Errata
Workaround
for
Cortex
A57
Errata
#
829520
.
*
This
applies
only
to
revision
<=
r1p2
of
Cortex
A57
.
*
Inputs
:
*
x0
:
variant
[
4
:
7
]
and
revision
[
0
:
3
]
of
current
cpu
.
*
Clobbers
:
x0
-
x5
*
---------------------------------------------------
*/
func
errata_a57_829520_wa
/
*
*
Compare
x0
against
revision
r1p2
*/
cmp
x0
,
#
0x12
b.ls
apply_829520
#if LOG_LEVEL >= LOG_LEVEL_VERBOSE
b
print_revision_warning
#else
ret
#endif
apply_829520
:
mrs
x1
,
CPUACTLR_EL1
orr
x1
,
x1
,
#
CPUACTLR_DIS_INDIRECT_PREDICTOR
msr
CPUACTLR_EL1
,
x1
ret
endfunc
errata_a57_829520_wa
/
*
---------------------------------------------------
*
Errata
Workaround
for
Cortex
A57
Errata
#
833471
.
*
This
applies
only
to
revision
<=
r1p2
of
Cortex
A57
.
*
Inputs
:
*
x0
:
variant
[
4
:
7
]
and
revision
[
0
:
3
]
of
current
cpu
.
*
Clobbers
:
x0
-
x5
*
---------------------------------------------------
*/
func
errata_a57_833471_wa
/
*
*
Compare
x0
against
revision
r1p2
*/
cmp
x0
,
#
0x12
b.ls
apply_833471
#if LOG_LEVEL >= LOG_LEVEL_VERBOSE
b
print_revision_warning
#else
ret
#endif
apply_833471
:
mrs
x1
,
CPUACTLR_EL1
orr
x1
,
x1
,
#
CPUACTLR_FORCE_FPSCR_FLUSH
msr
CPUACTLR_EL1
,
x1
ret
endfunc
errata_a57_833471_wa
/
*
-------------------------------------------------
*
The
CPU
Ops
reset
function
for
Cortex
-
A57
.
*
Clobbers
:
x0
-
x5
,
x15
,
x19
,
x30
...
...
@@ -200,6 +336,31 @@ func cortex_a57_reset_func
bl
a57_disable_ldnp_overread
#endif
#if ERRATA_A57_826974
mov
x0
,
x15
bl
errata_a57_826974_wa
#endif
#if ERRATA_A57_826977
mov
x0
,
x15
bl
errata_a57_826977_wa
#endif
#if ERRATA_A57_828024
mov
x0
,
x15
bl
errata_a57_828024_wa
#endif
#if ERRATA_A57_829520
mov
x0
,
x15
bl
errata_a57_829520_wa
#endif
#if ERRATA_A57_833471
mov
x0
,
x15
bl
errata_a57_833471_wa
#endif
/
*
---------------------------------------------
*
Enable
the
SMP
bit
.
*
---------------------------------------------
...
...
lib/cpus/cpu-ops.mk
View file @
7607204c
...
...
@@ -53,26 +53,47 @@ $(eval $(call assert_boolean,A57_DISABLE_NON_TEMPORAL_HINT))
$(eval
$(call
add_define,A57_DISABLE_NON_TEMPORAL_HINT))
# CPU Errata Build flags. These should be enabled by the
# platform if the errata needs to be applied.
# CPU Errata Build flags.
# These should be enabled by the platform if the erratum workaround needs to be
# applied.
# Flag to apply errat
a
826319 during reset. This errat
a
applies
only to
# revision <= r0p2 of the Cortex A53 cpu.
# Flag to apply errat
um
826319
workaround
during reset. This errat
um
applies
#
only to
revision <= r0p2 of the Cortex A53 cpu.
ERRATA_A53_826319
?=
0
# Flag to apply errat
a
836870 during reset. This errat
a
applies
only to
# revision <= r0p3 of the Cortex A53 cpu. From r0p4 and onwards, this
# errat
a
is enabled by default.
# Flag to apply errat
um
836870
workaround
during reset. This errat
um
applies
#
only to
revision <= r0p3 of the Cortex A53 cpu. From r0p4 and onwards, this
# errat
um workaround
is enabled by default.
ERRATA_A53_836870
?=
0
# Flag to apply errat
a
806969 during reset. This errat
a
applies
only to
# revision r0p0 of the Cortex A57 cpu.
# Flag to apply errat
um
806969
workaround
during reset. This errat
um
applies
#
only to
revision r0p0 of the Cortex A57 cpu.
ERRATA_A57_806969
?=
0
# Flag to apply errat
a
813420 during reset. This errat
a
applies
only to
# revision r0p0 of the Cortex A57 cpu.
# Flag to apply errat
um
813420
workaround
during reset. This errat
um
applies
#
only to
revision r0p0 of the Cortex A57 cpu.
ERRATA_A57_813420
?=
0
# Flag to apply erratum 826974 workaround during reset. This erratum applies
# only to revision <= r1p1 of the Cortex A57 cpu.
ERRATA_A57_826974
?=
0
# Flag to apply erratum 826977 workaround during reset. This erratum applies
# only to revision <= r1p1 of the Cortex A57 cpu.
ERRATA_A57_826977
?=
0
# Flag to apply erratum 828024 workaround during reset. This erratum applies
# only to revision <= r1p1 of the Cortex A57 cpu.
ERRATA_A57_828024
?=
0
# Flag to apply erratum 829520 workaround during reset. This erratum applies
# only to revision <= r1p2 of the Cortex A57 cpu.
ERRATA_A57_829520
?=
0
# Flag to apply erratum 833471 workaround during reset. This erratum applies
# only to revision <= r1p2 of the Cortex A57 cpu.
ERRATA_A57_833471
?=
0
# Process ERRATA_A53_826319 flag
$(eval
$(call
assert_boolean,ERRATA_A53_826319))
$(eval
$(call
add_define,ERRATA_A53_826319))
...
...
@@ -88,3 +109,23 @@ $(eval $(call add_define,ERRATA_A57_806969))
# Process ERRATA_A57_813420 flag
$(eval
$(call
assert_boolean,ERRATA_A57_813420))
$(eval
$(call
add_define,ERRATA_A57_813420))
# Process ERRATA_A57_826974 flag
$(eval
$(call
assert_boolean,ERRATA_A57_826974))
$(eval
$(call
add_define,ERRATA_A57_826974))
# Process ERRATA_A57_826977 flag
$(eval
$(call
assert_boolean,ERRATA_A57_826977))
$(eval
$(call
add_define,ERRATA_A57_826977))
# Process ERRATA_A57_828024 flag
$(eval
$(call
assert_boolean,ERRATA_A57_828024))
$(eval
$(call
add_define,ERRATA_A57_828024))
# Process ERRATA_A57_829520 flag
$(eval
$(call
assert_boolean,ERRATA_A57_829520))
$(eval
$(call
add_define,ERRATA_A57_829520))
# Process ERRATA_A57_833471 flag
$(eval
$(call
assert_boolean,ERRATA_A57_833471))
$(eval
$(call
add_define,ERRATA_A57_833471))
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment