|
|
|
@ -1314,7 +1314,9 @@ u64 __read_sysreg_by_encoding(u32 sys_id)
|
|
|
|
|
static bool
|
|
|
|
|
feature_matches(u64 reg, const struct arm64_cpu_capabilities *entry)
|
|
|
|
|
{
|
|
|
|
|
int val = cpuid_feature_extract_field(reg, entry->field_pos, entry->sign);
|
|
|
|
|
int val = cpuid_feature_extract_field_width(reg, entry->field_pos,
|
|
|
|
|
entry->field_width,
|
|
|
|
|
entry->sign);
|
|
|
|
|
|
|
|
|
|
return val >= entry->min_field_value;
|
|
|
|
|
}
|
|
|
|
@ -1950,6 +1952,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.matches = has_useable_gicv3_cpuif,
|
|
|
|
|
.sys_reg = SYS_ID_AA64PFR0_EL1,
|
|
|
|
|
.field_pos = ID_AA64PFR0_GIC_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.min_field_value = 1,
|
|
|
|
|
},
|
|
|
|
@ -1960,6 +1963,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
.sys_reg = SYS_ID_AA64MMFR0_EL1,
|
|
|
|
|
.field_pos = ID_AA64MMFR0_ECV_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.min_field_value = 1,
|
|
|
|
|
},
|
|
|
|
@ -1971,6 +1975,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
.sys_reg = SYS_ID_AA64MMFR1_EL1,
|
|
|
|
|
.field_pos = ID_AA64MMFR1_PAN_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.min_field_value = 1,
|
|
|
|
|
.cpu_enable = cpu_enable_pan,
|
|
|
|
@ -1984,6 +1989,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
.sys_reg = SYS_ID_AA64MMFR1_EL1,
|
|
|
|
|
.field_pos = ID_AA64MMFR1_PAN_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.min_field_value = 3,
|
|
|
|
|
},
|
|
|
|
@ -1996,6 +2002,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
.sys_reg = SYS_ID_AA64ISAR0_EL1,
|
|
|
|
|
.field_pos = ID_AA64ISAR0_ATOMICS_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.min_field_value = 2,
|
|
|
|
|
},
|
|
|
|
@ -2020,6 +2027,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.sys_reg = SYS_ID_AA64PFR0_EL1,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.field_pos = ID_AA64PFR0_EL0_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = ID_AA64PFR0_ELx_32BIT_64BIT,
|
|
|
|
|
},
|
|
|
|
|
#ifdef CONFIG_KVM
|
|
|
|
@ -2031,6 +2039,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.sys_reg = SYS_ID_AA64PFR0_EL1,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.field_pos = ID_AA64PFR0_EL1_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = ID_AA64PFR0_ELx_32BIT_64BIT,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
@ -2051,6 +2060,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
*/
|
|
|
|
|
.sys_reg = SYS_ID_AA64PFR0_EL1,
|
|
|
|
|
.field_pos = ID_AA64PFR0_CSV3_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = 1,
|
|
|
|
|
.matches = unmap_kernel_at_el0,
|
|
|
|
|
.cpu_enable = kpti_install_ng_mappings,
|
|
|
|
@ -2070,6 +2080,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
.sys_reg = SYS_ID_AA64ISAR1_EL1,
|
|
|
|
|
.field_pos = ID_AA64ISAR1_DPB_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = 1,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
@ -2080,6 +2091,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.sys_reg = SYS_ID_AA64ISAR1_EL1,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.field_pos = ID_AA64ISAR1_DPB_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = 2,
|
|
|
|
|
},
|
|
|
|
|
#endif
|
|
|
|
@ -2091,6 +2103,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.sys_reg = SYS_ID_AA64PFR0_EL1,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.field_pos = ID_AA64PFR0_SVE_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = ID_AA64PFR0_SVE,
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
.cpu_enable = sve_kernel_enable,
|
|
|
|
@ -2105,6 +2118,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.sys_reg = SYS_ID_AA64PFR0_EL1,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.field_pos = ID_AA64PFR0_RAS_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = ID_AA64PFR0_RAS_V1,
|
|
|
|
|
.cpu_enable = cpu_clear_disr,
|
|
|
|
|
},
|
|
|
|
@ -2123,6 +2137,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.sys_reg = SYS_ID_AA64PFR0_EL1,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.field_pos = ID_AA64PFR0_AMU_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = ID_AA64PFR0_AMU,
|
|
|
|
|
.cpu_enable = cpu_amu_enable,
|
|
|
|
|
},
|
|
|
|
@ -2147,6 +2162,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.sys_reg = SYS_ID_AA64MMFR2_EL1,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.field_pos = ID_AA64MMFR2_FWB_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = 1,
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
},
|
|
|
|
@ -2157,6 +2173,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.sys_reg = SYS_ID_AA64MMFR2_EL1,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.field_pos = ID_AA64MMFR2_TTL_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = 1,
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
},
|
|
|
|
@ -2167,6 +2184,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
.sys_reg = SYS_ID_AA64ISAR0_EL1,
|
|
|
|
|
.field_pos = ID_AA64ISAR0_TLB_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.min_field_value = ID_AA64ISAR0_TLB_RANGE,
|
|
|
|
|
},
|
|
|
|
@ -2185,6 +2203,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.sys_reg = SYS_ID_AA64MMFR1_EL1,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.field_pos = ID_AA64MMFR1_HADBS_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = 2,
|
|
|
|
|
.matches = has_hw_dbm,
|
|
|
|
|
.cpu_enable = cpu_enable_hw_dbm,
|
|
|
|
@ -2197,6 +2216,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
.sys_reg = SYS_ID_AA64ISAR0_EL1,
|
|
|
|
|
.field_pos = ID_AA64ISAR0_CRC32_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = 1,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
@ -2206,6 +2226,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
.sys_reg = SYS_ID_AA64PFR1_EL1,
|
|
|
|
|
.field_pos = ID_AA64PFR1_SSBS_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.min_field_value = ID_AA64PFR1_SSBS_PSTATE_ONLY,
|
|
|
|
|
},
|
|
|
|
@ -2218,6 +2239,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.sys_reg = SYS_ID_AA64MMFR2_EL1,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.field_pos = ID_AA64MMFR2_CNP_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = 1,
|
|
|
|
|
.cpu_enable = cpu_enable_cnp,
|
|
|
|
|
},
|
|
|
|
@ -2229,6 +2251,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
.sys_reg = SYS_ID_AA64ISAR1_EL1,
|
|
|
|
|
.field_pos = ID_AA64ISAR1_SB_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.min_field_value = 1,
|
|
|
|
|
},
|
|
|
|
@ -2240,6 +2263,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.sys_reg = SYS_ID_AA64ISAR1_EL1,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.field_pos = ID_AA64ISAR1_APA_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = ID_AA64ISAR1_APA_ARCHITECTED,
|
|
|
|
|
.matches = has_address_auth_cpucap,
|
|
|
|
|
},
|
|
|
|
@ -2250,6 +2274,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.sys_reg = SYS_ID_AA64ISAR2_EL1,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.field_pos = ID_AA64ISAR2_APA3_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = ID_AA64ISAR2_APA3_ARCHITECTED,
|
|
|
|
|
.matches = has_address_auth_cpucap,
|
|
|
|
|
},
|
|
|
|
@ -2260,6 +2285,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.sys_reg = SYS_ID_AA64ISAR1_EL1,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.field_pos = ID_AA64ISAR1_API_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = ID_AA64ISAR1_API_IMP_DEF,
|
|
|
|
|
.matches = has_address_auth_cpucap,
|
|
|
|
|
},
|
|
|
|
@ -2275,6 +2301,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.sys_reg = SYS_ID_AA64ISAR1_EL1,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.field_pos = ID_AA64ISAR1_GPA_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = ID_AA64ISAR1_GPA_ARCHITECTED,
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
},
|
|
|
|
@ -2285,6 +2312,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.sys_reg = SYS_ID_AA64ISAR2_EL1,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.field_pos = ID_AA64ISAR2_GPA3_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = ID_AA64ISAR2_GPA3_ARCHITECTED,
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
},
|
|
|
|
@ -2295,6 +2323,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.sys_reg = SYS_ID_AA64ISAR1_EL1,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.field_pos = ID_AA64ISAR1_GPI_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = ID_AA64ISAR1_GPI_IMP_DEF,
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
},
|
|
|
|
@ -2315,6 +2344,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.matches = can_use_gic_priorities,
|
|
|
|
|
.sys_reg = SYS_ID_AA64PFR0_EL1,
|
|
|
|
|
.field_pos = ID_AA64PFR0_GIC_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.min_field_value = 1,
|
|
|
|
|
},
|
|
|
|
@ -2326,6 +2356,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.type = ARM64_CPUCAP_SYSTEM_FEATURE,
|
|
|
|
|
.sys_reg = SYS_ID_AA64MMFR2_EL1,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.field_pos = ID_AA64MMFR2_E0PD_SHIFT,
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
.min_field_value = 1,
|
|
|
|
@ -2340,6 +2371,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
.sys_reg = SYS_ID_AA64ISAR0_EL1,
|
|
|
|
|
.field_pos = ID_AA64ISAR0_RNDR_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.min_field_value = 1,
|
|
|
|
|
},
|
|
|
|
@ -2357,6 +2389,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.cpu_enable = bti_enable,
|
|
|
|
|
.sys_reg = SYS_ID_AA64PFR1_EL1,
|
|
|
|
|
.field_pos = ID_AA64PFR1_BT_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = ID_AA64PFR1_BT_BTI,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
},
|
|
|
|
@ -2369,6 +2402,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
.sys_reg = SYS_ID_AA64PFR1_EL1,
|
|
|
|
|
.field_pos = ID_AA64PFR1_MTE_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = ID_AA64PFR1_MTE,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.cpu_enable = cpu_enable_mte,
|
|
|
|
@ -2380,6 +2414,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
.sys_reg = SYS_ID_AA64PFR1_EL1,
|
|
|
|
|
.field_pos = ID_AA64PFR1_MTE_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.min_field_value = ID_AA64PFR1_MTE_ASYMM,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
},
|
|
|
|
@ -2391,16 +2426,18 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.sys_reg = SYS_ID_AA64ISAR1_EL1,
|
|
|
|
|
.sign = FTR_UNSIGNED,
|
|
|
|
|
.field_pos = ID_AA64ISAR1_LRCPC_SHIFT,
|
|
|
|
|
.field_width = 4,
|
|
|
|
|
.matches = has_cpuid_feature,
|
|
|
|
|
.min_field_value = 1,
|
|
|
|
|
},
|
|
|
|
|
{},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#define HWCAP_CPUID_MATCH(reg, field, s, min_value) \
|
|
|
|
|
#define HWCAP_CPUID_MATCH(reg, field, width, s, min_value) \
|
|
|
|
|
.matches = has_cpuid_feature, \
|
|
|
|
|
.sys_reg = reg, \
|
|
|
|
|
.field_pos = field, \
|
|
|
|
|
.field_width = width, \
|
|
|
|
|
.sign = s, \
|
|
|
|
|
.min_field_value = min_value,
|
|
|
|
|
|
|
|
|
@ -2410,10 +2447,10 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
.hwcap_type = cap_type, \
|
|
|
|
|
.hwcap = cap, \
|
|
|
|
|
|
|
|
|
|
#define HWCAP_CAP(reg, field, s, min_value, cap_type, cap) \
|
|
|
|
|
#define HWCAP_CAP(reg, field, width, s, min_value, cap_type, cap) \
|
|
|
|
|
{ \
|
|
|
|
|
__HWCAP_CAP(#cap, cap_type, cap) \
|
|
|
|
|
HWCAP_CPUID_MATCH(reg, field, s, min_value) \
|
|
|
|
|
HWCAP_CPUID_MATCH(reg, field, width, s, min_value) \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define HWCAP_MULTI_CAP(list, cap_type, cap) \
|
|
|
|
@ -2433,15 +2470,16 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
|
|
|
static const struct arm64_cpu_capabilities ptr_auth_hwcap_addr_matches[] = {
|
|
|
|
|
{
|
|
|
|
|
HWCAP_CPUID_MATCH(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_APA_SHIFT,
|
|
|
|
|
FTR_UNSIGNED, ID_AA64ISAR1_APA_ARCHITECTED)
|
|
|
|
|
4, FTR_UNSIGNED,
|
|
|
|
|
ID_AA64ISAR1_APA_ARCHITECTED)
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
HWCAP_CPUID_MATCH(SYS_ID_AA64ISAR2_EL1, ID_AA64ISAR2_APA3_SHIFT,
|
|
|
|
|
FTR_UNSIGNED, ID_AA64ISAR2_APA3_ARCHITECTED)
|
|
|
|
|
4, FTR_UNSIGNED, ID_AA64ISAR2_APA3_ARCHITECTED)
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
HWCAP_CPUID_MATCH(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_API_SHIFT,
|
|
|
|
|
FTR_UNSIGNED, ID_AA64ISAR1_API_IMP_DEF)
|
|
|
|
|
4, FTR_UNSIGNED, ID_AA64ISAR1_API_IMP_DEF)
|
|
|
|
|
},
|
|
|
|
|
{},
|
|
|
|
|
};
|
|
|
|
@ -2449,82 +2487,82 @@ static const struct arm64_cpu_capabilities ptr_auth_hwcap_addr_matches[] = {
|
|
|
|
|
static const struct arm64_cpu_capabilities ptr_auth_hwcap_gen_matches[] = {
|
|
|
|
|
{
|
|
|
|
|
HWCAP_CPUID_MATCH(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_GPA_SHIFT,
|
|
|
|
|
FTR_UNSIGNED, ID_AA64ISAR1_GPA_ARCHITECTED)
|
|
|
|
|
4, FTR_UNSIGNED, ID_AA64ISAR1_GPA_ARCHITECTED)
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
HWCAP_CPUID_MATCH(SYS_ID_AA64ISAR2_EL1, ID_AA64ISAR2_GPA3_SHIFT,
|
|
|
|
|
FTR_UNSIGNED, ID_AA64ISAR2_GPA3_ARCHITECTED)
|
|
|
|
|
4, FTR_UNSIGNED, ID_AA64ISAR2_GPA3_ARCHITECTED)
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
HWCAP_CPUID_MATCH(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_GPI_SHIFT,
|
|
|
|
|
FTR_UNSIGNED, ID_AA64ISAR1_GPI_IMP_DEF)
|
|
|
|
|
4, FTR_UNSIGNED, ID_AA64ISAR1_GPI_IMP_DEF)
|
|
|
|
|
},
|
|
|
|
|
{},
|
|
|
|
|
};
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = {
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_AES_SHIFT, FTR_UNSIGNED, 2, CAP_HWCAP, KERNEL_HWCAP_PMULL),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_AES_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_AES),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_SHA1_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_SHA1),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_SHA2_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_SHA2),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_SHA2_SHIFT, FTR_UNSIGNED, 2, CAP_HWCAP, KERNEL_HWCAP_SHA512),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_CRC32_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_CRC32),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_ATOMICS_SHIFT, FTR_UNSIGNED, 2, CAP_HWCAP, KERNEL_HWCAP_ATOMICS),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_RDM_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_ASIMDRDM),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_SHA3_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_SHA3),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_SM3_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_SM3),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_SM4_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_SM4),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_DP_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_ASIMDDP),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_FHM_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_ASIMDFHM),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_TS_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_FLAGM),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_TS_SHIFT, FTR_UNSIGNED, 2, CAP_HWCAP, KERNEL_HWCAP_FLAGM2),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_RNDR_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_RNG),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_FP_SHIFT, FTR_SIGNED, 0, CAP_HWCAP, KERNEL_HWCAP_FP),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_FP_SHIFT, FTR_SIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_FPHP),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_ASIMD_SHIFT, FTR_SIGNED, 0, CAP_HWCAP, KERNEL_HWCAP_ASIMD),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_ASIMD_SHIFT, FTR_SIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_ASIMDHP),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_DIT_SHIFT, FTR_SIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_DIT),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_DPB_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_DCPOP),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_DPB_SHIFT, FTR_UNSIGNED, 2, CAP_HWCAP, KERNEL_HWCAP_DCPODP),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_JSCVT_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_JSCVT),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_FCMA_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_FCMA),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_LRCPC_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_LRCPC),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_LRCPC_SHIFT, FTR_UNSIGNED, 2, CAP_HWCAP, KERNEL_HWCAP_ILRCPC),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_FRINTTS_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_FRINT),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_SB_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_SB),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_BF16_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_BF16),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_DGH_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_DGH),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_I8MM_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_I8MM),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64MMFR2_EL1, ID_AA64MMFR2_AT_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_USCAT),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_AES_SHIFT, 4, FTR_UNSIGNED, 2, CAP_HWCAP, KERNEL_HWCAP_PMULL),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_AES_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_AES),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_SHA1_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_SHA1),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_SHA2_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_SHA2),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_SHA2_SHIFT, 4, FTR_UNSIGNED, 2, CAP_HWCAP, KERNEL_HWCAP_SHA512),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_CRC32_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_CRC32),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_ATOMICS_SHIFT, 4, FTR_UNSIGNED, 2, CAP_HWCAP, KERNEL_HWCAP_ATOMICS),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_RDM_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_ASIMDRDM),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_SHA3_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_SHA3),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_SM3_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_SM3),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_SM4_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_SM4),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_DP_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_ASIMDDP),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_FHM_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_ASIMDFHM),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_TS_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_FLAGM),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_TS_SHIFT, 4, FTR_UNSIGNED, 2, CAP_HWCAP, KERNEL_HWCAP_FLAGM2),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_RNDR_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_RNG),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_FP_SHIFT, 4, FTR_SIGNED, 0, CAP_HWCAP, KERNEL_HWCAP_FP),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_FP_SHIFT, 4, FTR_SIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_FPHP),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_ASIMD_SHIFT, 4, FTR_SIGNED, 0, CAP_HWCAP, KERNEL_HWCAP_ASIMD),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_ASIMD_SHIFT, 4, FTR_SIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_ASIMDHP),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_DIT_SHIFT, 4, FTR_SIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_DIT),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_DPB_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_DCPOP),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_DPB_SHIFT, 4, FTR_UNSIGNED, 2, CAP_HWCAP, KERNEL_HWCAP_DCPODP),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_JSCVT_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_JSCVT),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_FCMA_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_FCMA),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_LRCPC_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_LRCPC),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_LRCPC_SHIFT, 4, FTR_UNSIGNED, 2, CAP_HWCAP, KERNEL_HWCAP_ILRCPC),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_FRINTTS_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_FRINT),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_SB_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_SB),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_BF16_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_BF16),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_DGH_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_DGH),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR1_EL1, ID_AA64ISAR1_I8MM_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_I8MM),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64MMFR2_EL1, ID_AA64MMFR2_AT_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_USCAT),
|
|
|
|
|
#ifdef CONFIG_ARM64_SVE
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_SVE_SHIFT, FTR_UNSIGNED, ID_AA64PFR0_SVE, CAP_HWCAP, KERNEL_HWCAP_SVE),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_SVEVER_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_SVEVER_SVE2, CAP_HWCAP, KERNEL_HWCAP_SVE2),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_AES_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_AES, CAP_HWCAP, KERNEL_HWCAP_SVEAES),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_AES_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_AES_PMULL, CAP_HWCAP, KERNEL_HWCAP_SVEPMULL),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_BITPERM_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_BITPERM, CAP_HWCAP, KERNEL_HWCAP_SVEBITPERM),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_BF16_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_BF16, CAP_HWCAP, KERNEL_HWCAP_SVEBF16),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_SHA3_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_SHA3, CAP_HWCAP, KERNEL_HWCAP_SVESHA3),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_SM4_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_SM4, CAP_HWCAP, KERNEL_HWCAP_SVESM4),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_I8MM_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_I8MM, CAP_HWCAP, KERNEL_HWCAP_SVEI8MM),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_F32MM_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_F32MM, CAP_HWCAP, KERNEL_HWCAP_SVEF32MM),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_F64MM_SHIFT, FTR_UNSIGNED, ID_AA64ZFR0_F64MM, CAP_HWCAP, KERNEL_HWCAP_SVEF64MM),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_SVE_SHIFT, 4, FTR_UNSIGNED, ID_AA64PFR0_SVE, CAP_HWCAP, KERNEL_HWCAP_SVE),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_SVEVER_SHIFT, 4, FTR_UNSIGNED, ID_AA64ZFR0_SVEVER_SVE2, CAP_HWCAP, KERNEL_HWCAP_SVE2),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_AES_SHIFT, 4, FTR_UNSIGNED, ID_AA64ZFR0_AES, CAP_HWCAP, KERNEL_HWCAP_SVEAES),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_AES_SHIFT, 4, FTR_UNSIGNED, ID_AA64ZFR0_AES_PMULL, CAP_HWCAP, KERNEL_HWCAP_SVEPMULL),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_BITPERM_SHIFT, 4, FTR_UNSIGNED, ID_AA64ZFR0_BITPERM, CAP_HWCAP, KERNEL_HWCAP_SVEBITPERM),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_BF16_SHIFT, 4, FTR_UNSIGNED, ID_AA64ZFR0_BF16, CAP_HWCAP, KERNEL_HWCAP_SVEBF16),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_SHA3_SHIFT, 4, FTR_UNSIGNED, ID_AA64ZFR0_SHA3, CAP_HWCAP, KERNEL_HWCAP_SVESHA3),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_SM4_SHIFT, 4, FTR_UNSIGNED, ID_AA64ZFR0_SM4, CAP_HWCAP, KERNEL_HWCAP_SVESM4),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_I8MM_SHIFT, 4, FTR_UNSIGNED, ID_AA64ZFR0_I8MM, CAP_HWCAP, KERNEL_HWCAP_SVEI8MM),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_F32MM_SHIFT, 4, FTR_UNSIGNED, ID_AA64ZFR0_F32MM, CAP_HWCAP, KERNEL_HWCAP_SVEF32MM),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ZFR0_EL1, ID_AA64ZFR0_F64MM_SHIFT, 4, FTR_UNSIGNED, ID_AA64ZFR0_F64MM, CAP_HWCAP, KERNEL_HWCAP_SVEF64MM),
|
|
|
|
|
#endif
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR1_EL1, ID_AA64PFR1_SSBS_SHIFT, FTR_UNSIGNED, ID_AA64PFR1_SSBS_PSTATE_INSNS, CAP_HWCAP, KERNEL_HWCAP_SSBS),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR1_EL1, ID_AA64PFR1_SSBS_SHIFT, 4, FTR_UNSIGNED, ID_AA64PFR1_SSBS_PSTATE_INSNS, CAP_HWCAP, KERNEL_HWCAP_SSBS),
|
|
|
|
|
#ifdef CONFIG_ARM64_BTI
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR1_EL1, ID_AA64PFR1_BT_SHIFT, FTR_UNSIGNED, ID_AA64PFR1_BT_BTI, CAP_HWCAP, KERNEL_HWCAP_BTI),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR1_EL1, ID_AA64PFR1_BT_SHIFT, 4, FTR_UNSIGNED, ID_AA64PFR1_BT_BTI, CAP_HWCAP, KERNEL_HWCAP_BTI),
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef CONFIG_ARM64_PTR_AUTH
|
|
|
|
|
HWCAP_MULTI_CAP(ptr_auth_hwcap_addr_matches, CAP_HWCAP, KERNEL_HWCAP_PACA),
|
|
|
|
|
HWCAP_MULTI_CAP(ptr_auth_hwcap_gen_matches, CAP_HWCAP, KERNEL_HWCAP_PACG),
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef CONFIG_ARM64_MTE
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR1_EL1, ID_AA64PFR1_MTE_SHIFT, FTR_UNSIGNED, ID_AA64PFR1_MTE, CAP_HWCAP, KERNEL_HWCAP_MTE),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR1_EL1, ID_AA64PFR1_MTE_SHIFT, FTR_UNSIGNED, ID_AA64PFR1_MTE_ASYMM, CAP_HWCAP, KERNEL_HWCAP_MTE3),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR1_EL1, ID_AA64PFR1_MTE_SHIFT, 4, FTR_UNSIGNED, ID_AA64PFR1_MTE, CAP_HWCAP, KERNEL_HWCAP_MTE),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64PFR1_EL1, ID_AA64PFR1_MTE_SHIFT, 4, FTR_UNSIGNED, ID_AA64PFR1_MTE_ASYMM, CAP_HWCAP, KERNEL_HWCAP_MTE3),
|
|
|
|
|
#endif /* CONFIG_ARM64_MTE */
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64MMFR0_EL1, ID_AA64MMFR0_ECV_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_ECV),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64MMFR1_EL1, ID_AA64MMFR1_AFP_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_AFP),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR2_EL1, ID_AA64ISAR2_RPRES_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_RPRES),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64MMFR0_EL1, ID_AA64MMFR0_ECV_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_ECV),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64MMFR1_EL1, ID_AA64MMFR1_AFP_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_AFP),
|
|
|
|
|
HWCAP_CAP(SYS_ID_AA64ISAR2_EL1, ID_AA64ISAR2_RPRES_SHIFT, 4, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_RPRES),
|
|
|
|
|
{},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -2553,15 +2591,15 @@ static bool compat_has_neon(const struct arm64_cpu_capabilities *cap, int scope)
|
|
|
|
|
static const struct arm64_cpu_capabilities compat_elf_hwcaps[] = {
|
|
|
|
|
#ifdef CONFIG_COMPAT
|
|
|
|
|
HWCAP_CAP_MATCH(compat_has_neon, CAP_COMPAT_HWCAP, COMPAT_HWCAP_NEON),
|
|
|
|
|
HWCAP_CAP(SYS_MVFR1_EL1, MVFR1_SIMDFMAC_SHIFT, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP, COMPAT_HWCAP_VFPv4),
|
|
|
|
|
HWCAP_CAP(SYS_MVFR1_EL1, MVFR1_SIMDFMAC_SHIFT, 4, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP, COMPAT_HWCAP_VFPv4),
|
|
|
|
|
/* Arm v8 mandates MVFR0.FPDP == {0, 2}. So, piggy back on this for the presence of VFP support */
|
|
|
|
|
HWCAP_CAP(SYS_MVFR0_EL1, MVFR0_FPDP_SHIFT, FTR_UNSIGNED, 2, CAP_COMPAT_HWCAP, COMPAT_HWCAP_VFP),
|
|
|
|
|
HWCAP_CAP(SYS_MVFR0_EL1, MVFR0_FPDP_SHIFT, FTR_UNSIGNED, 2, CAP_COMPAT_HWCAP, COMPAT_HWCAP_VFPv3),
|
|
|
|
|
HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_AES_SHIFT, FTR_UNSIGNED, 2, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_PMULL),
|
|
|
|
|
HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_AES_SHIFT, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_AES),
|
|
|
|
|
HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_SHA1_SHIFT, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_SHA1),
|
|
|
|
|
HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_SHA2_SHIFT, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_SHA2),
|
|
|
|
|
HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_CRC32_SHIFT, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_CRC32),
|
|
|
|
|
HWCAP_CAP(SYS_MVFR0_EL1, MVFR0_FPDP_SHIFT, 4, FTR_UNSIGNED, 2, CAP_COMPAT_HWCAP, COMPAT_HWCAP_VFP),
|
|
|
|
|
HWCAP_CAP(SYS_MVFR0_EL1, MVFR0_FPDP_SHIFT, 4, FTR_UNSIGNED, 2, CAP_COMPAT_HWCAP, COMPAT_HWCAP_VFPv3),
|
|
|
|
|
HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_AES_SHIFT, 4, FTR_UNSIGNED, 2, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_PMULL),
|
|
|
|
|
HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_AES_SHIFT, 4, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_AES),
|
|
|
|
|
HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_SHA1_SHIFT, 4, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_SHA1),
|
|
|
|
|
HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_SHA2_SHIFT, 4, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_SHA2),
|
|
|
|
|
HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_CRC32_SHIFT, 4, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_CRC32),
|
|
|
|
|
#endif
|
|
|
|
|
{},
|
|
|
|
|
};
|
|
|
|
|