@@ -871,6 +871,31 @@ static void __init init_cpu_hwcaps_indirect_list(void)
871871
872872static void __init setup_boot_cpu_capabilities (void );
873873
874+ static void __init init_32bit_cpu_features (struct cpuinfo_32bit * info )
875+ {
876+ init_cpu_ftr_reg (SYS_ID_DFR0_EL1 , info -> reg_id_dfr0 );
877+ init_cpu_ftr_reg (SYS_ID_DFR1_EL1 , info -> reg_id_dfr1 );
878+ init_cpu_ftr_reg (SYS_ID_ISAR0_EL1 , info -> reg_id_isar0 );
879+ init_cpu_ftr_reg (SYS_ID_ISAR1_EL1 , info -> reg_id_isar1 );
880+ init_cpu_ftr_reg (SYS_ID_ISAR2_EL1 , info -> reg_id_isar2 );
881+ init_cpu_ftr_reg (SYS_ID_ISAR3_EL1 , info -> reg_id_isar3 );
882+ init_cpu_ftr_reg (SYS_ID_ISAR4_EL1 , info -> reg_id_isar4 );
883+ init_cpu_ftr_reg (SYS_ID_ISAR5_EL1 , info -> reg_id_isar5 );
884+ init_cpu_ftr_reg (SYS_ID_ISAR6_EL1 , info -> reg_id_isar6 );
885+ init_cpu_ftr_reg (SYS_ID_MMFR0_EL1 , info -> reg_id_mmfr0 );
886+ init_cpu_ftr_reg (SYS_ID_MMFR1_EL1 , info -> reg_id_mmfr1 );
887+ init_cpu_ftr_reg (SYS_ID_MMFR2_EL1 , info -> reg_id_mmfr2 );
888+ init_cpu_ftr_reg (SYS_ID_MMFR3_EL1 , info -> reg_id_mmfr3 );
889+ init_cpu_ftr_reg (SYS_ID_MMFR4_EL1 , info -> reg_id_mmfr4 );
890+ init_cpu_ftr_reg (SYS_ID_MMFR5_EL1 , info -> reg_id_mmfr5 );
891+ init_cpu_ftr_reg (SYS_ID_PFR0_EL1 , info -> reg_id_pfr0 );
892+ init_cpu_ftr_reg (SYS_ID_PFR1_EL1 , info -> reg_id_pfr1 );
893+ init_cpu_ftr_reg (SYS_ID_PFR2_EL1 , info -> reg_id_pfr2 );
894+ init_cpu_ftr_reg (SYS_MVFR0_EL1 , info -> reg_mvfr0 );
895+ init_cpu_ftr_reg (SYS_MVFR1_EL1 , info -> reg_mvfr1 );
896+ init_cpu_ftr_reg (SYS_MVFR2_EL1 , info -> reg_mvfr2 );
897+ }
898+
874899void __init init_cpu_features (struct cpuinfo_arm64 * info )
875900{
876901 /* Before we start using the tables, make sure it is sorted */
@@ -890,29 +915,8 @@ void __init init_cpu_features(struct cpuinfo_arm64 *info)
890915 init_cpu_ftr_reg (SYS_ID_AA64PFR1_EL1 , info -> reg_id_aa64pfr1 );
891916 init_cpu_ftr_reg (SYS_ID_AA64ZFR0_EL1 , info -> reg_id_aa64zfr0 );
892917
893- if (id_aa64pfr0_32bit_el0 (info -> reg_id_aa64pfr0 )) {
894- init_cpu_ftr_reg (SYS_ID_DFR0_EL1 , info -> reg_id_dfr0 );
895- init_cpu_ftr_reg (SYS_ID_DFR1_EL1 , info -> reg_id_dfr1 );
896- init_cpu_ftr_reg (SYS_ID_ISAR0_EL1 , info -> reg_id_isar0 );
897- init_cpu_ftr_reg (SYS_ID_ISAR1_EL1 , info -> reg_id_isar1 );
898- init_cpu_ftr_reg (SYS_ID_ISAR2_EL1 , info -> reg_id_isar2 );
899- init_cpu_ftr_reg (SYS_ID_ISAR3_EL1 , info -> reg_id_isar3 );
900- init_cpu_ftr_reg (SYS_ID_ISAR4_EL1 , info -> reg_id_isar4 );
901- init_cpu_ftr_reg (SYS_ID_ISAR5_EL1 , info -> reg_id_isar5 );
902- init_cpu_ftr_reg (SYS_ID_ISAR6_EL1 , info -> reg_id_isar6 );
903- init_cpu_ftr_reg (SYS_ID_MMFR0_EL1 , info -> reg_id_mmfr0 );
904- init_cpu_ftr_reg (SYS_ID_MMFR1_EL1 , info -> reg_id_mmfr1 );
905- init_cpu_ftr_reg (SYS_ID_MMFR2_EL1 , info -> reg_id_mmfr2 );
906- init_cpu_ftr_reg (SYS_ID_MMFR3_EL1 , info -> reg_id_mmfr3 );
907- init_cpu_ftr_reg (SYS_ID_MMFR4_EL1 , info -> reg_id_mmfr4 );
908- init_cpu_ftr_reg (SYS_ID_MMFR5_EL1 , info -> reg_id_mmfr5 );
909- init_cpu_ftr_reg (SYS_ID_PFR0_EL1 , info -> reg_id_pfr0 );
910- init_cpu_ftr_reg (SYS_ID_PFR1_EL1 , info -> reg_id_pfr1 );
911- init_cpu_ftr_reg (SYS_ID_PFR2_EL1 , info -> reg_id_pfr2 );
912- init_cpu_ftr_reg (SYS_MVFR0_EL1 , info -> reg_mvfr0 );
913- init_cpu_ftr_reg (SYS_MVFR1_EL1 , info -> reg_mvfr1 );
914- init_cpu_ftr_reg (SYS_MVFR2_EL1 , info -> reg_mvfr2 );
915- }
918+ if (id_aa64pfr0_32bit_el0 (info -> reg_id_aa64pfr0 ))
919+ init_32bit_cpu_features (& info -> aarch32 );
916920
917921 if (id_aa64pfr0_sve (info -> reg_id_aa64pfr0 )) {
918922 init_cpu_ftr_reg (SYS_ZCR_EL1 , info -> reg_zcr );
@@ -986,20 +990,12 @@ static void relax_cpu_ftr_reg(u32 sys_id, int field)
986990 WARN_ON (!ftrp -> width );
987991}
988992
989- static int update_32bit_cpu_features (int cpu , struct cpuinfo_arm64 * info ,
990- struct cpuinfo_arm64 * boot )
993+ static int update_32bit_cpu_features (int cpu , struct cpuinfo_32bit * info ,
994+ struct cpuinfo_32bit * boot )
991995{
992996 int taint = 0 ;
993997 u64 pfr0 = read_sanitised_ftr_reg (SYS_ID_AA64PFR0_EL1 );
994998
995- /*
996- * If we don't have AArch32 at all then skip the checks entirely
997- * as the register values may be UNKNOWN and we're not going to be
998- * using them for anything.
999- */
1000- if (!id_aa64pfr0_32bit_el0 (pfr0 ))
1001- return taint ;
1002-
1003999 /*
10041000 * If we don't have AArch32 at EL1, then relax the strictness of
10051001 * EL1-dependent register fields to avoid spurious sanity check fails.
@@ -1151,15 +1147,23 @@ void update_cpu_features(int cpu,
11511147 * value is the same on all CPUs.
11521148 */
11531149 if (IS_ENABLED (CONFIG_ARM64_MTE ) &&
1154- id_aa64pfr1_mte (info -> reg_id_aa64pfr1 ))
1150+ id_aa64pfr1_mte (info -> reg_id_aa64pfr1 )) {
11551151 taint |= check_update_ftr_reg (SYS_GMID_EL1 , cpu ,
11561152 info -> reg_gmid , boot -> reg_gmid );
1153+ }
11571154
11581155 /*
1156+ * If we don't have AArch32 at all then skip the checks entirely
1157+ * as the register values may be UNKNOWN and we're not going to be
1158+ * using them for anything.
1159+ *
11591160 * This relies on a sanitised view of the AArch64 ID registers
11601161 * (e.g. SYS_ID_AA64PFR0_EL1), so we call it last.
11611162 */
1162- taint |= update_32bit_cpu_features (cpu , info , boot );
1163+ if (id_aa64pfr0_32bit_el0 (info -> reg_id_aa64pfr0 )) {
1164+ taint |= update_32bit_cpu_features (cpu , & info -> aarch32 ,
1165+ & boot -> aarch32 );
1166+ }
11631167
11641168 /*
11651169 * Mismatched CPU features are a recipe for disaster. Don't even
0 commit comments