linux/arch/powerpc/include/asm/cpu_has_feature.h
<<
>>
Prefs
   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
  10static __always_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
  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
  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
  49static __always_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 */
  57