cpuid_feature_extract_unsigned_field(mmfr0, ID_AA64MMFR0_BIGENDEL0_SHIFT) == 0x1;
 }
 
+static inline bool id_aa64pfr0_32bit_el1(u64 pfr0)
+{
+       u32 val = cpuid_feature_extract_unsigned_field(pfr0, ID_AA64PFR0_EL1_SHIFT);
+
+       return val == ID_AA64PFR0_EL1_32BIT_64BIT;
+}
+
 static inline bool id_aa64pfr0_32bit_el0(u64 pfr0)
 {
        u32 val = cpuid_feature_extract_unsigned_field(pfr0, ID_AA64PFR0_EL0_SHIFT);
 
        return 1;
 }
 
+static void relax_cpu_ftr_reg(u32 sys_id, int field)
+{
+       const struct arm64_ftr_bits *ftrp;
+       struct arm64_ftr_reg *regp = get_arm64_ftr_reg(sys_id);
+
+       if (WARN_ON(!regp))
+               return;
+
+       for (ftrp = regp->ftr_bits; ftrp->width; ftrp++) {
+               if (ftrp->shift == field) {
+                       regp->strict_mask &= ~arm64_ftr_mask(ftrp);
+                       break;
+               }
+       }
+
+       /* Bogus field? */
+       WARN_ON(!ftrp->width);
+}
+
 static int update_32bit_cpu_features(int cpu, struct cpuinfo_arm64 *info,
                                     struct cpuinfo_arm64 *boot)
 {
        if (!id_aa64pfr0_32bit_el0(pfr0))
                return taint;
 
+       /*
+        * If we don't have AArch32 at EL1, then relax the strictness of
+        * EL1-dependent register fields to avoid spurious sanity check fails.
+        */
+       if (!id_aa64pfr0_32bit_el1(pfr0)) {
+               relax_cpu_ftr_reg(SYS_ID_ISAR4_EL1, ID_ISAR4_SMC_SHIFT);
+               relax_cpu_ftr_reg(SYS_ID_PFR1_EL1, ID_PFR1_VIRT_FRAC_SHIFT);
+               relax_cpu_ftr_reg(SYS_ID_PFR1_EL1, ID_PFR1_SEC_FRAC_SHIFT);
+               relax_cpu_ftr_reg(SYS_ID_PFR1_EL1, ID_PFR1_VIRTUALIZATION_SHIFT);
+               relax_cpu_ftr_reg(SYS_ID_PFR1_EL1, ID_PFR1_SECURITY_SHIFT);
+               relax_cpu_ftr_reg(SYS_ID_PFR1_EL1, ID_PFR1_PROGMOD_SHIFT);
+       }
+
        taint |= check_update_ftr_reg(SYS_ID_DFR0_EL1, cpu,
                                      info->reg_id_dfr0, boot->reg_id_dfr0);
        taint |= check_update_ftr_reg(SYS_ID_ISAR0_EL1, cpu,
        return taint;
 }
 
-
 /*
  * Update system wide CPU feature registers with the values from a
  * non-boot CPU. Also performs SANITY checks to make sure that there