Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64...
[linux-2.6-microblaze.git] / arch / arm64 / kernel / cpu_errata.c
index 6ad715d..09ac548 100644 (file)
@@ -135,7 +135,7 @@ static void __install_bp_hardening_cb(bp_hardening_cb_t fn,
                                      const char *hyp_vecs_start,
                                      const char *hyp_vecs_end)
 {
-       static DEFINE_SPINLOCK(bp_lock);
+       static DEFINE_RAW_SPINLOCK(bp_lock);
        int cpu, slot = -1;
 
        /*
@@ -147,7 +147,7 @@ static void __install_bp_hardening_cb(bp_hardening_cb_t fn,
                return;
        }
 
-       spin_lock(&bp_lock);
+       raw_spin_lock(&bp_lock);
        for_each_possible_cpu(cpu) {
                if (per_cpu(bp_hardening_data.fn, cpu) == fn) {
                        slot = per_cpu(bp_hardening_data.hyp_vectors_slot, cpu);
@@ -163,7 +163,7 @@ static void __install_bp_hardening_cb(bp_hardening_cb_t fn,
 
        __this_cpu_write(bp_hardening_data.hyp_vectors_slot, slot);
        __this_cpu_write(bp_hardening_data.fn, fn);
-       spin_unlock(&bp_lock);
+       raw_spin_unlock(&bp_lock);
 }
 #else
 #define __smccc_workaround_1_smc_start         NULL
@@ -507,38 +507,6 @@ cpu_enable_cache_maint_trap(const struct arm64_cpu_capabilities *__unused)
        .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,                 \
        CAP_MIDR_RANGE_LIST(midr_list)
 
-/*
- * Generic helper for handling capabilties with multiple (match,enable) pairs
- * of call backs, sharing the same capability bit.
- * Iterate over each entry to see if at least one matches.
- */
-static bool __maybe_unused
-multi_entry_cap_matches(const struct arm64_cpu_capabilities *entry, int scope)
-{
-       const struct arm64_cpu_capabilities *caps;
-
-       for (caps = entry->match_list; caps->matches; caps++)
-               if (caps->matches(caps, scope))
-                       return true;
-
-       return false;
-}
-
-/*
- * Take appropriate action for all matching entries in the shared capability
- * entry.
- */
-static void __maybe_unused
-multi_entry_cap_cpu_enable(const struct arm64_cpu_capabilities *entry)
-{
-       const struct arm64_cpu_capabilities *caps;
-
-       for (caps = entry->match_list; caps->matches; caps++)
-               if (caps->matches(caps, SCOPE_LOCAL_CPU) &&
-                   caps->cpu_enable)
-                       caps->cpu_enable(caps);
-}
-
 #ifdef CONFIG_HARDEN_BRANCH_PREDICTOR
 
 /*
@@ -584,24 +552,63 @@ static const struct midr_range arm64_repeat_tlbi_cpus[] = {
 
 #endif
 
-const struct arm64_cpu_capabilities arm64_errata[] = {
+#ifdef CONFIG_CAVIUM_ERRATUM_27456
+static const struct midr_range cavium_erratum_27456_cpus[] = {
+       /* Cavium ThunderX, T88 pass 1.x - 2.1 */
+       MIDR_RANGE(MIDR_THUNDERX, 0, 0, 1, 1),
+       /* Cavium ThunderX, T81 pass 1.0 */
+       MIDR_REV(MIDR_THUNDERX_81XX, 0, 0),
+       {},
+};
+#endif
+
+#ifdef CONFIG_CAVIUM_ERRATUM_30115
+static const struct midr_range cavium_erratum_30115_cpus[] = {
+       /* Cavium ThunderX, T88 pass 1.x - 2.2 */
+       MIDR_RANGE(MIDR_THUNDERX, 0, 0, 1, 2),
+       /* Cavium ThunderX, T81 pass 1.0 - 1.2 */
+       MIDR_REV_RANGE(MIDR_THUNDERX_81XX, 0, 0, 2),
+       /* Cavium ThunderX, T83 pass 1.0 */
+       MIDR_REV(MIDR_THUNDERX_83XX, 0, 0),
+       {},
+};
+#endif
+
+#ifdef CONFIG_QCOM_FALKOR_ERRATUM_1003
+static const struct arm64_cpu_capabilities qcom_erratum_1003_list[] = {
+       {
+               ERRATA_MIDR_REV(MIDR_QCOM_FALKOR_V1, 0, 0),
+       },
+       {
+               .midr_range.model = MIDR_QCOM_KRYO,
+               .matches = is_kryo_midr,
+       },
+       {},
+};
+#endif
+
+#ifdef CONFIG_ARM64_WORKAROUND_CLEAN_CACHE
+static const struct midr_range workaround_clean_cache[] = {
 #if    defined(CONFIG_ARM64_ERRATUM_826319) || \
        defined(CONFIG_ARM64_ERRATUM_827319) || \
        defined(CONFIG_ARM64_ERRATUM_824069)
-       {
-       /* Cortex-A53 r0p[012] */
-               .desc = "ARM errata 826319, 827319, 824069",
-               .capability = ARM64_WORKAROUND_CLEAN_CACHE,
-               ERRATA_MIDR_REV_RANGE(MIDR_CORTEX_A53, 0, 0, 2),
-               .cpu_enable = cpu_enable_cache_maint_trap,
-       },
+       /* Cortex-A53 r0p[012]: ARM errata 826319, 827319, 824069 */
+       MIDR_REV_RANGE(MIDR_CORTEX_A53, 0, 0, 2),
+#endif
+#ifdef CONFIG_ARM64_ERRATUM_819472
+       /* Cortex-A53 r0p[01] : ARM errata 819472 */
+       MIDR_REV_RANGE(MIDR_CORTEX_A53, 0, 0, 1),
 #endif
-#ifdef CONFIG_ARM64_ERRATUM_819472
+       {},
+};
+#endif
+
+const struct arm64_cpu_capabilities arm64_errata[] = {
+#ifdef CONFIG_ARM64_WORKAROUND_CLEAN_CACHE
        {
-       /* Cortex-A53 r0p[01] */
-               .desc = "ARM errata 819472",
+               .desc = "ARM errata 826319, 827319, 824069, 819472",
                .capability = ARM64_WORKAROUND_CLEAN_CACHE,
-               ERRATA_MIDR_REV_RANGE(MIDR_CORTEX_A53, 0, 0, 1),
+               ERRATA_MIDR_RANGE_LIST(workaround_clean_cache),
                .cpu_enable = cpu_enable_cache_maint_trap,
        },
 #endif
@@ -652,40 +659,16 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
 #endif
 #ifdef CONFIG_CAVIUM_ERRATUM_27456
        {
-       /* Cavium ThunderX, T88 pass 1.x - 2.1 */
-               .desc = "Cavium erratum 27456",
-               .capability = ARM64_WORKAROUND_CAVIUM_27456,
-               ERRATA_MIDR_RANGE(MIDR_THUNDERX,
-                                 0, 0,
-                                 1, 1),
-       },
-       {
-       /* Cavium ThunderX, T81 pass 1.0 */
                .desc = "Cavium erratum 27456",
                .capability = ARM64_WORKAROUND_CAVIUM_27456,
-               ERRATA_MIDR_REV(MIDR_THUNDERX_81XX, 0, 0),
+               ERRATA_MIDR_RANGE_LIST(cavium_erratum_27456_cpus),
        },
 #endif
 #ifdef CONFIG_CAVIUM_ERRATUM_30115
        {
-       /* Cavium ThunderX, T88 pass 1.x - 2.2 */
                .desc = "Cavium erratum 30115",
                .capability = ARM64_WORKAROUND_CAVIUM_30115,
-               ERRATA_MIDR_RANGE(MIDR_THUNDERX,
-                                     0, 0,
-                                     1, 2),
-       },
-       {
-       /* Cavium ThunderX, T81 pass 1.0 - 1.2 */
-               .desc = "Cavium erratum 30115",
-               .capability = ARM64_WORKAROUND_CAVIUM_30115,
-               ERRATA_MIDR_REV_RANGE(MIDR_THUNDERX_81XX, 0, 0, 2),
-       },
-       {
-       /* Cavium ThunderX, T83 pass 1.0 */
-               .desc = "Cavium erratum 30115",
-               .capability = ARM64_WORKAROUND_CAVIUM_30115,
-               ERRATA_MIDR_REV(MIDR_THUNDERX_83XX, 0, 0),
+               ERRATA_MIDR_RANGE_LIST(cavium_erratum_30115_cpus),
        },
 #endif
        {
@@ -697,16 +680,10 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
        },
 #ifdef CONFIG_QCOM_FALKOR_ERRATUM_1003
        {
-               .desc = "Qualcomm Technologies Falkor erratum 1003",
-               .capability = ARM64_WORKAROUND_QCOM_FALKOR_E1003,
-               ERRATA_MIDR_REV(MIDR_QCOM_FALKOR_V1, 0, 0),
-       },
-       {
-               .desc = "Qualcomm Technologies Kryo erratum 1003",
+               .desc = "Qualcomm Technologies Falkor/Kryo erratum 1003",
                .capability = ARM64_WORKAROUND_QCOM_FALKOR_E1003,
-               .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
-               .midr_range.model = MIDR_QCOM_KRYO,
-               .matches = is_kryo_midr,
+               .matches = cpucap_multi_entry_cap_matches,
+               .match_list = qcom_erratum_1003_list,
        },
 #endif
 #ifdef CONFIG_ARM64_WORKAROUND_REPEAT_TLBI
@@ -753,6 +730,14 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
                .capability = ARM64_WORKAROUND_1188873,
                ERRATA_MIDR_RANGE(MIDR_CORTEX_A76, 0, 0, 2, 0),
        },
+#endif
+#ifdef CONFIG_ARM64_ERRATUM_1165522
+       {
+               /* Cortex-A76 r0p0 to r2p0 */
+               .desc = "ARM erratum 1165522",
+               .capability = ARM64_WORKAROUND_1165522,
+               ERRATA_MIDR_RANGE(MIDR_CORTEX_A76, 0, 0, 2, 0),
+       },
 #endif
        {
        }