*     In some non-typical cases either both (a) and (b), or neither,
  *     should be permitted. This can be described by including neither
  *     or both flags in the capability's type field.
+ *
+ *     In case of a conflict, the CPU is prevented from booting. If the
+ *     ARM64_CPUCAP_PANIC_ON_CONFLICT flag is specified for the capability,
+ *     then a kernel panic is triggered.
  */
 
 
 #define ARM64_CPUCAP_PERMITTED_FOR_LATE_CPU    ((u16)BIT(4))
 /* Is it safe for a late CPU to miss this capability when system has it */
 #define ARM64_CPUCAP_OPTIONAL_FOR_LATE_CPU     ((u16)BIT(5))
+/* Panic when a conflict is detected */
+#define ARM64_CPUCAP_PANIC_ON_CONFLICT         ((u16)BIT(6))
 
 /*
  * CPU errata workarounds that need to be enabled at boot time if one or
 
 /*
  * CPU feature used early in the boot based on the boot CPU. All secondary
- * CPUs must match the state of the capability as detected by the boot CPU.
+ * CPUs must match the state of the capability as detected by the boot CPU. In
+ * case of a conflict, a kernel panic is triggered.
  */
-#define ARM64_CPUCAP_STRICT_BOOT_CPU_FEATURE ARM64_CPUCAP_SCOPE_BOOT_CPU
+#define ARM64_CPUCAP_STRICT_BOOT_CPU_FEATURE           \
+       (ARM64_CPUCAP_SCOPE_BOOT_CPU | ARM64_CPUCAP_PANIC_ON_CONFLICT)
 
 struct arm64_cpu_capabilities {
        const char *desc;
 
        return !!(cap->type & ARM64_CPUCAP_PERMITTED_FOR_LATE_CPU);
 }
 
+static bool
+cpucap_panic_on_conflict(const struct arm64_cpu_capabilities *cap)
+{
+       return !!(cap->type & ARM64_CPUCAP_PANIC_ON_CONFLICT);
+}
+
 static const struct arm64_cpu_capabilities arm64_features[] = {
        {
                .desc = "GIC system register CPU interface",
  * Run through the list of capabilities to check for conflicts.
  * If the system has already detected a capability, take necessary
  * action on this CPU.
- *
- * Returns "false" on conflicts.
  */
-static bool verify_local_cpu_caps(u16 scope_mask)
+static void verify_local_cpu_caps(u16 scope_mask)
 {
        int i;
        bool cpu_has_cap, system_has_cap;
                pr_crit("CPU%d: Detected conflict for capability %d (%s), System: %d, CPU: %d\n",
                        smp_processor_id(), caps->capability,
                        caps->desc, system_has_cap, cpu_has_cap);
-               return false;
-       }
 
-       return true;
+               if (cpucap_panic_on_conflict(caps))
+                       cpu_panic_kernel();
+               else
+                       cpu_die_early();
+       }
 }
 
 /*
 static void check_early_cpu_features(void)
 {
        verify_cpu_asid_bits();
-       /*
-        * Early features are used by the kernel already. If there
-        * is a conflict, we cannot proceed further.
-        */
-       if (!verify_local_cpu_caps(SCOPE_BOOT_CPU))
-               cpu_panic_kernel();
+
+       verify_local_cpu_caps(SCOPE_BOOT_CPU);
 }
 
 static void
         * check_early_cpu_features(), as they need to be verified
         * on all secondary CPUs.
         */
-       if (!verify_local_cpu_caps(SCOPE_ALL & ~SCOPE_BOOT_CPU))
-               cpu_die_early();
+       verify_local_cpu_caps(SCOPE_ALL & ~SCOPE_BOOT_CPU);
 
        verify_local_elf_hwcaps(arm64_elf_hwcaps);