Greg Kroah-Hartman | b244131 | 2017-11-01 15:07:57 +0100 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
Nicholas Piggin | 5a61ef7 | 2017-05-09 13:16:52 +1000 | [diff] [blame] | 2 | #ifndef __ASM_POWERPC_CPU_HAS_FEATURE_H |
| 3 | #define __ASM_POWERPC_CPU_HAS_FEATURE_H |
Kevin Hao | b92a226 | 2016-07-23 14:42:40 +0530 | [diff] [blame] | 4 | |
| 5 | #ifndef __ASSEMBLY__ |
| 6 | |
Kevin Hao | c12e6f2 | 2016-07-23 14:42:42 +0530 | [diff] [blame] | 7 | #include <linux/bug.h> |
Kevin Hao | b92a226 | 2016-07-23 14:42:40 +0530 | [diff] [blame] | 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 | |
Kevin Hao | 4db7327 | 2016-07-23 14:42:41 +0530 | [diff] [blame] | 16 | #ifdef CONFIG_JUMP_LABEL_FEATURE_CHECKS |
| 17 | #include <linux/jump_label.h> |
| 18 | |
Michael Ellerman | ffed15d | 2016-09-12 12:48:28 +1000 | [diff] [blame] | 19 | #define NUM_CPU_FTR_KEYS BITS_PER_LONG |
Kevin Hao | 4db7327 | 2016-07-23 14:42:41 +0530 | [diff] [blame] | 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 | |
Michael Ellerman | b5fa0f7 | 2017-01-24 16:36:57 +1100 | [diff] [blame] | 27 | #ifndef __clang__ /* clang can't cope with this */ |
Kevin Hao | 4db7327 | 2016-07-23 14:42:41 +0530 | [diff] [blame] | 28 | BUILD_BUG_ON(!__builtin_constant_p(feature)); |
Michael Ellerman | b5fa0f7 | 2017-01-24 16:36:57 +1100 | [diff] [blame] | 29 | #endif |
Kevin Hao | 4db7327 | 2016-07-23 14:42:41 +0530 | [diff] [blame] | 30 | |
Aneesh Kumar K.V | c812c7d | 2016-07-23 14:42:43 +0530 | [diff] [blame] | 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 | |
Kevin Hao | 4db7327 | 2016-07-23 14:42:41 +0530 | [diff] [blame] | 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 |
Kevin Hao | b92a226 | 2016-07-23 14:42:40 +0530 | [diff] [blame] | 49 | static inline bool cpu_has_feature(unsigned long feature) |
| 50 | { |
| 51 | return early_cpu_has_feature(feature); |
| 52 | } |
Kevin Hao | 4db7327 | 2016-07-23 14:42:41 +0530 | [diff] [blame] | 53 | #endif |
Kevin Hao | b92a226 | 2016-07-23 14:42:40 +0530 | [diff] [blame] | 54 | |
| 55 | #endif /* __ASSEMBLY__ */ |
Nicholas Piggin | 5a61ef7 | 2017-05-09 13:16:52 +1000 | [diff] [blame] | 56 | #endif /* __ASM_POWERPC_CPU_HAS_FEATURE_H */ |