aboutsummaryrefslogtreecommitdiff
path: root/sys/contrib/openzfs/include/os/linux/kernel/linux/simd_powerpc.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/openzfs/include/os/linux/kernel/linux/simd_powerpc.h')
-rw-r--r--sys/contrib/openzfs/include/os/linux/kernel/linux/simd_powerpc.h66
1 files changed, 39 insertions, 27 deletions
diff --git a/sys/contrib/openzfs/include/os/linux/kernel/linux/simd_powerpc.h b/sys/contrib/openzfs/include/os/linux/kernel/linux/simd_powerpc.h
index f1de3ad01656..a649790ce50f 100644
--- a/sys/contrib/openzfs/include/os/linux/kernel/linux/simd_powerpc.h
+++ b/sys/contrib/openzfs/include/os/linux/kernel/linux/simd_powerpc.h
@@ -50,9 +50,6 @@
#ifndef _LINUX_SIMD_POWERPC_H
#define _LINUX_SIMD_POWERPC_H
-/* only for __powerpc__ */
-#if defined(__powerpc__)
-
#include <linux/preempt.h>
#include <linux/export.h>
#include <linux/sched.h>
@@ -69,45 +66,62 @@
#define kfpu_allowed() 1
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0)
-#ifdef CONFIG_SPE
-#define kfpu_begin() \
- { \
- preempt_disable(); \
- enable_kernel_altivec(); \
- enable_kernel_vsx(); \
- enable_kernel_spe(); \
- }
-#define kfpu_end() \
- { \
- disable_kernel_spe(); \
- disable_kernel_vsx(); \
- disable_kernel_altivec(); \
- preempt_enable(); \
- }
-#else /* CONFIG_SPE */
+#ifdef CONFIG_ALTIVEC
+#define ENABLE_KERNEL_ALTIVEC enable_kernel_altivec();
+#define DISABLE_KERNEL_ALTIVEC disable_kernel_altivec();
+#else
+#define ENABLE_KERNEL_ALTIVEC
+#define DISABLE_KERNEL_ALTIVEC
+#endif
+#ifdef CONFIG_VSX
+#define ENABLE_KERNEL_VSX enable_kernel_vsx();
+#define DISABLE_KERNEL_VSX disable_kernel_vsx();
+#else
+#define ENABLE_KERNEL_VSX
+#define DISABLE_KERNEL_VSX
+#endif
+#ifdef CONFIG_SPE
+#define ENABLE_KERNEL_SPE enable_kernel_spe();
+#define DISABLE_KERNEL_SPE disable_kernel_spe();
+#else
+#define ENABLE_KERNEL_SPE
+#define DISABLE_KERNEL_SPE
+#endif
#define kfpu_begin() \
{ \
preempt_disable(); \
- enable_kernel_altivec(); \
- enable_kernel_vsx(); \
+ ENABLE_KERNEL_ALTIVEC \
+ ENABLE_KERNEL_VSX \
+ ENABLE_KERNEL_SPE \
}
#define kfpu_end() \
{ \
- disable_kernel_vsx(); \
- disable_kernel_altivec(); \
+ DISABLE_KERNEL_SPE \
+ DISABLE_KERNEL_VSX \
+ DISABLE_KERNEL_ALTIVEC \
preempt_enable(); \
}
-#endif
#else
/* seems that before 4.5 no-one bothered */
#define kfpu_begin()
#define kfpu_end() preempt_enable()
-#endif
+#endif /* Linux version >= 4.5 */
#define kfpu_init() 0
#define kfpu_fini() ((void) 0)
/*
+ * Linux 4.7 makes cpu_has_feature to use jump labels on powerpc if
+ * CONFIG_JUMP_LABEL_FEATURE_CHECKS is enabled, in this case however it
+ * references GPL-only symbol cpu_feature_keys. Therefore we overrides this
+ * interface when it is detected being GPL-only.
+ */
+#if defined(CONFIG_JUMP_LABEL_FEATURE_CHECKS) && \
+ defined(HAVE_CPU_HAS_FEATURE_GPL_ONLY)
+#define cpu_has_feature(feature) early_cpu_has_feature(feature)
+#endif
+
+/*
* Check if AltiVec instruction set is available
*/
static inline boolean_t
@@ -134,6 +148,4 @@ zfs_isa207_available(void)
return (cpu_has_feature(CPU_FTR_ARCH_207S));
}
-#endif /* defined(__powerpc) */
-
#endif /* _LINUX_SIMD_POWERPC_H */