|
@@ -40,6 +40,14 @@ is_affected_midr_range(const struct arm64_cpu_capabilities *entry, int scope)
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+static bool __maybe_unused
|
|
|
+is_affected_midr_range_list(const struct arm64_cpu_capabilities *entry,
|
|
|
+ int scope)
|
|
|
+{
|
|
|
+ WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
|
|
|
+ return is_midr_in_range_list(read_cpuid_id(), entry->midr_range_list);
|
|
|
+}
|
|
|
+
|
|
|
static bool __maybe_unused
|
|
|
is_kryo_midr(const struct arm64_cpu_capabilities *entry, int scope)
|
|
|
{
|
|
@@ -250,6 +258,10 @@ qcom_enable_link_stack_sanitization(const struct arm64_cpu_capabilities *entry)
|
|
|
.type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM, \
|
|
|
CAP_MIDR_RANGE(model, v_min, r_min, v_max, r_max)
|
|
|
|
|
|
+#define CAP_MIDR_RANGE_LIST(list) \
|
|
|
+ .matches = is_affected_midr_range_list, \
|
|
|
+ .midr_range_list = list
|
|
|
+
|
|
|
/* Errata affecting a range of revisions of given model variant */
|
|
|
#define ERRATA_MIDR_REV_RANGE(m, var, r_min, r_max) \
|
|
|
ERRATA_MIDR_RANGE(m, var, r_min, var, r_max)
|
|
@@ -263,6 +275,35 @@ qcom_enable_link_stack_sanitization(const struct arm64_cpu_capabilities *entry)
|
|
|
.type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM, \
|
|
|
CAP_MIDR_ALL_VERSIONS(model)
|
|
|
|
|
|
+/* Errata affecting a list of midr ranges, with same work around */
|
|
|
+#define ERRATA_MIDR_RANGE_LIST(midr_list) \
|
|
|
+ .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM, \
|
|
|
+ CAP_MIDR_RANGE_LIST(midr_list)
|
|
|
+
|
|
|
+#ifdef CONFIG_HARDEN_BRANCH_PREDICTOR
|
|
|
+
|
|
|
+/*
|
|
|
+ * List of CPUs where we need to issue a psci call to
|
|
|
+ * harden the branch predictor.
|
|
|
+ */
|
|
|
+static const struct midr_range arm64_bp_harden_smccc_cpus[] = {
|
|
|
+ MIDR_ALL_VERSIONS(MIDR_CORTEX_A57),
|
|
|
+ MIDR_ALL_VERSIONS(MIDR_CORTEX_A72),
|
|
|
+ MIDR_ALL_VERSIONS(MIDR_CORTEX_A73),
|
|
|
+ MIDR_ALL_VERSIONS(MIDR_CORTEX_A75),
|
|
|
+ MIDR_ALL_VERSIONS(MIDR_BRCM_VULCAN),
|
|
|
+ MIDR_ALL_VERSIONS(MIDR_CAVIUM_THUNDERX2),
|
|
|
+ {},
|
|
|
+};
|
|
|
+
|
|
|
+static const struct midr_range qcom_bp_harden_cpus[] = {
|
|
|
+ MIDR_ALL_VERSIONS(MIDR_QCOM_FALKOR_V1),
|
|
|
+ MIDR_ALL_VERSIONS(MIDR_QCOM_FALKOR),
|
|
|
+ {},
|
|
|
+};
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
const struct arm64_cpu_capabilities arm64_errata[] = {
|
|
|
#if defined(CONFIG_ARM64_ERRATUM_826319) || \
|
|
|
defined(CONFIG_ARM64_ERRATUM_827319) || \
|
|
@@ -406,51 +447,17 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
|
|
|
#ifdef CONFIG_HARDEN_BRANCH_PREDICTOR
|
|
|
{
|
|
|
.capability = ARM64_HARDEN_BRANCH_PREDICTOR,
|
|
|
- ERRATA_MIDR_ALL_VERSIONS(MIDR_CORTEX_A57),
|
|
|
- .cpu_enable = enable_smccc_arch_workaround_1,
|
|
|
- },
|
|
|
- {
|
|
|
- .capability = ARM64_HARDEN_BRANCH_PREDICTOR,
|
|
|
- ERRATA_MIDR_ALL_VERSIONS(MIDR_CORTEX_A72),
|
|
|
- .cpu_enable = enable_smccc_arch_workaround_1,
|
|
|
- },
|
|
|
- {
|
|
|
- .capability = ARM64_HARDEN_BRANCH_PREDICTOR,
|
|
|
- ERRATA_MIDR_ALL_VERSIONS(MIDR_CORTEX_A73),
|
|
|
- .cpu_enable = enable_smccc_arch_workaround_1,
|
|
|
- },
|
|
|
- {
|
|
|
- .capability = ARM64_HARDEN_BRANCH_PREDICTOR,
|
|
|
- ERRATA_MIDR_ALL_VERSIONS(MIDR_CORTEX_A75),
|
|
|
+ ERRATA_MIDR_RANGE_LIST(arm64_bp_harden_smccc_cpus),
|
|
|
.cpu_enable = enable_smccc_arch_workaround_1,
|
|
|
},
|
|
|
{
|
|
|
.capability = ARM64_HARDEN_BRANCH_PREDICTOR,
|
|
|
- ERRATA_MIDR_ALL_VERSIONS(MIDR_QCOM_FALKOR_V1),
|
|
|
+ ERRATA_MIDR_RANGE_LIST(qcom_bp_harden_cpus),
|
|
|
.cpu_enable = qcom_enable_link_stack_sanitization,
|
|
|
},
|
|
|
{
|
|
|
.capability = ARM64_HARDEN_BP_POST_GUEST_EXIT,
|
|
|
- ERRATA_MIDR_ALL_VERSIONS(MIDR_QCOM_FALKOR_V1),
|
|
|
- },
|
|
|
- {
|
|
|
- .capability = ARM64_HARDEN_BRANCH_PREDICTOR,
|
|
|
- ERRATA_MIDR_ALL_VERSIONS(MIDR_QCOM_FALKOR),
|
|
|
- .cpu_enable = qcom_enable_link_stack_sanitization,
|
|
|
- },
|
|
|
- {
|
|
|
- .capability = ARM64_HARDEN_BP_POST_GUEST_EXIT,
|
|
|
- ERRATA_MIDR_ALL_VERSIONS(MIDR_QCOM_FALKOR),
|
|
|
- },
|
|
|
- {
|
|
|
- .capability = ARM64_HARDEN_BRANCH_PREDICTOR,
|
|
|
- ERRATA_MIDR_ALL_VERSIONS(MIDR_BRCM_VULCAN),
|
|
|
- .cpu_enable = enable_smccc_arch_workaround_1,
|
|
|
- },
|
|
|
- {
|
|
|
- .capability = ARM64_HARDEN_BRANCH_PREDICTOR,
|
|
|
- ERRATA_MIDR_ALL_VERSIONS(MIDR_CAVIUM_THUNDERX2),
|
|
|
- .cpu_enable = enable_smccc_arch_workaround_1,
|
|
|
+ ERRATA_MIDR_RANGE_LIST(qcom_bp_harden_cpus),
|
|
|
},
|
|
|
#endif
|
|
|
{
|