/* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (C) 2017 Linaro Ltd. */ #ifndef __ASM_SIMD_H #define __ASM_SIMD_H #include #include #include #include #include #include #include #ifdef CONFIG_KERNEL_MODE_NEON /* * may_use_simd - whether it is allowable at this time to issue SIMD * instructions or access the SIMD register file * * Callers must not assume that the result remains true beyond the next * preempt_enable() or return from softirq context. */ static __must_check inline bool may_use_simd(void) { /* * We must make sure that the SVE has been initialized properly * before using the SIMD in kernel. */ return !WARN_ON(!system_capabilities_finalized()) && system_supports_fpsimd() && !in_hardirq() && !in_nmi(); } #else /* ! CONFIG_KERNEL_MODE_NEON */ static __must_check inline bool may_use_simd(void) { return false; } #endif /* ! CONFIG_KERNEL_MODE_NEON */ DEFINE_LOCK_GUARD_1(ksimd, struct user_fpsimd_state, kernel_neon_begin(_T->lock), kernel_neon_end(_T->lock)) #define scoped_ksimd() scoped_guard(ksimd, &(struct user_fpsimd_state){}) #endif