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