@@ -866,6 +866,25 @@ static __always_inline bool system_supports_mpam_hcr(void)
return alternative_has_cap_unlikely(ARM64_MPAM_HCR);
}
+static inline bool system_supports_bbmlv2(void)
+{
+ return cpus_have_final_boot_cap(ARM64_HAS_BBMLV2);
+}
+
+static inline bool bbmlv2_available(void)
+{
+ static const struct midr_range support_bbmlv2[] = {
+ MIDR_ALL_VERSIONS(MIDR_AMPERE1),
+ MIDR_ALL_VERSIONS(MIDR_AMPERE1A),
+ {}
+ };
+
+ if (is_midr_in_range_list(read_cpuid_id(), support_bbmlv2))
+ return true;
+
+ return false;
+}
+
int do_emulate_mrs(struct pt_regs *regs, u32 sys_reg, u32 rt);
bool try_emulate_mrs(struct pt_regs *regs, u32 isn);
@@ -1889,6 +1889,11 @@ static bool has_lpa2(const struct arm64_cpu_capabilities *entry, int scope)
}
#endif
+static bool has_bbmlv2(const struct arm64_cpu_capabilities *entry, int scope)
+{
+ return bbmlv2_available();
+}
+
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
#define KPTI_NG_TEMP_VA (-(1UL << PMD_SHIFT))
@@ -2990,6 +2995,12 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
ARM64_CPUID_FIELDS(ID_AA64PFR1_EL1, GCS, IMP)
},
#endif
+ {
+ .desc = "BBM Level 2",
+ .capability = ARM64_HAS_BBMLV2,
+ .type = ARM64_CPUCAP_BOOT_CPU_FEATURE,
+ .matches = has_bbmlv2,
+ },
{},
};
@@ -14,6 +14,7 @@ HAS_ADDRESS_AUTH_ARCH_QARMA5
HAS_ADDRESS_AUTH_IMP_DEF
HAS_AMU_EXTN
HAS_ARMv8_4_TTL
+HAS_BBMLV2
HAS_CACHE_DIC
HAS_CACHE_IDC
HAS_CNP
FEAT_BBM level 2 allow changing block size of a translation with relaxed TLB flushing. But it may incur TLB conflict abort. We can handle the abort in kernel, however it is hard to guarantee the recuesive TLB conflct will never happen in the handling itself. Some implementations can handle TLB conflict gracefully without fault handler in kernel so FEAT_BBM level 2 can be enabled on those implementations safely. Look up MIDR to filter out those CPUs. AmpereOne is one of them. Suggested-by: Will Deacon <will@kernel.org> Signed-off-by: Yang Shi <yang@os.amperecomputing.com> --- arch/arm64/include/asm/cpufeature.h | 19 +++++++++++++++++++ arch/arm64/kernel/cpufeature.c | 11 +++++++++++ arch/arm64/tools/cpucaps | 1 + 3 files changed, 31 insertions(+)