summaryrefslogtreecommitdiffstats
path: root/system/nvidia-legacy340-kernel
diff options
context:
space:
mode:
Diffstat (limited to 'system/nvidia-legacy340-kernel')
-rw-r--r--system/nvidia-legacy340-kernel/README13
-rw-r--r--system/nvidia-legacy340-kernel/nvidia-legacy340-kernel.SlackBuild17
-rw-r--r--system/nvidia-legacy340-kernel/nvidia-legacy340-kernel.info4
-rw-r--r--system/nvidia-legacy340-kernel/patches/0005-kernel-5.11.patch169
-rw-r--r--system/nvidia-legacy340-kernel/patches/0006-kernel-5.14.patch213
-rw-r--r--system/nvidia-legacy340-kernel/patches/0007-kernel-5.15.patch14
-rw-r--r--system/nvidia-legacy340-kernel/patches/0008-kernel-5.16.patch30
-rw-r--r--system/nvidia-legacy340-kernel/patches/0009-kernel-5.17.patch57
-rw-r--r--system/nvidia-legacy340-kernel/patches/0010-kernel-5.18.patch151
9 files changed, 643 insertions, 25 deletions
diff --git a/system/nvidia-legacy340-kernel/README b/system/nvidia-legacy340-kernel/README
index 498bf657da..f54913fcd6 100644
--- a/system/nvidia-legacy340-kernel/README
+++ b/system/nvidia-legacy340-kernel/README
@@ -1,13 +1,14 @@
-This is the kernel-module needed by the proprietary binary nvidia driver.
-You also need the nvidia-driver package from SlackBuilds.org.
+This is the kernel-module needed by the proprietary binary nvidia
+driver. You also need the nvidia-driver package from SlackBuilds.org.
To build the package for a kernel different from the running one,
start the script setting the KERNEL variable as in
KERNEL=3.2.34 ./nvidia-kernel.SlackBuild
-A default config file is placed at /usr/share/X11/xorg.conf.d/10-nvidia.conf
-to make sure that X loads the nvidia module. If you need to make changes,
-copy that file to /etc/X11/xorg.conf.d/ and edit the copy. You do not need
-this file at all if you have a proper and complete xorg.conf.
+A default config file is placed at
+/usr/share/X11/xorg.conf.d/10-nvidia.conf to make sure that X loads
+the nvidia module. If you need to make changes, copy that file to
+/etc/X11/xorg.conf.d/ and edit the copy. You do not need this file at
+all if you have a proper and complete xorg.conf.
The xf86-video-nouveau-blacklist package from /extra is required.
diff --git a/system/nvidia-legacy340-kernel/nvidia-legacy340-kernel.SlackBuild b/system/nvidia-legacy340-kernel/nvidia-legacy340-kernel.SlackBuild
index f4d17cc03d..251d706348 100644
--- a/system/nvidia-legacy340-kernel/nvidia-legacy340-kernel.SlackBuild
+++ b/system/nvidia-legacy340-kernel/nvidia-legacy340-kernel.SlackBuild
@@ -31,7 +31,7 @@ cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=nvidia-legacy340-kernel
VERSION=${VERSION:-340.108}
-BUILD=${BUILD:-1}
+BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -58,22 +58,22 @@ elif [ "$ARCH" = "x86_64" ]; then
TARGET="x86_64"
fi
-unset ARCH
-
SRCNAM=NVIDIA-Linux-$TARGET-${VERSION}
# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
# the name of the created package would be, and then exit. This information
# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
- echo "$PRGNAM-$PKGVER-$TARGET-$BUILD$TAG.$PKGTYPE"
+ echo "$PRGNAM-$PKGVER-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
fi
TMP=${TMP:-/tmp/SBo}
-PKG=${PKG:-$TMP/package-$PRGNAM}
+PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
+set -e
+
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP || exit 1
@@ -89,7 +89,10 @@ find -L . \
for i in $CWD/patches/* ; do patch -p1 < $i ; done
-(cd kernel || exit 1
+(
+ unset ARCH
+ cd kernel || exit 1
+ sed -i "s|-DNDEBUG$|-DNDEBUG -Wno-error=return-type -Wno-error=implicit-function-declaration|" Makefile
make SYSSRC=$KERNELPATH module || exit 1
cd uvm
sed -i "s|-O2$|-O2 -Wno-error=incompatible-pointer-types|" Makefile
@@ -121,4 +124,4 @@ cat $CWD/slack-desc > $PKG/install/slack-desc
sed "s%@KERNEL@%$KERNEL%" $CWD/doinst.sh > $PKG/install/doinst.sh
cd $PKG
-/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$PKGVER-$TARGET-$BUILD$TAG.$PKGTYPE
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$PKGVER-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/system/nvidia-legacy340-kernel/nvidia-legacy340-kernel.info b/system/nvidia-legacy340-kernel/nvidia-legacy340-kernel.info
index d5e5bec27e..fbeb334c6d 100644
--- a/system/nvidia-legacy340-kernel/nvidia-legacy340-kernel.info
+++ b/system/nvidia-legacy340-kernel/nvidia-legacy340-kernel.info
@@ -6,5 +6,5 @@ MD5SUM="ffa278e613337e638fd10de41dae3630"
DOWNLOAD_x86_64="https://download.nvidia.com/XFree86/Linux-x86_64/340.108/NVIDIA-Linux-x86_64-340.108.run"
MD5SUM_x86_64="28a7ec013c4ef657d3e9b978e2f653c1"
REQUIRES=""
-MAINTAINER="Mats B. Tegner"
-EMAIL="mats.bertil.tegner@gmail.com"
+MAINTAINER="UNMAINTAINED"
+EMAIL="UNMAINTAINED"
diff --git a/system/nvidia-legacy340-kernel/patches/0005-kernel-5.11.patch b/system/nvidia-legacy340-kernel/patches/0005-kernel-5.11.patch
index f401d98ce3..382d7d3b5a 100644
--- a/system/nvidia-legacy340-kernel/patches/0005-kernel-5.11.patch
+++ b/system/nvidia-legacy340-kernel/patches/0005-kernel-5.11.patch
@@ -1,25 +1,174 @@
-
+diff -Naur NVIDIA-Linux-x86_64-340.108-old/kernel/conftest.sh NVIDIA-Linux-x86_64-340.108-new/kernel/conftest.sh
+--- NVIDIA-Linux-x86_64-340.108-old/kernel/conftest.sh 2021-05-24 20:08:18.743742335 +0200
++++ NVIDIA-Linux-x86_64-340.108-new/kernel/conftest.sh 2021-05-24 20:13:18.019314390 +0200
+@@ -1578,21 +1578,21 @@
+ #include <drm/drm_drv.h>
+ #endif
+
+- #if defined(NV_DRM_DRM_PRIME_H_PRESENT)
+- #include <drm/drm_prime.h>
+- #endif
+-
+ #if !defined(CONFIG_DRM) && !defined(CONFIG_DRM_MODULE)
+ #error DRM not enabled
+ #endif
++
+ void conftest_drm_available(void) {
+ struct drm_driver drv;
+- drv.gem_prime_pin = 0;
+- drv.gem_prime_get_sg_table = 0;
+- drv.gem_prime_vmap = 0;
+- drv.gem_prime_vunmap = 0;
+- (void)drm_gem_prime_import;
+- (void)drm_gem_prime_export;
++
++ /* 2013-10-02 1bb72532ac260a2d3982b40bdd4c936d779d0d16 */
++ (void)drm_dev_alloc;
++
++ /* 2013-10-02 c22f0ace1926da399d9a16dfaf09174c1b03594c */
++ (void)drm_dev_register;
++
++ /* 2013-10-02 c3a49737ef7db0bdd4fcf6cf0b7140a883e32b2a */
++ (void)drm_dev_unregister;
+ }"
+
+ compile_check_conftest "$CODE" "NV_DRM_AVAILABLE" "" "generic"
+diff -Naur NVIDIA-Linux-x86_64-340.108-old/kernel/nv-drm.c NVIDIA-Linux-x86_64-340.108-new/kernel/nv-drm.c
+--- NVIDIA-Linux-x86_64-340.108-old/kernel/nv-drm.c 2021-05-24 20:08:18.779739237 +0200
++++ NVIDIA-Linux-x86_64-340.108-new/kernel/nv-drm.c 2021-05-24 20:42:13.443288819 +0200
+@@ -60,6 +60,8 @@
+ #else
+ #include <drm/drm_agpsupport.h>
+
++#include "linux/dma-buf.h"
++
+ struct nv_drm_agp_head {
+ struct agp_kern_info agp_info;
+ struct list_head memory;
+@@ -210,8 +212,10 @@
+
+ /* No locking needed since shadow-attach is single-threaded since it may
+ * only be called from the per-driver module init hook. */
++#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 10, 0)
+ if (drm_core_check_feature(dev, DRIVER_LEGACY))
+ list_add_tail(&dev->legacy_dev_list, &driver->legacy_dev_list);
++#endif
+
+ return 0;
+
+@@ -239,8 +243,10 @@
+ if (WARN_ON(!(driver->driver_features & DRIVER_LEGACY)))
+ return -EINVAL;
+
++#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 10, 0)
+ /* If not using KMS, fall back to stealth mode manual scanning. */
+ INIT_LIST_HEAD(&driver->legacy_dev_list);
++#endif
+ for (i = 0; pdriver->id_table[i].vendor != 0; i++) {
+ pid = &pdriver->id_table[i];
+
+@@ -273,11 +279,13 @@
+ if (!(driver->driver_features & DRIVER_LEGACY)) {
+ WARN_ON(1);
+ } else {
++#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 10, 0)
+ list_for_each_entry_safe(dev, tmp, &driver->legacy_dev_list,
+ legacy_dev_list) {
+ list_del(&dev->legacy_dev_list);
+ drm_put_dev(dev);
+ }
++#endif
+ }
+ DRM_INFO("Module unloaded\n");
+ }
+@@ -402,6 +410,39 @@
+ .llseek = noop_llseek,
+ };
+
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0)
++struct sg_table *nv_drm_gem_prime_get_sg_table(struct drm_gem_object *gem)
++{
++ return nv_gem_prime_get_sg_table(gem);
++}
++
++static int nv_drm_gem_vmap(struct drm_gem_object *gem,
++ struct dma_buf_map *map)
++{
++ map->vaddr = nv_gem_prime_vmap(gem);
++ if (map->vaddr == NULL) {
++ return -ENOMEM;
++ }
++ map->is_iomem = true;
++ return 0;
++}
++
++static void nv_drm_gem_vunmap(struct drm_gem_object *gem,
++ struct dma_buf_map *map)
++{
++ nv_gem_prime_vunmap(gem, map->vaddr);
++ map->vaddr = NULL;
++}
++
++static struct drm_gem_object_funcs nv_drm_gem_object_funcs = {
++ .free = nv_gem_free,
++ .export = drm_gem_prime_export,
++ .get_sg_table = nv_drm_gem_prime_get_sg_table,
++ .vmap = nv_drm_gem_vmap,
++ .vunmap = nv_drm_gem_vunmap,
++};
++#endif
++
+ static struct drm_driver nv_drm_driver = {
+
+ .driver_features = DRIVER_GEM
+@@ -420,17 +461,19 @@
+ .set_busid = drm_pci_set_busid,
+ #endif
+
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)
+- .gem_free_object_unlocked = nv_gem_free,
+-#else
++#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 8, 0)
+ .gem_free_object = nv_gem_free,
++#elif LINUX_VERSION_CODE <= KERNEL_VERSION(5, 10, 0)
++ .gem_free_object_unlocked = nv_gem_free,
+ #endif
+
+ .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
++#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 10, 0)
+ .gem_prime_export = drm_gem_prime_export,
+ .gem_prime_get_sg_table = nv_gem_prime_get_sg_table,
+ .gem_prime_vmap = nv_gem_prime_vmap,
+ .gem_prime_vunmap = nv_gem_prime_vunmap,
++#endif
+
+ .name = "nvidia-drm",
+ .desc = "NVIDIA DRM driver",
diff -Naur NVIDIA-Linux-x86_64-340.108-old/kernel/nv-linux.h NVIDIA-Linux-x86_64-340.108-new/kernel/nv-linux.h
---- NVIDIA-Linux-x86_64-340.108-old/kernel/nv-linux.h 2021-02-23 20:01:52.429999710 +0100
-+++ NVIDIA-Linux-x86_64-340.108-new/kernel/nv-linux.h 2021-02-23 14:48:00.163333638 +0100
-@@ -119,7 +119,7 @@
+--- NVIDIA-Linux-x86_64-340.108-old/kernel/nv-linux.h 2021-05-24 20:08:18.775739581 +0200
++++ NVIDIA-Linux-x86_64-340.108-new/kernel/nv-linux.h 2021-05-24 20:09:18.748287771 +0200
+@@ -119,7 +119,9 @@
#include <asm/tlbflush.h> /* flush_tlb(), flush_tlb_all() */
#include <linux/cpu.h> /* CPU hotplug support */
#endif
-#include <asm/kmap_types.h> /* page table entry lookup */
-+//#include <asm/kmap_types.h> /* page table entry lookup */
++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)
++ #include <asm/kmap_types.h> /* page table entry lookup */
++#endif
#include <linux/pci.h> /* pci_find_class, etc */
#include <linux/interrupt.h> /* tasklets, interrupt helpers */
---- a/kernel/uvm/nvidia_uvm_linux.h 2019-12-11 17:04:24.000000000 -0500
-+++ b/kernel/uvm/nvidia_uvm_linux.h 2021-02-24 06:26:26.237367942 -0500
-@@ -141,7 +141,7 @@
+diff -Naur NVIDIA-Linux-x86_64-340.108-old/kernel/uvm/nvidia_uvm_linux.h NVIDIA-Linux-x86_64-340.108-new/kernel/uvm/nvidia_uvm_linux.h
+--- NVIDIA-Linux-x86_64-340.108-old/kernel/uvm/nvidia_uvm_linux.h 2021-05-24 20:08:18.775739581 +0200
++++ NVIDIA-Linux-x86_64-340.108-new/kernel/uvm/nvidia_uvm_linux.h 2021-05-24 20:09:18.749287739 +0200
+@@ -141,7 +141,9 @@
#if !defined(NV_VMWARE)
#include <asm/tlbflush.h> /* flush_tlb(), flush_tlb_all() */
#endif
-#include <asm/kmap_types.h> /* page table entry lookup */
-+//#include <asm/kmap_types.h> /* page table entry lookup */
++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)
++ #include <asm/kmap_types.h> /* page table entry lookup */
++#endif
#include <linux/interrupt.h> /* tasklets, interrupt helpers */
#include <linux/timer.h>
-
diff --git a/system/nvidia-legacy340-kernel/patches/0006-kernel-5.14.patch b/system/nvidia-legacy340-kernel/patches/0006-kernel-5.14.patch
new file mode 100644
index 0000000000..56c8c45ddb
--- /dev/null
+++ b/system/nvidia-legacy340-kernel/patches/0006-kernel-5.14.patch
@@ -0,0 +1,213 @@
+diff -Naur NVIDIA-Linux-x86_64-340.108-no-compat32.5.13/kernel/nv-drm.c NVIDIA-Linux-x86_64-340.108-no-compat32.5.14/kernel/nv-drm.c
+--- NVIDIA-Linux-x86_64-340.108-no-compat32.5.13/kernel/nv-drm.c 2021-07-25 10:29:29.336505688 +0200
++++ NVIDIA-Linux-x86_64-340.108-no-compat32.5.14/kernel/nv-drm.c 2021-09-16 16:49:10.929858547 +0200
+@@ -57,8 +57,11 @@
+ #if defined(NV_DRM_GET_PCI_DEV_PRESENT)
+ #define nv_drm_get_pci_dev drm_get_pci_dev
+ #else
++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0)
+ #include <drm/drm_agpsupport.h>
+-
++#else
++#include <drm/drm_legacy.h>
++#endif
+ #include "linux/dma-buf.h"
+
+ struct nv_drm_agp_head {
+@@ -82,6 +85,11 @@
+ struct list_head head;
+ };
+
++struct nv_drm_extra_priv_data {
++ struct pci_dev *pdev;
++ struct drm_agp_head *agp;
++};
++
+ /*
+ * Code from drm_agp_init/nv_drm_{free,unbind}_agp
+ * Extracted from commit: 5b8b9d0c6d0e0f1993c6c56deaf9646942c49d94, file: drivers/gpu/drm/drm_agpsupport.c
+@@ -89,13 +97,14 @@
+ struct drm_agp_head *nv_drm_agp_init(struct drm_device *dev)
+ {
+ struct nv_drm_agp_head *head = NULL;
++ struct nv_drm_extra_priv_data *extra = dev->dev_private;
+
+ head = kzalloc(sizeof(*head), GFP_KERNEL);
+ if (!head)
+ return NULL;
+- head->bridge = agp_find_bridge(dev->pdev);
++ head->bridge = agp_find_bridge(extra->pdev);
+ if (!head->bridge) {
+- head->bridge = agp_backend_acquire(dev->pdev);
++ head->bridge = agp_backend_acquire(extra->pdev);
+ if (!head->bridge) {
+ kfree(head);
+ return NULL;
+@@ -133,48 +142,71 @@
+ static void nv_drm_pci_agp_init(struct drm_device *dev)
+ {
+ if (drm_core_check_feature(dev, DRIVER_USE_AGP)) {
+- if (pci_find_capability(dev->pdev, PCI_CAP_ID_AGP))
+- dev->agp = nv_drm_agp_init(dev);
+- if (dev->agp) {
+- dev->agp->agp_mtrr = arch_phys_wc_add(
+- dev->agp->agp_info.aper_base,
+- dev->agp->agp_info.aper_size *
++ struct nv_drm_extra_priv_data *extra = dev->dev_private;
++
++ if (pci_find_capability(extra->pdev, PCI_CAP_ID_AGP))
++ extra->agp = nv_drm_agp_init(dev);
++ if (extra->agp) {
++ extra->agp->agp_mtrr = arch_phys_wc_add(
++ extra->agp->agp_info.aper_base,
++ extra->agp->agp_info.aper_size *
+ 1024 * 1024);
+ }
+ }
+ }
+
++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0)
++
++#else
++/* copied from v5.14.5 */
++int nv_drm_legacy_agp_release(struct drm_device *dev)
++{
++ struct nv_drm_extra_priv_data *extra = dev->dev_private;
++
++ if (!extra->agp || !extra->agp->acquired)
++ return -EINVAL;
++ agp_backend_release(extra->agp->bridge);
++ extra->agp->acquired = 0;
++ return 0;
++}
++#endif
++
+ void nv_drm_legacy_agp_clear(struct drm_device *dev)
+ {
+ struct nv_drm_agp_mem *entry, *tempe;
++ struct nv_drm_extra_priv_data *extra = dev->dev_private;
+
+- if (!dev->agp)
++ if (!extra->agp)
+ return;
+ if (!drm_core_check_feature(dev, DRIVER_LEGACY))
+ return;
+
+- list_for_each_entry_safe(entry, tempe, &dev->agp->memory, head) {
++ list_for_each_entry_safe(entry, tempe, &extra->agp->memory, head) {
+ if (entry->bound)
+ nv_drm_unbind_agp(entry->memory);
+ nv_drm_free_agp(entry->memory, entry->pages);
+ kfree(entry);
+ }
+- INIT_LIST_HEAD(&dev->agp->memory);
++ INIT_LIST_HEAD(&extra->agp->memory);
+
+- if (dev->agp->acquired)
++ if (extra->agp->acquired)
++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0)
+ drm_agp_release(dev);
+-
+- dev->agp->acquired = 0;
+- dev->agp->enabled = 0;
++#else
++ nv_drm_legacy_agp_release(dev);
++#endif
++ extra->agp->acquired = 0;
++ extra->agp->enabled = 0;
+ }
+
+ void nv_drm_pci_agp_destroy(struct drm_device *dev)
+ {
+- if (dev->agp) {
+- arch_phys_wc_del(dev->agp->agp_mtrr);
++ struct nv_drm_extra_priv_data *extra = dev->dev_private;
++ if (extra->agp) {
++ arch_phys_wc_del(extra->agp->agp_mtrr);
+ nv_drm_legacy_agp_clear(dev);
+- kfree(dev->agp);
+- dev->agp = NULL;
++ kfree(extra->agp);
++ extra->agp = NULL;
+ }
+ }
+
+@@ -183,6 +215,7 @@
+ struct drm_driver *driver)
+ {
+ struct drm_device *dev;
++ struct nv_drm_extra_priv_data *extra;
+ int ret;
+
+ DRM_DEBUG("\n");
+@@ -191,11 +224,18 @@
+ if (IS_ERR(dev))
+ return PTR_ERR(dev);
+
++ extra = kzalloc(sizeof(*extra), GFP_KERNEL);
++ if (IS_ERR(extra))
++ goto err_free;
++
++ extra->pdev = pdev;
++
+ ret = pci_enable_device(pdev);
+ if (ret)
+- goto err_free;
++ goto err_free2;
+
+- dev->pdev = pdev;
++ /* use the not used (i hope) dev_private to store deprecated/legacy pointers */
++ dev->dev_private = extra;
+ #ifdef __alpha__
+ dev->hose = pdev->sysdata;
+ #endif
+@@ -221,6 +261,8 @@
+ err_agp:
+ nv_drm_pci_agp_destroy(dev);
+ pci_disable_device(pdev);
++err_free2:
++ kfree(extra);
+ err_free:
+ drm_dev_put(dev);
+ return ret;
+@@ -303,10 +345,11 @@
+ )
+ {
+ nv_linux_state_t *nvl;
++ struct nv_drm_extra_priv_data *extra = dev->dev_private;
+
+ for (nvl = nv_linux_devices; nvl != NULL; nvl = nvl->next)
+ {
+- if (nvl->dev == dev->pdev)
++ if (nvl->dev == extra->pdev)
+ {
+ nvl->drm = dev;
+ return 0;
+@@ -327,10 +370,11 @@
+ )
+ {
+ nv_linux_state_t *nvl;
++ struct nv_drm_extra_priv_data *extra = dev->dev_private;
+
+ for (nvl = nv_linux_devices; nvl != NULL; nvl = nvl->next)
+ {
+- if (nvl->dev == dev->pdev)
++ if (nvl->dev == extra->pdev)
+ {
+ BUG_ON(nvl->drm != dev);
+ nvl->drm = NULL;
+diff -Naur NVIDIA-Linux-x86_64-340.108-no-compat32.5.13/kernel/os-interface.c NVIDIA-Linux-x86_64-340.108-no-compat32.5.14/kernel/os-interface.c
+--- NVIDIA-Linux-x86_64-340.108-no-compat32.5.13/kernel/os-interface.c 2021-07-25 10:29:29.083168593 +0200
++++ NVIDIA-Linux-x86_64-340.108-no-compat32.5.14/kernel/os-interface.c 2021-09-16 13:17:43.345906445 +0200
+@@ -549,7 +549,11 @@
+ // the requested timeout has expired, loop until less
+ // than a jiffie of the desired delay remains.
+ //
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0)
++ current->__state = TASK_INTERRUPTIBLE;
++#else
+ current->state = TASK_INTERRUPTIBLE;
++#endif
+ do
+ {
+ schedule_timeout(jiffies);
diff --git a/system/nvidia-legacy340-kernel/patches/0007-kernel-5.15.patch b/system/nvidia-legacy340-kernel/patches/0007-kernel-5.15.patch
new file mode 100644
index 0000000000..dd367186f9
--- /dev/null
+++ b/system/nvidia-legacy340-kernel/patches/0007-kernel-5.15.patch
@@ -0,0 +1,14 @@
+diff -Naur NVIDIA-Linux-x86_64-340.108-old/kernel/nv-drm.c NVIDIA-Linux-x86_64-340.108-new/kernel/nv-drm.c
+--- NVIDIA-Linux-x86_64-340.108-old/kernel/nv-drm.c 2021-11-06 20:08:18.779739237 +0200
++++ NVIDIA-Linux-x86_64-340.108-new/kernel/nv-drm.c 2021-11-06 20:42:13.443288819 +0200
+@@ -529,7 +529,9 @@ RM_STATUS NV_API_CALL nv_alloc_os_descri
+ #if defined(NV_DRM_GEM_OBJECT_PUT_UNLOCKED_PRESENT)
+ drm_gem_object_put_unlocked(&nv_obj->base);
+ #else
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)
++ drm_gem_object_put(&nv_obj->base);
++#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)
+ drm_gem_object_put_locked(&nv_obj->base);
+ #else
+ drm_gem_object_unreference_unlocked(&nv_obj->base);
diff --git a/system/nvidia-legacy340-kernel/patches/0008-kernel-5.16.patch b/system/nvidia-legacy340-kernel/patches/0008-kernel-5.16.patch
new file mode 100644
index 0000000000..0337bc6d3d
--- /dev/null
+++ b/system/nvidia-legacy340-kernel/patches/0008-kernel-5.16.patch
@@ -0,0 +1,30 @@
+--- a/kernel/os-interface.h 2019-12-11 22:04:24.000000000 +0000
++++ b/kernel/os-interface.h 2022-01-10 02:04:26.740899810 +0000
+@@ -24,7 +24,12 @@
+ * *
+ \***************************************************************************/
+
++#include <linux/version.h>
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0)
++#include <linux/stdarg.h>
++#else
+ #include <stdarg.h>
++#endif
+
+ /*
+ * Define away Microsoft compiler extensions when possible
+--- a/kernel/nv.h 2019-12-11 22:04:24.000000000 +0000
++++ b/kernel/nv.h 2022-01-10 02:29:07.828733372 +0000
+@@ -13,7 +13,12 @@
+ #define _NV_H_
+
+ #include <nvtypes.h>
++#include <linux/version.h>
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0)
++#include <linux/stdarg.h>
++#else
+ #include <stdarg.h>
++#endif
+
+ #if !defined(NV_MIN)
+ #define NV_MIN(_a,_b) ((_a) < (_b) ? (_a) : (_b))
diff --git a/system/nvidia-legacy340-kernel/patches/0009-kernel-5.17.patch b/system/nvidia-legacy340-kernel/patches/0009-kernel-5.17.patch
new file mode 100644
index 0000000000..2c55f8092b
--- /dev/null
+++ b/system/nvidia-legacy340-kernel/patches/0009-kernel-5.17.patch
@@ -0,0 +1,57 @@
+diff -Naur a/kernel/conftest.sh b/kernel/conftest.sh
+--- a/kernel/conftest.sh 2022-04-02 10:27:54.463179319 +0000
++++ b/kernel/conftest.sh 2022-04-02 10:27:54.553179467 +0000
+@@ -1619,7 +1619,11 @@
+ CODE="
+ #include <linux/proc_fs.h>
+ void conftest_PDE_DATA(void) {
++ #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0)
++ pde_data();
++ #else
+ PDE_DATA();
++ #endif
+ }"
+
+ compile_check_conftest "$CODE" "NV_PDE_DATA_PRESENT" "" "functions"
+diff -Naur a/kernel/nv-linux.h b/kernel/nv-linux.h
+--- a/kernel/nv-linux.h 2022-04-02 10:27:54.463179319 +0000
++++ b/kernel/nv-linux.h 2022-04-02 10:27:54.556512806 +0000
+@@ -266,9 +266,9 @@
+ #endif
+
+ #ifdef CONFIG_PROC_FS
+-#include <linux/proc_fs.h>
+ #include <linux/seq_file.h>
+ #endif
++#include <linux/proc_fs.h>
+
+ #ifdef CONFIG_KDB
+ #include <linux/kdb.h>
+@@ -2052,8 +2052,12 @@
+ })
+
+ #if defined(NV_PDE_DATA_PRESENT)
++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0)
+ # define NV_PDE_DATA(inode) PDE_DATA(inode)
+ #else
++# define NV_PDE_DATA(inode) pde_data(inode)
++#endif
++#else
+ # define NV_PDE_DATA(inode) PDE(inode)->data
+ #endif
+
+diff -Naur a/kernel/uvm/conftest.sh b/kernel/uvm/conftest.sh
+--- a/kernel/uvm/conftest.sh 2022-04-02 10:27:54.456512642 +0000
++++ b/kernel/uvm/conftest.sh 2022-04-02 10:27:54.556512806 +0000
+@@ -1578,7 +1578,11 @@
+ CODE="
+ #include <linux/proc_fs.h>
+ void conftest_PDE_DATA(void) {
++ #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0)
++ pde_data();
++ #else
+ PDE_DATA();
++ #endif
+ }"
+
+ compile_check_conftest "$CODE" "NV_PDE_DATA_PRESENT" "" "functions"
diff --git a/system/nvidia-legacy340-kernel/patches/0010-kernel-5.18.patch b/system/nvidia-legacy340-kernel/patches/0010-kernel-5.18.patch
new file mode 100644
index 0000000000..a2d19b0fed
--- /dev/null
+++ b/system/nvidia-legacy340-kernel/patches/0010-kernel-5.18.patch
@@ -0,0 +1,151 @@
+diff -Naur a/kernel/nv-acpi.c b/kernel/nv-acpi.c
+--- a/kernel/nv-acpi.c 2019-12-12 06:04:24.000000000 +0800
++++ b/kernel/nv-acpi.c 2022-05-29 20:00:00.000000000 +0800
+@@ -577,9 +577,13 @@
+ {
+ if (!nvif_parent_gpu_handle) /* unknown error */
+ break;
+-
+- retVal = acpi_bus_get_device(nvif_parent_gpu_handle, &device);
+
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
++ device = acpi_fetch_acpi_dev(nvif_parent_gpu_handle);
++ retVal = 0;
++#else
++ retVal = acpi_bus_get_device(nvif_parent_gpu_handle, &device);
++#endif
+ if (ACPI_FAILURE(retVal) || !device)
+ break;
+
+@@ -652,8 +656,11 @@
+ if (nvif_parent_gpu_handle == NULL)
+ return;
+
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
++ device = acpi_fetch_acpi_dev(nvif_parent_gpu_handle);
++#else
+ acpi_bus_get_device(nvif_parent_gpu_handle, &device);
+-
++#endif
+ nv_uninstall_notifier(device, nv_acpi_event);
+ nvif_parent_gpu_handle = NULL;
+
+@@ -1212,7 +1219,12 @@
+ if (!dev_handle)
+ return RM_ERR_INVALID_ARGUMENT;
+
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
++ device = acpi_fetch_acpi_dev(dev_handle);
++ status = 0;
++#else
+ status = acpi_bus_get_device(dev_handle, &device);
++#endif
+
+ if (ACPI_FAILURE(status) || !device)
+ return RM_ERR_INVALID_ARGUMENT;
+diff -Naur a/kernel/nv-dma.c b/kernel/nv-dma.c
+--- a/kernel/nv-dma.c 2019-12-12 06:04:24.000000000 +0800
++++ b/kernel/nv-dma.c 2022-05-29 20:00:00.000000000 +0800
+@@ -136,10 +136,17 @@
+ return status;
+ }
+
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
++ dma_map->sg_map_count = dma_map_sg(&dma_map->dev->dev,
++ NV_DMA_MAP_SCATTERLIST(dma_map),
++ NV_DMA_MAP_SCATTERLIST_LENGTH(dma_map),
++ DMA_BIDIRECTIONAL);
++#else
+ dma_map->sg_map_count = pci_map_sg(dma_map->dev,
+ NV_DMA_MAP_SCATTERLIST(dma_map),
+ NV_DMA_MAP_SCATTERLIST_LENGTH(dma_map),
+ PCI_DMA_BIDIRECTIONAL);
++#endif
+ if (dma_map->sg_map_count == 0)
+ {
+ nv_printf(NV_DBG_ERRORS,
+@@ -211,8 +218,13 @@
+
+ if (dma_map->sg_map_count != 0)
+ {
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
++ dma_unmap_sg(&dma_map->dev->dev, NV_DMA_MAP_SCATTERLIST(dma_map),
++ NV_DMA_MAP_SCATTERLIST_LENGTH(dma_map), DMA_BIDIRECTIONAL);
++#else
+ pci_unmap_sg(dma_map->dev, NV_DMA_MAP_SCATTERLIST(dma_map),
+ NV_DMA_MAP_SCATTERLIST_LENGTH(dma_map), PCI_DMA_BIDIRECTIONAL);
++#endif
+ }
+
+ *priv = dma_map->user_pages;
+diff -Naur a/kernel/nv-drm.c b/kernel/nv-drm.c
+--- a/kernel/nv-drm.c 2022-05-29 21:57:55.203782383 +0800
++++ b/kernel/nv-drm.c 2022-05-29 20:00:00.000000000 +0800
+@@ -458,9 +458,15 @@
+ return nv_gem_prime_get_sg_table(gem);
+ }
+
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
++static int nv_drm_gem_vmap(struct drm_gem_object *gem,
++ struct iosys_map *map)
++{
++#else
+ static int nv_drm_gem_vmap(struct drm_gem_object *gem,
+ struct dma_buf_map *map)
+ {
++#endif
+ map->vaddr = nv_gem_prime_vmap(gem);
+ if (map->vaddr == NULL) {
+ return -ENOMEM;
+@@ -469,9 +475,15 @@
+ return 0;
+ }
+
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
++static void nv_drm_gem_vunmap(struct drm_gem_object *gem,
++ struct iosys_map *map)
++{
++#else
+ static void nv_drm_gem_vunmap(struct drm_gem_object *gem,
+ struct dma_buf_map *map)
+ {
++#endif
+ nv_gem_prime_vunmap(gem, map->vaddr);
+ map->vaddr = NULL;
+ }
+diff -Naur a/kernel/nv-vm.c b/kernel/nv-vm.c
+--- a/kernel/nv-vm.c 2019-12-12 06:04:24.000000000 +0800
++++ b/kernel/nv-vm.c 2022-05-29 20:00:00.000000000 +0800
+@@ -169,12 +169,20 @@
+
+ static inline int nv_map_sg(struct pci_dev *dev, struct scatterlist *sg)
+ {
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
++ return dma_map_sg(&dev->dev, sg, 1, DMA_BIDIRECTIONAL);
++#else
+ return pci_map_sg(dev, sg, 1, PCI_DMA_BIDIRECTIONAL);
++#endif
+ }
+
+ static inline void nv_unmap_sg(struct pci_dev *dev, struct scatterlist *sg)
+ {
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
++ dma_unmap_sg(&dev->dev, sg, 1, DMA_BIDIRECTIONAL);
++#else
+ pci_unmap_sg(dev, sg, 1, PCI_DMA_BIDIRECTIONAL);
++#endif
+ }
+
+ #define NV_MAP_SG_MAX_RETRIES 16
+diff -Naur a/kernel/nv-frontend.c b/kernel/nv-frontend.c
+--- a/kernel/nv-frontend.c 2019-12-12 06:04:24.000000000 +0800
++++ b/kernel/nv-frontend.c 2022-05-29 20:00:00.000000000 +0800
+@@ -15,7 +15,7 @@
+ #include "nv-frontend.h"
+
+ #if defined(MODULE_LICENSE)
+-MODULE_LICENSE("NVIDIA");
++MODULE_LICENSE("GPL");
+ #endif
+ #if defined(MODULE_INFO)
+ MODULE_INFO(supported, "external");