Path: blob/master/arch/riscv/include/asm/cpufeature-macros.h
26471 views
/* SPDX-License-Identifier: GPL-2.0-only */1/*2* Copyright 2022-2024 Rivos, Inc3*/45#ifndef _ASM_CPUFEATURE_MACROS_H6#define _ASM_CPUFEATURE_MACROS_H78#include <asm/hwcap.h>9#include <asm/alternative-macros.h>1011#define STANDARD_EXT 01213bool __riscv_isa_extension_available(const unsigned long *isa_bitmap, unsigned int bit);14#define riscv_isa_extension_available(isa_bitmap, ext) \15__riscv_isa_extension_available(isa_bitmap, RISCV_ISA_EXT_##ext)1617static __always_inline bool __riscv_has_extension_likely(const unsigned long vendor,18const unsigned long ext)19{20asm goto(ALTERNATIVE("j %l[l_no]", "nop", %[vendor], %[ext], 1)21:22: [vendor] "i" (vendor), [ext] "i" (ext)23:24: l_no);2526return true;27l_no:28return false;29}3031static __always_inline bool __riscv_has_extension_unlikely(const unsigned long vendor,32const unsigned long ext)33{34asm goto(ALTERNATIVE("nop", "j %l[l_yes]", %[vendor], %[ext], 1)35:36: [vendor] "i" (vendor), [ext] "i" (ext)37:38: l_yes);3940return false;41l_yes:42return true;43}4445static __always_inline bool riscv_has_extension_unlikely(const unsigned long ext)46{47compiletime_assert(ext < RISCV_ISA_EXT_MAX, "ext must be < RISCV_ISA_EXT_MAX");4849if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE))50return __riscv_has_extension_unlikely(STANDARD_EXT, ext);5152return __riscv_isa_extension_available(NULL, ext);53}5455static __always_inline bool riscv_has_extension_likely(const unsigned long ext)56{57compiletime_assert(ext < RISCV_ISA_EXT_MAX, "ext must be < RISCV_ISA_EXT_MAX");5859if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE))60return __riscv_has_extension_likely(STANDARD_EXT, ext);6162return __riscv_isa_extension_available(NULL, ext);63}6465#endif /* _ASM_CPUFEATURE_MACROS_H */666768