Commit 62bbfe82 authored by johpow01's avatar johpow01 Committed by John Powell
Browse files

Workaround for Cortex A77 erratum 1800714

Cortex A77 erratum 1800714 is a Cat B erratum, present in older
revisions of the Cortex A77 processor core.  The workaround is to
set a bit in the ECTLR_EL1 system register, which disables allocation
of splintered pages in the L2 TLB.

Since this is the first errata workaround implemented for Cortex A77,
this patch also adds the required cortex_a77_reset_func in the file
lib/cpus/aarch64/cortex_a77.S.

This errata is explained in this SDEN:
https://static.docs.arm.com/101992/0010/Arm_Cortex_A77_MP074_Software_Developer_Errata_Notice_v10.pdf

Signed-off-by: default avatarJohn Powell <john.powell@arm.com>
Change-Id: I844de34ee1bd0268f80794e2d9542de2f30fd3ad
parent c275ea18
...@@ -233,6 +233,11 @@ For Cortex-A76, the following errata build flags are defined : ...@@ -233,6 +233,11 @@ For Cortex-A76, the following errata build flags are defined :
- ``ERRATA_A76_1800710``: This applies errata 1800710 workaround to Cortex-A76 - ``ERRATA_A76_1800710``: This applies errata 1800710 workaround to Cortex-A76
CPU. This needs to be enabled only for revision <= r4p0 of the CPU. CPU. This needs to be enabled only for revision <= r4p0 of the CPU.
For Cortex-A77, the following errata build flags are defined :
- ``ERRATA_A77_1800714``: This applies errata 1800714 workaround to Cortex-A77
CPU. This needs to be enabled only for revision <= r1p1 of the CPU.
For Cortex-A78, the following errata build flags are defined : For Cortex-A78, the following errata build flags are defined :
- ``ERRATA_A78_1688305``: This applies errata 1688305 workaround to Cortex-A78 - ``ERRATA_A78_1688305``: This applies errata 1688305 workaround to Cortex-A78
......
/* /*
* Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2018-2020, ARM Limited and Contributors. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
* CPU Extended Control register specific definitions. * CPU Extended Control register specific definitions.
******************************************************************************/ ******************************************************************************/
#define CORTEX_A77_CPUECTLR_EL1 S3_0_C15_C1_4 #define CORTEX_A77_CPUECTLR_EL1 S3_0_C15_C1_4
#define CORTEX_A77_CPUECTLR_EL1_BIT_53 (ULL(1) << 53)
/******************************************************************************* /*******************************************************************************
* CPU Power Control register specific definitions. * CPU Power Control register specific definitions.
......
/* /*
* Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2018-2020, ARM Limited and Contributors. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -21,6 +21,53 @@ ...@@ -21,6 +21,53 @@
#error "Cortex-A77 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0" #error "Cortex-A77 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
#endif #endif
/* --------------------------------------------------
* Errata Workaround for Cortex A77 Errata #1800714.
* This applies to revision <= r1p1 of Cortex A77.
* Inputs:
* x0: variant[4:7] and revision[0:3] of current cpu.
* Shall clobber: x0-x17
* --------------------------------------------------
*/
func errata_a77_1800714_wa
/* Compare x0 against revision <= r1p1 */
mov x17, x30
bl check_errata_1800714
cbz x0, 1f
/* Disable allocation of splintered pages in the L2 TLB */
mrs x1, CORTEX_A77_CPUECTLR_EL1
orr x1, x1, CORTEX_A77_CPUECTLR_EL1_BIT_53
msr CORTEX_A77_CPUECTLR_EL1, x1
isb
1:
ret x17
endfunc errata_a77_1800714_wa
func check_errata_1800714
/* Applies to everything <= r1p1 */
mov x1, #0x11
b cpu_rev_var_ls
endfunc check_errata_1800714
/* -------------------------------------------------
* The CPU Ops reset function for Cortex-A77.
* Shall clobber: x0-x19
* -------------------------------------------------
*/
func cortex_a77_reset_func
mov x19, x30
bl cpu_get_rev_var
mov x18, x0
#if ERRATA_A77_1800714
mov x0, x18
bl errata_a77_1800714_wa
#endif
ret x19
endfunc cortex_a77_reset_func
/* --------------------------------------------- /* ---------------------------------------------
* HW will do the cache maintenance while powering down * HW will do the cache maintenance while powering down
* --------------------------------------------- * ---------------------------------------------
...@@ -42,6 +89,18 @@ endfunc cortex_a77_core_pwr_dwn ...@@ -42,6 +89,18 @@ endfunc cortex_a77_core_pwr_dwn
* Errata printing function for Cortex-A77. Must follow AAPCS. * Errata printing function for Cortex-A77. Must follow AAPCS.
*/ */
func cortex_a77_errata_report func cortex_a77_errata_report
stp x8, x30, [sp, #-16]!
bl cpu_get_rev_var
mov x8, x0
/*
* Report all errata. The revision-variant information is passed to
* checking functions of each errata.
*/
report_errata ERRATA_A77_1800714, cortex_a77, 1800714
ldp x8, x30, [sp], #16
ret ret
endfunc cortex_a77_errata_report endfunc cortex_a77_errata_report
#endif #endif
...@@ -67,5 +126,5 @@ func cortex_a77_cpu_reg_dump ...@@ -67,5 +126,5 @@ func cortex_a77_cpu_reg_dump
endfunc cortex_a77_cpu_reg_dump endfunc cortex_a77_cpu_reg_dump
declare_cpu_ops cortex_a77, CORTEX_A77_MIDR, \ declare_cpu_ops cortex_a77, CORTEX_A77_MIDR, \
CPU_NO_RESET_FUNC, \ cortex_a77_reset_func, \
cortex_a77_core_pwr_dwn cortex_a77_core_pwr_dwn
...@@ -258,6 +258,10 @@ ERRATA_A76_1791580 ?=0 ...@@ -258,6 +258,10 @@ ERRATA_A76_1791580 ?=0
# only to revision <= r4p0 of the Cortex A76 cpu. # only to revision <= r4p0 of the Cortex A76 cpu.
ERRATA_A76_1800710 ?=0 ERRATA_A76_1800710 ?=0
# Flag to apply erratum 1800714 workaround during reset. This erratum applies
# only to revision <= r1p1 of the Cortex A77 cpu.
ERRATA_A77_1800714 ?=0
# Flag to apply erratum 1688305 workaround during reset. This erratum applies # Flag to apply erratum 1688305 workaround during reset. This erratum applies
# to revisions r0p0 - r1p0 of the A78 cpu. # to revisions r0p0 - r1p0 of the A78 cpu.
ERRATA_A78_1688305 ?=0 ERRATA_A78_1688305 ?=0
...@@ -503,6 +507,10 @@ $(eval $(call add_define,ERRATA_A76_1791580)) ...@@ -503,6 +507,10 @@ $(eval $(call add_define,ERRATA_A76_1791580))
$(eval $(call assert_boolean,ERRATA_A76_1800710)) $(eval $(call assert_boolean,ERRATA_A76_1800710))
$(eval $(call add_define,ERRATA_A76_1800710)) $(eval $(call add_define,ERRATA_A76_1800710))
# Process ERRATA_A77_1800714 flag
$(eval $(call assert_boolean,ERRATA_A77_1800714))
$(eval $(call add_define,ERRATA_A77_1800714))
# Process ERRATA_A78_1688305 flag # Process ERRATA_A78_1688305 flag
$(eval $(call assert_boolean,ERRATA_A78_1688305)) $(eval $(call assert_boolean,ERRATA_A78_1688305))
$(eval $(call add_define,ERRATA_A78_1688305)) $(eval $(call add_define,ERRATA_A78_1688305))
......
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