diff options
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.h | 66 |
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 */ |