diff options
Diffstat (limited to 'arch/arm64/kernel/cpufeature.c')
| -rw-r--r-- | arch/arm64/kernel/cpufeature.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c index 94b8f7fc3310..817ce3365e20 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c | |||
| @@ -985,8 +985,16 @@ void update_cpu_capabilities(const struct arm64_cpu_capabilities *caps, | |||
| 985 | */ | 985 | */ |
| 986 | void __init enable_cpu_capabilities(const struct arm64_cpu_capabilities *caps) | 986 | void __init enable_cpu_capabilities(const struct arm64_cpu_capabilities *caps) |
| 987 | { | 987 | { |
| 988 | for (; caps->matches; caps++) | 988 | for (; caps->matches; caps++) { |
| 989 | if (caps->enable && cpus_have_cap(caps->capability)) | 989 | unsigned int num = caps->capability; |
| 990 | |||
| 991 | if (!cpus_have_cap(num)) | ||
| 992 | continue; | ||
| 993 | |||
| 994 | /* Ensure cpus_have_const_cap(num) works */ | ||
| 995 | static_branch_enable(&cpu_hwcap_keys[num]); | ||
| 996 | |||
| 997 | if (caps->enable) { | ||
| 990 | /* | 998 | /* |
| 991 | * Use stop_machine() as it schedules the work allowing | 999 | * Use stop_machine() as it schedules the work allowing |
| 992 | * us to modify PSTATE, instead of on_each_cpu() which | 1000 | * us to modify PSTATE, instead of on_each_cpu() which |
| @@ -994,6 +1002,8 @@ void __init enable_cpu_capabilities(const struct arm64_cpu_capabilities *caps) | |||
| 994 | * we return. | 1002 | * we return. |
| 995 | */ | 1003 | */ |
| 996 | stop_machine(caps->enable, NULL, cpu_online_mask); | 1004 | stop_machine(caps->enable, NULL, cpu_online_mask); |
| 1005 | } | ||
| 1006 | } | ||
| 997 | } | 1007 | } |
| 998 | 1008 | ||
| 999 | /* | 1009 | /* |
| @@ -1096,6 +1106,14 @@ static void __init setup_feature_capabilities(void) | |||
| 1096 | enable_cpu_capabilities(arm64_features); | 1106 | enable_cpu_capabilities(arm64_features); |
| 1097 | } | 1107 | } |
| 1098 | 1108 | ||
| 1109 | DEFINE_STATIC_KEY_FALSE(arm64_const_caps_ready); | ||
| 1110 | EXPORT_SYMBOL(arm64_const_caps_ready); | ||
| 1111 | |||
| 1112 | static void __init mark_const_caps_ready(void) | ||
| 1113 | { | ||
| 1114 | static_branch_enable(&arm64_const_caps_ready); | ||
| 1115 | } | ||
| 1116 | |||
| 1099 | /* | 1117 | /* |
| 1100 | * Check if the current CPU has a given feature capability. | 1118 | * Check if the current CPU has a given feature capability. |
| 1101 | * Should be called from non-preemptible context. | 1119 | * Should be called from non-preemptible context. |
| @@ -1131,6 +1149,7 @@ void __init setup_cpu_features(void) | |||
| 1131 | /* Set the CPU feature capabilies */ | 1149 | /* Set the CPU feature capabilies */ |
| 1132 | setup_feature_capabilities(); | 1150 | setup_feature_capabilities(); |
| 1133 | enable_errata_workarounds(); | 1151 | enable_errata_workarounds(); |
| 1152 | mark_const_caps_ready(); | ||
| 1134 | setup_elf_hwcaps(arm64_elf_hwcaps); | 1153 | setup_elf_hwcaps(arm64_elf_hwcaps); |
| 1135 | 1154 | ||
| 1136 | if (system_supports_32bit_el0()) | 1155 | if (system_supports_32bit_el0()) |
