blob: 7897d16e09904c4ebbd63bbf85ae3cd7d1e24d7e [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
Nicholas Piggin5a61ef72017-05-09 13:16:52 +10002#ifndef __ASM_POWERPC_CPU_HAS_FEATURE_H
3#define __ASM_POWERPC_CPU_HAS_FEATURE_H
Kevin Haob92a2262016-07-23 14:42:40 +05304
5#ifndef __ASSEMBLY__
6
Kevin Haoc12e6f22016-07-23 14:42:42 +05307#include <linux/bug.h>
Kevin Haob92a2262016-07-23 14:42:40 +05308#include <asm/cputable.h>
9
10static 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 Hao4db73272016-07-23 14:42:41 +053016#ifdef CONFIG_JUMP_LABEL_FEATURE_CHECKS
17#include <linux/jump_label.h>
18
Michael Ellermanffed15d2016-09-12 12:48:28 +100019#define NUM_CPU_FTR_KEYS BITS_PER_LONG
Kevin Hao4db73272016-07-23 14:42:41 +053020
21extern struct static_key_true cpu_feature_keys[NUM_CPU_FTR_KEYS];
22
23static __always_inline bool cpu_has_feature(unsigned long feature)
24{
25 int i;
26
Michael Ellermanb5fa0f72017-01-24 16:36:57 +110027#ifndef __clang__ /* clang can't cope with this */
Kevin Hao4db73272016-07-23 14:42:41 +053028 BUILD_BUG_ON(!__builtin_constant_p(feature));
Michael Ellermanb5fa0f72017-01-24 16:36:57 +110029#endif
Kevin Hao4db73272016-07-23 14:42:41 +053030
Aneesh Kumar K.Vc812c7d2016-07-23 14:42:43 +053031#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 Hao4db73272016-07-23 14:42:41 +053039 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 Haob92a2262016-07-23 14:42:40 +053049static inline bool cpu_has_feature(unsigned long feature)
50{
51 return early_cpu_has_feature(feature);
52}
Kevin Hao4db73272016-07-23 14:42:41 +053053#endif
Kevin Haob92a2262016-07-23 14:42:40 +053054
55#endif /* __ASSEMBLY__ */
Nicholas Piggin5a61ef72017-05-09 13:16:52 +100056#endif /* __ASM_POWERPC_CPU_HAS_FEATURE_H */