xref: /freebsd-src/sys/contrib/openzfs/include/os/freebsd/spl/sys/simd_aarch64.h (revision d411c1d696ef35d60f8c3564e5eef7aeafa2fece)
12a58b312SMartin Matuska /*
22a58b312SMartin Matuska  * Copyright (C) 2022 Tino Reichardt <milky-zfs@mcmilk.de>
32a58b312SMartin Matuska  * All rights reserved.
42a58b312SMartin Matuska  *
52a58b312SMartin Matuska  * Redistribution and use in source and binary forms, with or without
62a58b312SMartin Matuska  * modification, are permitted provided that the following conditions
72a58b312SMartin Matuska  * are met:
82a58b312SMartin Matuska  * 1. Redistributions of source code must retain the above copyright
92a58b312SMartin Matuska  *    notice, this list of conditions and the following disclaimer.
102a58b312SMartin Matuska  * 2. Redistributions in binary form must reproduce the above copyright
112a58b312SMartin Matuska  *    notice, this list of conditions and the following disclaimer in the
122a58b312SMartin Matuska  *    documentation and/or other materials provided with the distribution.
132a58b312SMartin Matuska  *
142a58b312SMartin Matuska  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
152a58b312SMartin Matuska  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
162a58b312SMartin Matuska  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
172a58b312SMartin Matuska  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
182a58b312SMartin Matuska  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
192a58b312SMartin Matuska  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
202a58b312SMartin Matuska  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
212a58b312SMartin Matuska  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
222a58b312SMartin Matuska  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
232a58b312SMartin Matuska  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
242a58b312SMartin Matuska  * SUCH DAMAGE.
252a58b312SMartin Matuska  *
262a58b312SMartin Matuska  * $FreeBSD$
272a58b312SMartin Matuska  */
282a58b312SMartin Matuska 
292a58b312SMartin Matuska /*
302a58b312SMartin Matuska  * SIMD support:
312a58b312SMartin Matuska  *
322a58b312SMartin Matuska  * Following functions should be called to determine whether CPU feature
332a58b312SMartin Matuska  * is supported. All functions are usable in kernel and user space.
342a58b312SMartin Matuska  * If a SIMD algorithm is using more than one instruction set
352a58b312SMartin Matuska  * all relevant feature test functions should be called.
362a58b312SMartin Matuska  *
372a58b312SMartin Matuska  * Supported features:
382a58b312SMartin Matuska  *   zfs_neon_available()
392a58b312SMartin Matuska  *   zfs_sha256_available()
402a58b312SMartin Matuska  *   zfs_sha512_available()
412a58b312SMartin Matuska  */
422a58b312SMartin Matuska 
432a58b312SMartin Matuska #ifndef _FREEBSD_SIMD_AARCH64_H
442a58b312SMartin Matuska #define	_FREEBSD_SIMD_AARCH64_H
452a58b312SMartin Matuska 
462a58b312SMartin Matuska #include <sys/types.h>
47ce5a2109SKyle Evans #include <sys/ucontext.h>
482a58b312SMartin Matuska #include <machine/elf.h>
49ce5a2109SKyle Evans #include <machine/fpu.h>
502a58b312SMartin Matuska #include <machine/md_var.h>
51ce5a2109SKyle Evans #include <machine/pcb.h>
52ce5a2109SKyle Evans 
53ce5a2109SKyle Evans #ifdef _STANDALONE
542a58b312SMartin Matuska 
55d6e24901SMateusz Guzik #define	kfpu_allowed()		0
562a58b312SMartin Matuska #define	kfpu_begin()		do {} while (0)
572a58b312SMartin Matuska #define	kfpu_end()		do {} while (0)
58ce5a2109SKyle Evans 
59ce5a2109SKyle Evans #else
60ce5a2109SKyle Evans 
61*087a2e64SKyle Evans #define	kfpu_allowed()		1
62ce5a2109SKyle Evans #define	kfpu_begin() do {						\
63ce5a2109SKyle Evans 	if (__predict_false(!is_fpu_kern_thread(0)))			\
64ce5a2109SKyle Evans 		fpu_kern_enter(curthread, NULL, FPU_KERN_NOCTX);	\
65ce5a2109SKyle Evans } while (0)
66ce5a2109SKyle Evans 
67ce5a2109SKyle Evans #define	kfpu_end() do {							\
68ce5a2109SKyle Evans 	if (__predict_false(curthread->td_pcb->pcb_fpflags & PCB_FP_NOSAVE)) \
69ce5a2109SKyle Evans 		fpu_kern_leave(curthread, NULL);			\
70ce5a2109SKyle Evans } while (0)
71ce5a2109SKyle Evans 
72ce5a2109SKyle Evans #endif
73ce5a2109SKyle Evans 
74ce5a2109SKyle Evans #define	kfpu_initialize(tsk)	do {} while (0)
752a58b312SMartin Matuska #define	kfpu_init()		(0)
762a58b312SMartin Matuska #define	kfpu_fini()		do {} while (0)
772a58b312SMartin Matuska 
782a58b312SMartin Matuska /*
792a58b312SMartin Matuska  * Check if NEON is available
802a58b312SMartin Matuska  */
812a58b312SMartin Matuska static inline boolean_t
zfs_neon_available(void)822a58b312SMartin Matuska zfs_neon_available(void)
832a58b312SMartin Matuska {
842a58b312SMartin Matuska 	return (elf_hwcap & HWCAP_FP);
852a58b312SMartin Matuska }
862a58b312SMartin Matuska 
872a58b312SMartin Matuska /*
882a58b312SMartin Matuska  * Check if SHA256 is available
892a58b312SMartin Matuska  */
902a58b312SMartin Matuska static inline boolean_t
zfs_sha256_available(void)912a58b312SMartin Matuska zfs_sha256_available(void)
922a58b312SMartin Matuska {
932a58b312SMartin Matuska 	return (elf_hwcap & HWCAP_SHA2);
942a58b312SMartin Matuska }
952a58b312SMartin Matuska 
962a58b312SMartin Matuska /*
972a58b312SMartin Matuska  * Check if SHA512 is available
982a58b312SMartin Matuska  */
992a58b312SMartin Matuska static inline boolean_t
zfs_sha512_available(void)1002a58b312SMartin Matuska zfs_sha512_available(void)
1012a58b312SMartin Matuska {
1022a58b312SMartin Matuska 	return (elf_hwcap & HWCAP_SHA512);
1032a58b312SMartin Matuska }
1042a58b312SMartin Matuska 
1052a58b312SMartin Matuska #endif /* _FREEBSD_SIMD_AARCH64_H */
106