root/arch/powerpc/include/asm/cpu_has_feature.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. early_cpu_has_feature
  2. cpu_has_feature
  3. cpu_has_feature

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef __ASM_POWERPC_CPU_HAS_FEATURE_H
   3 #define __ASM_POWERPC_CPU_HAS_FEATURE_H
   4 
   5 #ifndef __ASSEMBLY__
   6 
   7 #include <linux/bug.h>
   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 
  16 #ifdef CONFIG_JUMP_LABEL_FEATURE_CHECKS
  17 #include <linux/jump_label.h>
  18 
  19 #define NUM_CPU_FTR_KEYS        BITS_PER_LONG
  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 
  27 #ifndef __clang__ /* clang can't cope with this */
  28         BUILD_BUG_ON(!__builtin_constant_p(feature));
  29 #endif
  30 
  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 
  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
  49 static inline bool cpu_has_feature(unsigned long feature)
  50 {
  51         return early_cpu_has_feature(feature);
  52 }
  53 #endif
  54 
  55 #endif /* __ASSEMBLY__ */
  56 #endif /* __ASM_POWERPC_CPU_HAS_FEATURE_H */

/* [<][>][^][v][top][bottom][index][help] */