|
@@ -145,6 +145,7 @@ static const struct arm64_ftr_bits ftr_id_aa64isar1[] = {
|
|
|
};
|
|
|
|
|
|
static const struct arm64_ftr_bits ftr_id_aa64pfr0[] = {
|
|
|
+ ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_SVE_SHIFT, 4, 0),
|
|
|
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_GIC_SHIFT, 4, 0),
|
|
|
S_ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_ASIMD_SHIFT, 4, ID_AA64PFR0_ASIMD_NI),
|
|
|
S_ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_FP_SHIFT, 4, ID_AA64PFR0_FP_NI),
|
|
@@ -948,6 +949,19 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
.min_field_value = 1,
|
|
|
},
|
|
|
#endif
|
|
|
+#ifdef CONFIG_ARM64_SVE
|
|
|
+ {
|
|
|
+ .desc = "Scalable Vector Extension",
|
|
|
+ .capability = ARM64_SVE,
|
|
|
+ .def_scope = SCOPE_SYSTEM,
|
|
|
+ .sys_reg = SYS_ID_AA64PFR0_EL1,
|
|
|
+ .sign = FTR_UNSIGNED,
|
|
|
+ .field_pos = ID_AA64PFR0_SVE_SHIFT,
|
|
|
+ .min_field_value = ID_AA64PFR0_SVE,
|
|
|
+ .matches = has_cpuid_feature,
|
|
|
+ .enable = sve_kernel_enable,
|
|
|
+ },
|
|
|
+#endif /* CONFIG_ARM64_SVE */
|
|
|
{},
|
|
|
};
|
|
|
|
|
@@ -985,6 +999,9 @@ static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = {
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_JSCVT_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, HWCAP_JSCVT),
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_FCMA_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, HWCAP_FCMA),
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_LRCPC_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, HWCAP_LRCPC),
|
|
|
+#ifdef CONFIG_ARM64_SVE
|
|
|
+ HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_SVE_SHIFT, FTR_UNSIGNED, ID_AA64PFR0_SVE, CAP_HWCAP, HWCAP_SVE),
|
|
|
+#endif
|
|
|
{},
|
|
|
};
|
|
|
|