|
@@ -509,6 +509,9 @@ static void __init init_cpu_ftr_reg(u32 sys_reg, u64 new)
|
|
|
reg->user_mask = user_mask;
|
|
|
}
|
|
|
|
|
|
+extern const struct arm64_cpu_capabilities arm64_errata[];
|
|
|
+static void update_cpu_errata_workarounds(void);
|
|
|
+
|
|
|
void __init init_cpu_features(struct cpuinfo_arm64 *info)
|
|
|
{
|
|
|
/* Before we start using the tables, make sure it is sorted */
|
|
@@ -1252,8 +1255,8 @@ static bool __this_cpu_has_cap(const struct arm64_cpu_capabilities *cap_array,
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-void update_cpu_capabilities(const struct arm64_cpu_capabilities *caps,
|
|
|
- const char *info)
|
|
|
+static void update_cpu_capabilities(const struct arm64_cpu_capabilities *caps,
|
|
|
+ const char *info)
|
|
|
{
|
|
|
for (; caps->matches; caps++) {
|
|
|
if (!caps->matches(caps, caps->def_scope))
|
|
@@ -1277,7 +1280,8 @@ static int __enable_cpu_capability(void *arg)
|
|
|
* Run through the enabled capabilities and enable() it on all active
|
|
|
* CPUs
|
|
|
*/
|
|
|
-void __init enable_cpu_capabilities(const struct arm64_cpu_capabilities *caps)
|
|
|
+static void __init
|
|
|
+enable_cpu_capabilities(const struct arm64_cpu_capabilities *caps)
|
|
|
{
|
|
|
for (; caps->matches; caps++) {
|
|
|
unsigned int num = caps->capability;
|
|
@@ -1361,6 +1365,39 @@ static void verify_sve_features(void)
|
|
|
/* Add checks on other ZCR bits here if necessary */
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * The CPU Errata work arounds are detected and applied at boot time
|
|
|
+ * and the related information is freed soon after. If the new CPU requires
|
|
|
+ * an errata not detected at boot, fail this CPU.
|
|
|
+ */
|
|
|
+static void verify_local_cpu_errata_workarounds(void)
|
|
|
+{
|
|
|
+ const struct arm64_cpu_capabilities *caps = arm64_errata;
|
|
|
+
|
|
|
+ for (; caps->matches; caps++) {
|
|
|
+ if (cpus_have_cap(caps->capability)) {
|
|
|
+ if (caps->cpu_enable)
|
|
|
+ caps->cpu_enable(caps);
|
|
|
+ } else if (caps->matches(caps, SCOPE_LOCAL_CPU)) {
|
|
|
+ pr_crit("CPU%d: Requires work around for %s, not detected"
|
|
|
+ " at boot time\n",
|
|
|
+ smp_processor_id(),
|
|
|
+ caps->desc ? : "an erratum");
|
|
|
+ cpu_die_early();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void update_cpu_errata_workarounds(void)
|
|
|
+{
|
|
|
+ update_cpu_capabilities(arm64_errata, "enabling workaround for");
|
|
|
+}
|
|
|
+
|
|
|
+static void __init enable_errata_workarounds(void)
|
|
|
+{
|
|
|
+ enable_cpu_capabilities(arm64_errata);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Run through the enabled system capabilities and enable() it on this CPU.
|
|
|
* The capabilities were decided based on the available CPUs at the boot time.
|