提交 5a0c24b3 编写于 作者: S Suzuki K Poulose 提交者: Caspar Zhang

arm64: capabilities: Use linear array for detection and verification

task #25552995

commit 606f8e7b27bfe30376348f8bc09cba17626dc24c upstream

Use the sorted list of capability entries for the detection and
verification.
Reviewed-by: NVladimir Murzin <vladimir.murzin@arm.com>
Tested-by: NVladimir Murzin <vladimir.murzin@arm.com>
Signed-off-by: NSuzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: NWill Deacon <will.deacon@arm.com>
Signed-off-by: NZou Cao <zoucao@linux.alibaba.com>
Reviewed-by: Nluanshi <zhangliguang@linux.alibaba.com>
上级 047390ae
...@@ -1491,28 +1491,25 @@ static void __init setup_elf_hwcaps(const struct arm64_cpu_capabilities *hwcaps) ...@@ -1491,28 +1491,25 @@ static void __init setup_elf_hwcaps(const struct arm64_cpu_capabilities *hwcaps)
cap_set_elf_hwcap(hwcaps); cap_set_elf_hwcap(hwcaps);
} }
static void __update_cpu_capabilities(const struct arm64_cpu_capabilities *caps, static void update_cpu_capabilities(u16 scope_mask)
u16 scope_mask, const char *info)
{ {
int i;
const struct arm64_cpu_capabilities *caps;
scope_mask &= ARM64_CPUCAP_SCOPE_MASK; scope_mask &= ARM64_CPUCAP_SCOPE_MASK;
for (; caps->matches; caps++) { for (i = 0; i < ARM64_NCAPS; i++) {
if (!(caps->type & scope_mask) || caps = cpu_hwcaps_ptrs[i];
if (!caps || !(caps->type & scope_mask) ||
cpus_have_cap(caps->capability) ||
!caps->matches(caps, cpucap_default_scope(caps))) !caps->matches(caps, cpucap_default_scope(caps)))
continue; continue;
if (!cpus_have_cap(caps->capability) && caps->desc) if (caps->desc)
pr_info("%s %s\n", info, caps->desc); pr_info("detected: %s\n", caps->desc);
cpus_set_cap(caps->capability); cpus_set_cap(caps->capability);
} }
} }
static void update_cpu_capabilities(u16 scope_mask)
{
__update_cpu_capabilities(arm64_errata, scope_mask,
"enabling workaround for");
__update_cpu_capabilities(arm64_features, scope_mask, "detected:");
}
static int __enable_cpu_capability(void *arg) static int __enable_cpu_capability(void *arg)
{ {
const struct arm64_cpu_capabilities *cap = arg; const struct arm64_cpu_capabilities *cap = arg;
...@@ -1576,16 +1573,17 @@ static void __init enable_cpu_capabilities(u16 scope_mask) ...@@ -1576,16 +1573,17 @@ static void __init enable_cpu_capabilities(u16 scope_mask)
* *
* Returns "false" on conflicts. * Returns "false" on conflicts.
*/ */
static bool static bool verify_local_cpu_caps(u16 scope_mask)
__verify_local_cpu_caps(const struct arm64_cpu_capabilities *caps,
u16 scope_mask)
{ {
int i;
bool cpu_has_cap, system_has_cap; bool cpu_has_cap, system_has_cap;
const struct arm64_cpu_capabilities *caps;
scope_mask &= ARM64_CPUCAP_SCOPE_MASK; scope_mask &= ARM64_CPUCAP_SCOPE_MASK;
for (; caps->matches; caps++) { for (i = 0; i < ARM64_NCAPS; i++) {
if (!(caps->type & scope_mask)) caps = cpu_hwcaps_ptrs[i];
if (!caps || !(caps->type & scope_mask))
continue; continue;
cpu_has_cap = caps->matches(caps, SCOPE_LOCAL_CPU); cpu_has_cap = caps->matches(caps, SCOPE_LOCAL_CPU);
...@@ -1616,7 +1614,7 @@ __verify_local_cpu_caps(const struct arm64_cpu_capabilities *caps, ...@@ -1616,7 +1614,7 @@ __verify_local_cpu_caps(const struct arm64_cpu_capabilities *caps,
} }
} }
if (caps->matches) { if (i < ARM64_NCAPS) {
pr_crit("CPU%d: Detected conflict for capability %d (%s), System: %d, CPU: %d\n", pr_crit("CPU%d: Detected conflict for capability %d (%s), System: %d, CPU: %d\n",
smp_processor_id(), caps->capability, smp_processor_id(), caps->capability,
caps->desc, system_has_cap, cpu_has_cap); caps->desc, system_has_cap, cpu_has_cap);
...@@ -1626,12 +1624,6 @@ __verify_local_cpu_caps(const struct arm64_cpu_capabilities *caps, ...@@ -1626,12 +1624,6 @@ __verify_local_cpu_caps(const struct arm64_cpu_capabilities *caps,
return true; return true;
} }
static bool verify_local_cpu_caps(u16 scope_mask)
{
return __verify_local_cpu_caps(arm64_errata, scope_mask) &&
__verify_local_cpu_caps(arm64_features, scope_mask);
}
/* /*
* Check for CPU features that are used in early boot * Check for CPU features that are used in early boot
* based on the Boot CPU value. * based on the Boot CPU value.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册