arm64: Add workaround for Cavium erratum 27456
authorAndrew Pinski <apinski@cavium.com>
Thu, 25 Feb 2016 01:44:57 +0000 (17:44 -0800)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 26 Feb 2016 15:14:27 +0000 (15:14 +0000)
On ThunderX T88 pass 1.x through 2.1 parts, broadcast TLBI
instructions may cause the icache to become corrupted if it contains
data for a non-current ASID.

This patch implements the workaround (which invalidates the local
icache when switching the mm) by using code patching.

Signed-off-by: Andrew Pinski <apinski@cavium.com>
Signed-off-by: David Daney <david.daney@cavium.com>
Reviewed-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Documentation/arm64/silicon-errata.txt
arch/arm64/Kconfig
arch/arm64/include/asm/cpufeature.h
arch/arm64/kernel/cpu_errata.c
arch/arm64/mm/proc.S

index 58b71ddf9b602a5e0e81852fbbbc54ef0c5b92cd..ba4b6acfc5457bc30d5adc519ed0869b4433dfcd 100644 (file)
@@ -56,3 +56,4 @@ stable kernels.
 |                |                 |                 |                         |
 | Cavium         | ThunderX ITS    | #22375, #24313  | CAVIUM_ERRATUM_22375    |
 | Cavium         | ThunderX GICv3  | #23154          | CAVIUM_ERRATUM_23154    |
+| Cavium         | ThunderX Core   | #27456          | CAVIUM_ERRATUM_27456    |
index b6460911dd926349cefdcabec4b1ec41fceac994..97cd2b9dafd4bbfc7154db62409dc8ebfde2e5f4 100644 (file)
@@ -435,6 +435,17 @@ config CAVIUM_ERRATUM_23154
 
          If unsure, say Y.
 
+config CAVIUM_ERRATUM_27456
+       bool "Cavium erratum 27456: Broadcast TLBI instructions may cause icache corruption"
+       default y
+       help
+         On ThunderX T88 pass 1.x through 2.1 parts, broadcast TLBI
+         instructions may cause the icache to become corrupted if it
+         contains data for a non-current ASID.  The fix is to
+         invalidate the icache when changing the mm context.
+
+         If unsure, say Y.
+
 endmenu
 
 
index be88aef01f3defe9173ec5223617c8bb587c0c46..1497163213eda897dc5410f5cb309e7c8789f52f 100644 (file)
@@ -33,8 +33,9 @@
 #define ARM64_HAS_NO_HW_PREFETCH               8
 #define ARM64_HAS_UAO                          9
 #define ARM64_ALT_PAN_NOT_UAO                  10
+#define ARM64_WORKAROUND_CAVIUM_27456          12
 
-#define ARM64_NCAPS                            11
+#define ARM64_NCAPS                            13
 
 #ifndef __ASSEMBLY__
 
index e6bc988e8dbf0f69fc4b1a48f9a7b4a89ee713f3..06afd04e02c0d05f1e0546230a5d446b8bb06b60 100644 (file)
@@ -87,6 +87,15 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
                .capability = ARM64_WORKAROUND_CAVIUM_23154,
                MIDR_RANGE(MIDR_THUNDERX, 0x00, 0x01),
        },
+#endif
+#ifdef CONFIG_CAVIUM_ERRATUM_27456
+       {
+       /* Cavium ThunderX, T88 pass 1.x - 2.1 */
+               .desc = "Cavium erratum 27456",
+               .capability = ARM64_WORKAROUND_CAVIUM_27456,
+               MIDR_RANGE(MIDR_THUNDERX, 0x00,
+                          (1 << MIDR_VARIANT_SHIFT) | 1),
+       },
 #endif
        {
        }
index 0c19534a901e616ecc5fe508ce205dc0de8fe0f4..543f5198005a9425c51e49aeeaee8a89480ee7e3 100644 (file)
@@ -25,6 +25,8 @@
 #include <asm/hwcap.h>
 #include <asm/pgtable-hwdef.h>
 #include <asm/pgtable.h>
+#include <asm/cpufeature.h>
+#include <asm/alternative.h>
 
 #include "proc-macros.S"
 
@@ -137,7 +139,17 @@ ENTRY(cpu_do_switch_mm)
        bfi     x0, x1, #48, #16                // set the ASID
        msr     ttbr0_el1, x0                   // set TTBR0
        isb
+alternative_if_not ARM64_WORKAROUND_CAVIUM_27456
        ret
+       nop
+       nop
+       nop
+alternative_else
+       ic      iallu
+       dsb     nsh
+       isb
+       ret
+alternative_endif
 ENDPROC(cpu_do_switch_mm)
 
        .pushsection ".idmap.text", "ax"