|
@@ -164,6 +164,11 @@ static const struct arm64_ftr_bits ftr_id_aa64pfr0[] = {
|
|
|
ARM64_FTR_END,
|
|
|
};
|
|
|
|
|
|
+static const struct arm64_ftr_bits ftr_id_aa64pfr1[] = {
|
|
|
+ ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR1_SSBS_SHIFT, 4, ID_AA64PFR1_SSBS_PSTATE_NI),
|
|
|
+ ARM64_FTR_END,
|
|
|
+};
|
|
|
+
|
|
|
static const struct arm64_ftr_bits ftr_id_aa64mmfr0[] = {
|
|
|
S_ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64MMFR0_TGRAN4_SHIFT, 4, ID_AA64MMFR0_TGRAN4_NI),
|
|
|
S_ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64MMFR0_TGRAN64_SHIFT, 4, ID_AA64MMFR0_TGRAN64_NI),
|
|
@@ -371,7 +376,7 @@ static const struct __ftr_reg_entry {
|
|
|
|
|
|
/* Op1 = 0, CRn = 0, CRm = 4 */
|
|
|
ARM64_FTR_REG(SYS_ID_AA64PFR0_EL1, ftr_id_aa64pfr0),
|
|
|
- ARM64_FTR_REG(SYS_ID_AA64PFR1_EL1, ftr_raz),
|
|
|
+ ARM64_FTR_REG(SYS_ID_AA64PFR1_EL1, ftr_id_aa64pfr1),
|
|
|
ARM64_FTR_REG(SYS_ID_AA64ZFR0_EL1, ftr_raz),
|
|
|
|
|
|
/* Op1 = 0, CRn = 0, CRm = 5 */
|
|
@@ -657,7 +662,6 @@ void update_cpu_features(int cpu,
|
|
|
|
|
|
/*
|
|
|
* EL3 is not our concern.
|
|
|
- * ID_AA64PFR1 is currently RES0.
|
|
|
*/
|
|
|
taint |= check_update_ftr_reg(SYS_ID_AA64PFR0_EL1, cpu,
|
|
|
info->reg_id_aa64pfr0, boot->reg_id_aa64pfr0);
|
|
@@ -1231,6 +1235,16 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
.field_pos = ID_AA64ISAR0_CRC32_SHIFT,
|
|
|
.min_field_value = 1,
|
|
|
},
|
|
|
+ {
|
|
|
+ .desc = "Speculative Store Bypassing Safe (SSBS)",
|
|
|
+ .capability = ARM64_SSBS,
|
|
|
+ .type = ARM64_CPUCAP_WEAK_LOCAL_CPU_FEATURE,
|
|
|
+ .matches = has_cpuid_feature,
|
|
|
+ .sys_reg = SYS_ID_AA64PFR1_EL1,
|
|
|
+ .field_pos = ID_AA64PFR1_SSBS_SHIFT,
|
|
|
+ .sign = FTR_UNSIGNED,
|
|
|
+ .min_field_value = ID_AA64PFR1_SSBS_PSTATE_ONLY,
|
|
|
+ },
|
|
|
{},
|
|
|
};
|
|
|
|
|
@@ -1276,6 +1290,7 @@ static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = {
|
|
|
#ifdef CONFIG_ARM64_SVE
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_SVE_SHIFT, FTR_UNSIGNED, ID_AA64PFR0_SVE, CAP_HWCAP, HWCAP_SVE),
|
|
|
#endif
|
|
|
+ HWCAP_CAP(SYS_ID_AA64PFR1_EL1, ID_AA64PFR1_SSBS_SHIFT, FTR_UNSIGNED, ID_AA64PFR1_SSBS_PSTATE_INSNS, CAP_HWCAP, HWCAP_SSBS),
|
|
|
{},
|
|
|
};
|
|
|
|