Commit 1e89baed authored by Suzuki K Poulose's avatar Suzuki K Poulose Committed by Will Deacon

arm64: capabilities: Move errata processing code

We have errata work around processing code in cpu_errata.c,
which calls back into helpers defined in cpufeature.c. Now
that we are going to make the handling of capabilities
generic, by adding the information to each capability,
move the errata work around specific processing code.
No functional changes.

Cc: Will Deacon <will.deacon@arm.com>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: default avatarDave Martin <dave.martin@arm.com>
Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
parent 5e91107b
...@@ -245,15 +245,8 @@ static inline bool id_aa64pfr0_sve(u64 pfr0) ...@@ -245,15 +245,8 @@ static inline bool id_aa64pfr0_sve(u64 pfr0)
} }
void __init setup_cpu_features(void); void __init setup_cpu_features(void);
void update_cpu_capabilities(const struct arm64_cpu_capabilities *caps,
const char *info);
void enable_cpu_capabilities(const struct arm64_cpu_capabilities *caps);
void check_local_cpu_capabilities(void); void check_local_cpu_capabilities(void);
void update_cpu_errata_workarounds(void);
void __init enable_errata_workarounds(void);
void verify_local_cpu_errata_workarounds(void);
u64 read_sanitised_ftr_reg(u32 id); u64 read_sanitised_ftr_reg(u32 id);
......
...@@ -450,36 +450,3 @@ const struct arm64_cpu_capabilities arm64_errata[] = { ...@@ -450,36 +450,3 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
{ {
} }
}; };
/*
* 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.
*/
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();
}
}
}
void update_cpu_errata_workarounds(void)
{
update_cpu_capabilities(arm64_errata, "enabling workaround for");
}
void __init enable_errata_workarounds(void)
{
enable_cpu_capabilities(arm64_errata);
}
...@@ -509,6 +509,9 @@ static void __init init_cpu_ftr_reg(u32 sys_reg, u64 new) ...@@ -509,6 +509,9 @@ static void __init init_cpu_ftr_reg(u32 sys_reg, u64 new)
reg->user_mask = user_mask; 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) void __init init_cpu_features(struct cpuinfo_arm64 *info)
{ {
/* Before we start using the tables, make sure it is sorted */ /* 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, ...@@ -1252,8 +1255,8 @@ static bool __this_cpu_has_cap(const struct arm64_cpu_capabilities *cap_array,
return false; return false;
} }
void update_cpu_capabilities(const struct arm64_cpu_capabilities *caps, static void update_cpu_capabilities(const struct arm64_cpu_capabilities *caps,
const char *info) const char *info)
{ {
for (; caps->matches; caps++) { for (; caps->matches; caps++) {
if (!caps->matches(caps, caps->def_scope)) if (!caps->matches(caps, caps->def_scope))
...@@ -1277,7 +1280,8 @@ static int __enable_cpu_capability(void *arg) ...@@ -1277,7 +1280,8 @@ static int __enable_cpu_capability(void *arg)
* Run through the enabled capabilities and enable() it on all active * Run through the enabled capabilities and enable() it on all active
* CPUs * 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++) { for (; caps->matches; caps++) {
unsigned int num = caps->capability; unsigned int num = caps->capability;
...@@ -1361,6 +1365,39 @@ static void verify_sve_features(void) ...@@ -1361,6 +1365,39 @@ static void verify_sve_features(void)
/* Add checks on other ZCR bits here if necessary */ /* 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. * 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. * The capabilities were decided based on the available CPUs at the boot time.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment