ARM64_FTR_END,
 };
 
-static const struct arm64_ftr_bits ftr_smcr[] = {
-       ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE,
-               SMCR_ELx_LEN_SHIFT, SMCR_ELx_LEN_WIDTH, 0),     /* LEN */
-       ARM64_FTR_END,
-};
-
 /*
  * Common ftr bits for a 32bit register with all hidden, strict
  * attributes, with 4bit feature fields and a default safe value of
        ARM64_FTR_REG(SYS_ID_AA64MMFR2_EL1, ftr_id_aa64mmfr2),
        ARM64_FTR_REG(SYS_ID_AA64MMFR3_EL1, ftr_id_aa64mmfr3),
 
-       /* Op1 = 0, CRn = 1, CRm = 2 */
-       ARM64_FTR_REG(SYS_SMCR_EL1, ftr_smcr),
-
        /* Op1 = 1, CRn = 0, CRm = 0 */
        ARM64_FTR_REG(SYS_GMID_EL1, ftr_gmid),
 
 
        if (IS_ENABLED(CONFIG_ARM64_SME) &&
            id_aa64pfr1_sme(read_sanitised_ftr_reg(SYS_ID_AA64PFR1_EL1))) {
-               info->reg_smcr = read_smcr_features();
+               sme_kernel_enable(NULL);
+
                /*
                 * We mask out SMPS since even if the hardware
                 * supports priorities the kernel does not at present
                 * and we block access to them.
                 */
                info->reg_smidr = read_cpuid(SMIDR_EL1) & ~SMIDR_EL1_SMPS;
-               init_cpu_ftr_reg(SYS_SMCR_EL1, info->reg_smcr);
                vec_init_vq_map(ARM64_VEC_SME);
        }
 
 
        if (IS_ENABLED(CONFIG_ARM64_SME) &&
            id_aa64pfr1_sme(read_sanitised_ftr_reg(SYS_ID_AA64PFR1_EL1))) {
-               info->reg_smcr = read_smcr_features();
+               sme_kernel_enable(NULL);
+
                /*
                 * We mask out SMPS since even if the hardware
                 * supports priorities the kernel does not at present
                 * and we block access to them.
                 */
                info->reg_smidr = read_cpuid(SMIDR_EL1) & ~SMIDR_EL1_SMPS;
-               taint |= check_update_ftr_reg(SYS_SMCR_EL1, cpu,
-                                       info->reg_smcr, boot->reg_smcr);
 
                /* Probe vector lengths */
                if (!system_capabilities_finalized())
 
 static void verify_sme_features(void)
 {
-       u64 safe_smcr = read_sanitised_ftr_reg(SYS_SMCR_EL1);
-       u64 smcr = read_smcr_features();
-
-       unsigned int safe_len = safe_smcr & SMCR_ELx_LEN_MASK;
-       unsigned int len = smcr & SMCR_ELx_LEN_MASK;
-
-       if (len < safe_len || vec_verify_vq_map(ARM64_VEC_SME)) {
+       if (vec_verify_vq_map(ARM64_VEC_SME)) {
                pr_crit("CPU%d: SME: vector length support mismatch\n",
                        smp_processor_id());
                cpu_die_early();
        }
-
-       /* Add checks on other SMCR bits here if necessary */
 }
 
 static void verify_hyp_capabilities(void)
 
                       SYS_SMCR_EL1);
 }
 
-/*
- * Read the pseudo-SMCR used by cpufeatures to identify the supported
- * vector length.
- *
- * Use only if SME is present.
- * This function clobbers the SME vector length.
- */
-u64 read_smcr_features(void)
-{
-       sme_kernel_enable(NULL);
-
-       /*
-        * Set the maximum possible VL.
-        */
-       write_sysreg_s(read_sysreg_s(SYS_SMCR_EL1) | SMCR_ELx_LEN_MASK,
-                      SYS_SMCR_EL1);
-
-       /* Return LEN value that would be written to get the maximum VL */
-       return sve_vq_from_vl(sme_get_vl()) - 1;
-}
-
 void __init sme_setup(void)
 {
        struct vl_info *info = &vl_info[ARM64_VEC_SME];
-       u64 smcr;
-       int min_bit;
+       int min_bit, max_bit;
 
        if (!system_supports_sme())
                return;
         * SME doesn't require any particular vector length be
         * supported but it does require at least one.  We should have
         * disabled the feature entirely while bringing up CPUs but
-        * let's double check here.
+        * let's double check here.  The bitmap is SVE_VQ_MAP sized for
+        * sharing with SVE.
         */
        WARN_ON(bitmap_empty(info->vq_map, SVE_VQ_MAX));
 
        min_bit = find_last_bit(info->vq_map, SVE_VQ_MAX);
        info->min_vl = sve_vl_from_vq(__bit_to_vq(min_bit));
 
-       smcr = read_sanitised_ftr_reg(SYS_SMCR_EL1);
-       info->max_vl = sve_vl_from_vq((smcr & SMCR_ELx_LEN_MASK) + 1);
-
-       /*
-        * Sanity-check that the max VL we determined through CPU features
-        * corresponds properly to sme_vq_map.  If not, do our best:
-        */
-       if (WARN_ON(info->max_vl != find_supported_vector_length(ARM64_VEC_SME,
-                                                                info->max_vl)))
-               info->max_vl = find_supported_vector_length(ARM64_VEC_SME,
-                                                           info->max_vl);
+       max_bit = find_first_bit(info->vq_map, SVE_VQ_MAX);
+       info->max_vl = sve_vl_from_vq(__bit_to_vq(max_bit));
 
        WARN_ON(info->min_vl > info->max_vl);