The branch main has been updated by manu:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=11d62b6f31ab4e99df6d0c6c23406b57eaa37f41

commit 11d62b6f31ab4e99df6d0c6c23406b57eaa37f41
Author:     Emmanuel Vadot <[email protected]>
AuthorDate: 2021-01-12 11:02:38 +0000
Commit:     Emmanuel Vadot <[email protected]>
CommitDate: 2021-01-12 11:31:00 +0000

    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
---
 sys/compat/linuxkpi/common/include/asm/fpu/api.h | 68 ++++++++++++++++++++++++
 sys/compat/linuxkpi/common/src/linux_fpu.c       | 50 +++++++++++++++++
 sys/conf/files.amd64                             |  3 ++
 sys/conf/files.arm64                             |  3 ++
 sys/conf/files.i386                              |  3 ++
 sys/modules/linuxkpi/Makefile                    |  2 +-
 6 files changed, 128 insertions(+), 1 deletion(-)

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 <[email protected]>
+ *
+ * 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 <[email protected]>
+ *
+ * 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}
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
To unsubscribe, send any mail to "[email protected]"

Reply via email to