| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- #ifndef __ASM_POWERPC_CPUFEATURES_H
- #define __ASM_POWERPC_CPUFEATURES_H
- #ifndef __ASSEMBLY__
- #include <linux/bug.h>
- #include <asm/cputable.h>
- static inline bool early_cpu_has_feature(unsigned long feature)
- {
- return !!((CPU_FTRS_ALWAYS & feature) ||
- (CPU_FTRS_POSSIBLE & cur_cpu_spec->cpu_features & feature));
- }
- #ifdef CONFIG_JUMP_LABEL_FEATURE_CHECKS
- #include <linux/jump_label.h>
- #define NUM_CPU_FTR_KEYS BITS_PER_LONG
- extern struct static_key_true cpu_feature_keys[NUM_CPU_FTR_KEYS];
- static __always_inline bool cpu_has_feature(unsigned long feature)
- {
- int i;
- BUILD_BUG_ON(!__builtin_constant_p(feature));
- #ifdef CONFIG_JUMP_LABEL_FEATURE_CHECK_DEBUG
- if (!static_key_initialized) {
- printk("Warning! cpu_has_feature() used prior to jump label init!\n");
- dump_stack();
- return early_cpu_has_feature(feature);
- }
- #endif
- if (CPU_FTRS_ALWAYS & feature)
- return true;
- if (!(CPU_FTRS_POSSIBLE & feature))
- return false;
- i = __builtin_ctzl(feature);
- return static_branch_likely(&cpu_feature_keys[i]);
- }
- #else
- static inline bool cpu_has_feature(unsigned long feature)
- {
- return early_cpu_has_feature(feature);
- }
- #endif
- #endif /* __ASSEMBLY__ */
- #endif /* __ASM_POWERPC_CPUFEATURE_H */
|