DECLARE_BITMAP(cpu_hwcaps, ARM64_NCAPS);
 EXPORT_SYMBOL(cpu_hwcaps);
+static struct arm64_cpu_capabilities const __ro_after_init *cpu_hwcaps_ptrs[ARM64_NCAPS];
 
 /*
  * Flag to indicate if we have computed the system wide
 }
 
 extern const struct arm64_cpu_capabilities arm64_errata[];
+static const struct arm64_cpu_capabilities arm64_features[];
+
+static void __init
+init_cpu_hwcaps_indirect_list_from_array(const struct arm64_cpu_capabilities *caps)
+{
+       for (; caps->matches; caps++) {
+               if (WARN(caps->capability >= ARM64_NCAPS,
+                       "Invalid capability %d\n", caps->capability))
+                       continue;
+               if (WARN(cpu_hwcaps_ptrs[caps->capability],
+                       "Duplicate entry for capability %d\n",
+                       caps->capability))
+                       continue;
+               cpu_hwcaps_ptrs[caps->capability] = caps;
+       }
+}
+
+static void __init init_cpu_hwcaps_indirect_list(void)
+{
+       init_cpu_hwcaps_indirect_list_from_array(arm64_features);
+       init_cpu_hwcaps_indirect_list_from_array(arm64_errata);
+}
+
 static void __init setup_boot_cpu_capabilities(void);
 
 void __init init_cpu_features(struct cpuinfo_arm64 *info)
                sve_init_vq_map();
        }
 
+       /*
+        * Initialize the indirect array of CPU hwcaps capabilities pointers
+        * before we handle the boot CPU below.
+        */
+       init_cpu_hwcaps_indirect_list();
+
        /*
         * Detect and enable early CPU capabilities based on the boot CPU,
         * after we have initialised the CPU feature infrastructure.
        static_branch_enable(&arm64_const_caps_ready);
 }
 
-extern const struct arm64_cpu_capabilities arm64_errata[];
-
 bool this_cpu_has_cap(unsigned int cap)
 {
        return (__this_cpu_has_cap(arm64_features, cap) ||