]> git.baikalelectronics.ru Git - arm-tf.git/commitdiff
Workaround for Cortex A77 erratum 1800714
authorjohpow01 <john.powell@arm.com>
Wed, 3 Jun 2020 20:23:31 +0000 (15:23 -0500)
committerJohn Powell <john.powell@arm.com>
Thu, 25 Jun 2020 14:50:58 +0000 (14:50 +0000)
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: John Powell <john.powell@arm.com>
Change-Id: I844de34ee1bd0268f80794e2d9542de2f30fd3ad

docs/design/cpu-specific-build-macros.rst
include/lib/cpus/aarch64/cortex_a77.h
lib/cpus/aarch64/cortex_a77.S
lib/cpus/cpu-ops.mk

index 264d0c68830656fe6ef0674df9b8f56e6cc00956..6b6c639336ccefabc8f03bea5f83f568b7e7d6ea 100644 (file)
@@ -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
    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 :
 
 -  ``ERRATA_A78_1688305``: This applies errata 1688305 workaround to Cortex-A78
index 0467ef3bb5cb4e209ac15f834f610eb45f8c91cb..bbd647c60786637d1ca223da5ef433e12f648cff 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * 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
  */
@@ -16,6 +16,7 @@
  * CPU Extended Control register specific definitions.
  ******************************************************************************/
 #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.
index f3fd5e19696c9a46450d612a6d3edfc2b45b8482..0c30460d4d9489e6482bbc181046ce813f6fdda5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * 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
  */
 #error "Cortex-A77 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
 #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
         * ---------------------------------------------
@@ -42,6 +89,18 @@ endfunc cortex_a77_core_pwr_dwn
  * Errata printing function for Cortex-A77. Must follow AAPCS.
  */
 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
 endfunc cortex_a77_errata_report
 #endif
@@ -67,5 +126,5 @@ func cortex_a77_cpu_reg_dump
 endfunc cortex_a77_cpu_reg_dump
 
 declare_cpu_ops cortex_a77, CORTEX_A77_MIDR, \
-       CPU_NO_RESET_FUNC, \
+       cortex_a77_reset_func, \
        cortex_a77_core_pwr_dwn
index e80900056b925722140d554599600be03cb5340d..e49437569e8660fcce1a7e4b17f1776536ca95da 100644 (file)
@@ -258,6 +258,10 @@ ERRATA_A76_1791580 ?=0
 # only to revision <= r4p0 of the Cortex A76 cpu.
 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
 # to revisions r0p0 - r1p0 of the A78 cpu.
 ERRATA_A78_1688305     ?=0
@@ -503,6 +507,10 @@ $(eval $(call add_define,ERRATA_A76_1791580))
 $(eval $(call assert_boolean,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
 $(eval $(call assert_boolean,ERRATA_A78_1688305))
 $(eval $(call add_define,ERRATA_A78_1688305))