diff --git a/config/kernel-fpu.m4 b/config/kernel-fpu.m4
index e79632bf9b0c..9961bf206667 100644
--- a/config/kernel-fpu.m4
+++ b/config/kernel-fpu.m4
@@ -91,6 +91,13 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_FPU], [
 		__kernel_fpu_end();
 	], [], [ZFS_META_LICENSE])
 
+	ZFS_LINUX_TEST_SRC([kernel_neon], [
+		#include <asm/neon.h>
+	], [
+		kernel_neon_begin();
+		kernel_neon_end();
+	], [], [ZFS_META_LICENSE])
+
 	ZFS_LINUX_TEST_SRC([fpu_internal], [
 		#if defined(__x86_64) || defined(__x86_64__) || \
 		    defined(__i386) || defined(__i386__)
@@ -186,18 +193,28 @@ AC_DEFUN([ZFS_AC_KERNEL_FPU], [
 			AC_DEFINE(KERNEL_EXPORTS_X86_FPU, 1,
 			    [kernel exports FPU functions])
 		],[
-			ZFS_LINUX_TEST_RESULT([fpu_internal], [
-				AC_MSG_RESULT(internal)
-				AC_DEFINE(HAVE_KERNEL_FPU_INTERNAL, 1,
-				    [kernel fpu internal])
+			dnl #
+			dnl # ARM neon symbols (only on arm and arm64)
+			dnl # could be GPL-only on arm64 after Linux 6.2
+			dnl #
+			ZFS_LINUX_TEST_RESULT([kernel_neon_license],[
+				AC_MSG_RESULT(kernel_neon_*)
+				AC_DEFINE(HAVE_KERNEL_NEON, 1,
+				    [kernel has kernel_neon_* functions])
 			],[
-				ZFS_LINUX_TEST_RESULT([fpu_xsave_internal], [
-				    AC_MSG_RESULT(internal with internal XSAVE)
-				    AC_DEFINE(HAVE_KERNEL_FPU_XSAVE_INTERNAL, 1,
-					[kernel fpu and XSAVE internal])
-			    ],[
-				AC_MSG_RESULT(unavailable)
-			    ])
+				ZFS_LINUX_TEST_RESULT([fpu_internal], [
+					AC_MSG_RESULT(internal)
+					AC_DEFINE(HAVE_KERNEL_FPU_INTERNAL, 1,
+						[kernel fpu internal])
+				],[
+					ZFS_LINUX_TEST_RESULT([fpu_xsave_internal], [
+						AC_MSG_RESULT(internal with internal XSAVE)
+						AC_DEFINE(HAVE_KERNEL_FPU_XSAVE_INTERNAL, 1,
+						[kernel fpu and XSAVE internal])
+					],[
+					AC_MSG_RESULT(unavailable)
+					])
+				])
 			])
 		])
 	])
diff --git a/include/os/linux/kernel/linux/simd_aarch64.h b/include/os/linux/kernel/linux/simd_aarch64.h
index 50937e97ced1..cd1a78240016 100644
--- a/include/os/linux/kernel/linux/simd_aarch64.h
+++ b/include/os/linux/kernel/linux/simd_aarch64.h
@@ -43,9 +43,15 @@
 #include <sys/types.h>
 #include <asm/neon.h>
 
+#if (defined(HAVE_KERNEL_NEON) && defined(CONFIG_KERNEL_MODE_NEON))
 #define	kfpu_allowed()		1
 #define	kfpu_begin()		kernel_neon_begin()
 #define	kfpu_end()		kernel_neon_end()
+#else
+#define	kfpu_allowed()		0
+#define	kfpu_begin()		do {} while (0)
+#define	kfpu_end()		do {} while (0)
+#endif
 #define	kfpu_init()		0
 #define	kfpu_fini()		((void) 0)