aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuel Vadot <manu@FreeBSD.org>2021-01-12 11:02:38 +0000
committerEmmanuel Vadot <manu@FreeBSD.org>2021-01-12 11:31:00 +0000
commit11d62b6f31ab4e99df6d0c6c23406b57eaa37f41 (patch)
treea365c3f0ec126cbb9003cbae175c301605c94461
parent2c95fb753fb20e82c16356537204d8583e125be0 (diff)
downloadsrc-11d62b6f31ab4e99df6d0c6c23406b57eaa37f41.tar.gz
src-11d62b6f31ab4e99df6d0c6c23406b57eaa37f41.zip
linuxkpi: add kernel_fpu_begin/kernel_fpu_end
With newer AMD GPUs (>=Navi,Renoir) there is FPU context usage in the amdgpu driver. The `kernel_fpu_begin/end` implementations in drm did not even allow nested begin-end blocks. Submitted by: Greg V Reviewed By: manu, hselasky Differential Revision: https://reviews.freebsd.org/D28061
-rw-r--r--sys/compat/linuxkpi/common/include/asm/fpu/api.h68
-rw-r--r--sys/compat/linuxkpi/common/src/linux_fpu.c50
-rw-r--r--sys/conf/files.amd643
-rw-r--r--sys/conf/files.arm643
-rw-r--r--sys/conf/files.i3863
-rw-r--r--sys/modules/linuxkpi/Makefile2
6 files changed, 128 insertions, 1 deletions
diff --git a/sys/compat/linuxkpi/common/include/asm/fpu/api.h b/sys/compat/linuxkpi/common/include/asm/fpu/api.h
new file mode 100644
index 000000000000..035ec3620fdd
--- /dev/null
+++ b/sys/compat/linuxkpi/common/include/asm/fpu/api.h
@@ -0,0 +1,68 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2020 Greg V <greg@unrelenting.technology>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _FPU_API_H_
+#define _FPU_API_H_
+
+#if defined(__aarch64__) || defined(__amd64__) || defined(__i386__)
+
+#include <machine/fpu.h>
+
+extern struct fpu_kern_ctx *__lkpi_fpu_ctx;
+extern unsigned int __lkpi_fpu_ctx_level;
+
+static inline void
+kernel_fpu_begin()
+{
+ if (__lkpi_fpu_ctx_level++ == 0) {
+ fpu_kern_enter(curthread, __lkpi_fpu_ctx, FPU_KERN_NORMAL);
+ }
+}
+
+static inline void
+kernel_fpu_end()
+{
+ if (--__lkpi_fpu_ctx_level == 0) {
+ fpu_kern_leave(curthread, __lkpi_fpu_ctx);
+ }
+}
+
+#else
+
+static inline void
+kernel_fpu_begin()
+{
+}
+
+static inline void
+kernel_fpu_end()
+{
+}
+
+#endif
+
+#endif /* _FPU_API_H_ */
diff --git a/sys/compat/linuxkpi/common/src/linux_fpu.c b/sys/compat/linuxkpi/common/src/linux_fpu.c
new file mode 100644
index 000000000000..976e55e68ca1
--- /dev/null
+++ b/sys/compat/linuxkpi/common/src/linux_fpu.c
@@ -0,0 +1,50 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2020 Greg V <greg@unrelenting.technology>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/proc.h>
+#include <sys/kernel.h>
+
+#include <machine/fpu.h>
+
+struct fpu_kern_ctx *__lkpi_fpu_ctx;
+unsigned int __lkpi_fpu_ctx_level = 0;
+
+static void
+linux_fpu_init(void *arg __unused)
+{
+ __lkpi_fpu_ctx = fpu_kern_alloc_ctx(0);
+}
+SYSINIT(linux_fpu, SI_SUB_EVENTHANDLER, SI_ORDER_SECOND, linux_fpu_init, NULL);
+
+static void
+linux_fpu_uninit(void *arg __unused)
+{
+ fpu_kern_free_ctx(__lkpi_fpu_ctx);
+}
+SYSUNINIT(linux_fpu, SI_SUB_EVENTHANDLER, SI_ORDER_SECOND, linux_fpu_uninit, NULL);
diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index 00b8b8c57ee1..a049d9469834 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -462,6 +462,9 @@ x86/xen/pv.c optional xenhvm
x86/xen/pvcpu_enum.c optional xenhvm
x86/xen/xen_pci_bus.c optional xenhvm
+compat/linuxkpi/common/src/linux_fpu.c optional compat_linuxkpi \
+ compile-with "${LINUXKPI_C}"
+
contrib/openzfs/module/zcommon/zfs_fletcher_avx512.c optional zfs compile-with "${ZFS_C}"
contrib/openzfs/module/zcommon/zfs_fletcher_intel.c optional zfs compile-with "${ZFS_C}"
contrib/openzfs/module/zcommon/zfs_fletcher_sse.c optional zfs compile-with "${ZFS_C}"
diff --git a/sys/conf/files.arm64 b/sys/conf/files.arm64
index 3cd34c170778..030c02233910 100644
--- a/sys/conf/files.arm64
+++ b/sys/conf/files.arm64
@@ -494,3 +494,6 @@ tegra210_xusb.fw optional tegra210_xusb_fw \
compile-with "${NORMAL_FW}" \
no-obj no-implicit-rule \
clean "tegra210_xusb.fw"
+
+compat/linuxkpi/common/src/linux_fpu.c optional compat_linuxkpi \
+ compile-with "${LINUXKPI_C}"
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index 96d2413b532d..b5192e47a738 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -241,3 +241,6 @@ x86/x86/local_apic.c optional apic
x86/x86/mptable.c optional apic
x86/x86/mptable_pci.c optional apic pci
x86/x86/msi.c optional apic pci
+
+compat/linuxkpi/common/src/linux_fpu.c optional compat_linuxkpi \
+ compile-with "${LINUXKPI_C}"
diff --git a/sys/modules/linuxkpi/Makefile b/sys/modules/linuxkpi/Makefile
index c043a4e40dc6..f9ae0e60e339 100644
--- a/sys/modules/linuxkpi/Makefile
+++ b/sys/modules/linuxkpi/Makefile
@@ -26,7 +26,7 @@ SRCS= linux_compat.c \
.if ${MACHINE_CPUARCH} == "aarch64" || ${MACHINE_CPUARCH} == "amd64" || \
${MACHINE_CPUARCH} == "i386"
-SRCS+= opt_acpi.h acpi_if.h linux_acpi.c
+SRCS+= opt_acpi.h acpi_if.h linux_acpi.c linux_fpu.c
.endif
SRCS+= ${LINUXKPI_GENSRCS}