@@ -261,6 +261,8 @@ static const struct arm64_ftr_bits ftr_id_aa64pfr0[] = {
261261};
262262
263263static const struct arm64_ftr_bits ftr_id_aa64pfr1 [] = {
264+ ARM64_FTR_BITS (FTR_VISIBLE_IF_IS_ENABLED (CONFIG_ARM64_SME ),
265+ FTR_STRICT , FTR_LOWER_SAFE , ID_AA64PFR1_SME_SHIFT , 4 , 0 ),
264266 ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , ID_AA64PFR1_MPAMFRAC_SHIFT , 4 , 0 ),
265267 ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , ID_AA64PFR1_RASFRAC_SHIFT , 4 , 0 ),
266268 ARM64_FTR_BITS (FTR_VISIBLE_IF_IS_ENABLED (CONFIG_ARM64_MTE ),
@@ -293,6 +295,24 @@ static const struct arm64_ftr_bits ftr_id_aa64zfr0[] = {
293295 ARM64_FTR_END ,
294296};
295297
298+ static const struct arm64_ftr_bits ftr_id_aa64smfr0 [] = {
299+ ARM64_FTR_BITS (FTR_VISIBLE_IF_IS_ENABLED (CONFIG_ARM64_SME ),
300+ FTR_STRICT , FTR_EXACT , ID_AA64SMFR0_FA64_SHIFT , 1 , 0 ),
301+ ARM64_FTR_BITS (FTR_VISIBLE_IF_IS_ENABLED (CONFIG_ARM64_SME ),
302+ FTR_STRICT , FTR_EXACT , ID_AA64SMFR0_I16I64_SHIFT , 4 , 0 ),
303+ ARM64_FTR_BITS (FTR_VISIBLE_IF_IS_ENABLED (CONFIG_ARM64_SME ),
304+ FTR_STRICT , FTR_EXACT , ID_AA64SMFR0_F64F64_SHIFT , 1 , 0 ),
305+ ARM64_FTR_BITS (FTR_VISIBLE_IF_IS_ENABLED (CONFIG_ARM64_SME ),
306+ FTR_STRICT , FTR_EXACT , ID_AA64SMFR0_I8I32_SHIFT , 4 , 0 ),
307+ ARM64_FTR_BITS (FTR_VISIBLE_IF_IS_ENABLED (CONFIG_ARM64_SME ),
308+ FTR_STRICT , FTR_EXACT , ID_AA64SMFR0_F16F32_SHIFT , 1 , 0 ),
309+ ARM64_FTR_BITS (FTR_VISIBLE_IF_IS_ENABLED (CONFIG_ARM64_SME ),
310+ FTR_STRICT , FTR_EXACT , ID_AA64SMFR0_B16F32_SHIFT , 1 , 0 ),
311+ ARM64_FTR_BITS (FTR_VISIBLE_IF_IS_ENABLED (CONFIG_ARM64_SME ),
312+ FTR_STRICT , FTR_EXACT , ID_AA64SMFR0_F32F32_SHIFT , 1 , 0 ),
313+ ARM64_FTR_END ,
314+ };
315+
296316static const struct arm64_ftr_bits ftr_id_aa64mmfr0 [] = {
297317 ARM64_FTR_BITS (FTR_VISIBLE , FTR_STRICT , FTR_LOWER_SAFE , ID_AA64MMFR0_ECV_SHIFT , 4 , 0 ),
298318 ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , ID_AA64MMFR0_FGT_SHIFT , 4 , 0 ),
@@ -645,6 +665,7 @@ static const struct __ftr_reg_entry {
645665 ARM64_FTR_REG_OVERRIDE (SYS_ID_AA64PFR1_EL1 , ftr_id_aa64pfr1 ,
646666 & id_aa64pfr1_override ),
647667 ARM64_FTR_REG (SYS_ID_AA64ZFR0_EL1 , ftr_id_aa64zfr0 ),
668+ ARM64_FTR_REG (SYS_ID_AA64SMFR0_EL1 , ftr_id_aa64smfr0 ),
648669
649670 /* Op1 = 0, CRn = 0, CRm = 5 */
650671 ARM64_FTR_REG (SYS_ID_AA64DFR0_EL1 , ftr_id_aa64dfr0 ),
@@ -960,6 +981,7 @@ void __init init_cpu_features(struct cpuinfo_arm64 *info)
960981 init_cpu_ftr_reg (SYS_ID_AA64PFR0_EL1 , info -> reg_id_aa64pfr0 );
961982 init_cpu_ftr_reg (SYS_ID_AA64PFR1_EL1 , info -> reg_id_aa64pfr1 );
962983 init_cpu_ftr_reg (SYS_ID_AA64ZFR0_EL1 , info -> reg_id_aa64zfr0 );
984+ init_cpu_ftr_reg (SYS_ID_AA64SMFR0_EL1 , info -> reg_id_aa64smfr0 );
963985
964986 if (id_aa64pfr0_32bit_el0 (info -> reg_id_aa64pfr0 ))
965987 init_32bit_cpu_features (& info -> aarch32 );
@@ -2442,6 +2464,33 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
24422464 .matches = has_cpuid_feature ,
24432465 .min_field_value = 1 ,
24442466 },
2467+ #ifdef CONFIG_ARM64_SME
2468+ {
2469+ .desc = "Scalable Matrix Extension" ,
2470+ .type = ARM64_CPUCAP_SYSTEM_FEATURE ,
2471+ .capability = ARM64_SME ,
2472+ .sys_reg = SYS_ID_AA64PFR1_EL1 ,
2473+ .sign = FTR_UNSIGNED ,
2474+ .field_pos = ID_AA64PFR1_SME_SHIFT ,
2475+ .field_width = 4 ,
2476+ .min_field_value = ID_AA64PFR1_SME ,
2477+ .matches = has_cpuid_feature ,
2478+ .cpu_enable = sme_kernel_enable ,
2479+ },
2480+ /* FA64 should be sorted after the base SME capability */
2481+ {
2482+ .desc = "FA64" ,
2483+ .type = ARM64_CPUCAP_SYSTEM_FEATURE ,
2484+ .capability = ARM64_SME_FA64 ,
2485+ .sys_reg = SYS_ID_AA64SMFR0_EL1 ,
2486+ .sign = FTR_UNSIGNED ,
2487+ .field_pos = ID_AA64SMFR0_FA64_SHIFT ,
2488+ .field_width = 1 ,
2489+ .min_field_value = ID_AA64SMFR0_FA64 ,
2490+ .matches = has_cpuid_feature ,
2491+ .cpu_enable = fa64_kernel_enable ,
2492+ },
2493+ #endif /* CONFIG_ARM64_SME */
24452494 {},
24462495};
24472496
@@ -2575,6 +2624,16 @@ static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = {
25752624 HWCAP_CAP (SYS_ID_AA64MMFR0_EL1 , ID_AA64MMFR0_ECV_SHIFT , 4 , FTR_UNSIGNED , 1 , CAP_HWCAP , KERNEL_HWCAP_ECV ),
25762625 HWCAP_CAP (SYS_ID_AA64MMFR1_EL1 , ID_AA64MMFR1_AFP_SHIFT , 4 , FTR_UNSIGNED , 1 , CAP_HWCAP , KERNEL_HWCAP_AFP ),
25772626 HWCAP_CAP (SYS_ID_AA64ISAR2_EL1 , ID_AA64ISAR2_RPRES_SHIFT , 4 , FTR_UNSIGNED , 1 , CAP_HWCAP , KERNEL_HWCAP_RPRES ),
2627+ #ifdef CONFIG_ARM64_SME
2628+ HWCAP_CAP (SYS_ID_AA64PFR1_EL1 , ID_AA64PFR1_SME_SHIFT , 4 , FTR_UNSIGNED , ID_AA64PFR1_SME , CAP_HWCAP , KERNEL_HWCAP_SME ),
2629+ HWCAP_CAP (SYS_ID_AA64SMFR0_EL1 , ID_AA64SMFR0_FA64_SHIFT , 1 , FTR_UNSIGNED , ID_AA64SMFR0_FA64 , CAP_HWCAP , KERNEL_HWCAP_SME_FA64 ),
2630+ HWCAP_CAP (SYS_ID_AA64SMFR0_EL1 , ID_AA64SMFR0_I16I64_SHIFT , 4 , FTR_UNSIGNED , ID_AA64SMFR0_I16I64 , CAP_HWCAP , KERNEL_HWCAP_SME_I16I64 ),
2631+ HWCAP_CAP (SYS_ID_AA64SMFR0_EL1 , ID_AA64SMFR0_F64F64_SHIFT , 1 , FTR_UNSIGNED , ID_AA64SMFR0_F64F64 , CAP_HWCAP , KERNEL_HWCAP_SME_F64F64 ),
2632+ HWCAP_CAP (SYS_ID_AA64SMFR0_EL1 , ID_AA64SMFR0_I8I32_SHIFT , 4 , FTR_UNSIGNED , ID_AA64SMFR0_I8I32 , CAP_HWCAP , KERNEL_HWCAP_SME_I8I32 ),
2633+ HWCAP_CAP (SYS_ID_AA64SMFR0_EL1 , ID_AA64SMFR0_F16F32_SHIFT , 1 , FTR_UNSIGNED , ID_AA64SMFR0_F16F32 , CAP_HWCAP , KERNEL_HWCAP_SME_F16F32 ),
2634+ HWCAP_CAP (SYS_ID_AA64SMFR0_EL1 , ID_AA64SMFR0_B16F32_SHIFT , 1 , FTR_UNSIGNED , ID_AA64SMFR0_B16F32 , CAP_HWCAP , KERNEL_HWCAP_SME_B16F32 ),
2635+ HWCAP_CAP (SYS_ID_AA64SMFR0_EL1 , ID_AA64SMFR0_F32F32_SHIFT , 1 , FTR_UNSIGNED , ID_AA64SMFR0_F32F32 , CAP_HWCAP , KERNEL_HWCAP_SME_F32F32 ),
2636+ #endif /* CONFIG_ARM64_SME */
25782637 {},
25792638};
25802639
0 commit comments