Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
5a61ef74 NP |
2 | #ifndef __ASM_POWERPC_CPU_HAS_FEATURE_H |
3 | #define __ASM_POWERPC_CPU_HAS_FEATURE_H | |
b92a226e KH |
4 | |
5 | #ifndef __ASSEMBLY__ | |
6 | ||
c12e6f24 | 7 | #include <linux/bug.h> |
b92a226e KH |
8 | #include <asm/cputable.h> |
9 | ||
10 | static inline bool early_cpu_has_feature(unsigned long feature) | |
11 | { | |
12 | return !!((CPU_FTRS_ALWAYS & feature) || | |
13 | (CPU_FTRS_POSSIBLE & cur_cpu_spec->cpu_features & feature)); | |
14 | } | |
15 | ||
4db73271 KH |
16 | #ifdef CONFIG_JUMP_LABEL_FEATURE_CHECKS |
17 | #include <linux/jump_label.h> | |
18 | ||
ffed15d3 | 19 | #define NUM_CPU_FTR_KEYS BITS_PER_LONG |
4db73271 KH |
20 | |
21 | extern struct static_key_true cpu_feature_keys[NUM_CPU_FTR_KEYS]; | |
22 | ||
23 | static __always_inline bool cpu_has_feature(unsigned long feature) | |
24 | { | |
25 | int i; | |
26 | ||
b5fa0f7f | 27 | #ifndef __clang__ /* clang can't cope with this */ |
4db73271 | 28 | BUILD_BUG_ON(!__builtin_constant_p(feature)); |
b5fa0f7f | 29 | #endif |
4db73271 | 30 | |
c812c7d8 AK |
31 | #ifdef CONFIG_JUMP_LABEL_FEATURE_CHECK_DEBUG |
32 | if (!static_key_initialized) { | |
33 | printk("Warning! cpu_has_feature() used prior to jump label init!\n"); | |
34 | dump_stack(); | |
35 | return early_cpu_has_feature(feature); | |
36 | } | |
37 | #endif | |
38 | ||
4db73271 KH |
39 | if (CPU_FTRS_ALWAYS & feature) |
40 | return true; | |
41 | ||
42 | if (!(CPU_FTRS_POSSIBLE & feature)) | |
43 | return false; | |
44 | ||
45 | i = __builtin_ctzl(feature); | |
46 | return static_branch_likely(&cpu_feature_keys[i]); | |
47 | } | |
48 | #else | |
b92a226e KH |
49 | static inline bool cpu_has_feature(unsigned long feature) |
50 | { | |
51 | return early_cpu_has_feature(feature); | |
52 | } | |
4db73271 | 53 | #endif |
b92a226e KH |
54 | |
55 | #endif /* __ASSEMBLY__ */ | |
5a61ef74 | 56 | #endif /* __ASM_POWERPC_CPU_HAS_FEATURE_H */ |