File kernel-6.4.patch of Package dkms-nvidia

diff -urN kernel.orig/common/inc/nv-linux.h kernel/common/inc/nv-linux.h
--- kernel.orig/common/inc/nv-linux.h	2022-10-12 11:30:27.000000000 +0200
+++ kernel/common/inc/nv-linux.h	2024-07-06 10:07:50.774067332 +0200
@@ -738,9 +738,7 @@
 
 static inline dma_addr_t nv_phys_to_dma(struct pci_dev *dev, NvU64 pa)
 {
-#if defined(NV_PHYS_TO_DMA_PRESENT)
-    return phys_to_dma(&dev->dev, pa);
-#elif defined(NV_XEN_SUPPORT_FULLY_VIRTUALIZED_KERNEL)
+#if defined(NV_XEN_SUPPORT_FULLY_VIRTUALIZED_KERNEL)
     return phys_to_machine(pa);
 #else
     return (dma_addr_t)pa;
@@ -1992,4 +1990,17 @@
 #include <linux/backlight.h>
 #endif
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 3, 0)
+// Rel. commit "mm: introduce vma->vm_flags wrapper functions" (Suren Baghdasaryan, 26 Jan 2023)
+static inline void vm_flags_set(struct vm_area_struct *vma, vm_flags_t flags)
+{
+    vma->vm_flags |= flags;
+}
+
+static inline void vm_flags_clear(struct vm_area_struct *vma, vm_flags_t flags)
+{
+    vma->vm_flags &= ~flags;
+}
+#endif
+
 #endif  /* _NV_LINUX_H_ */
diff -urN kernel.orig/common/inc/nv-mm.h kernel/common/inc/nv-mm.h
--- kernel.orig/common/inc/nv-mm.h	2022-10-12 11:30:26.000000000 +0200
+++ kernel/common/inc/nv-mm.h	2024-07-03 13:02:13.460964501 +0200
@@ -77,126 +77,47 @@
     #if defined(NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS)
         #define NV_GET_USER_PAGES get_user_pages
     #else
-        #include <linux/mm.h>
+	#if defined(NV_GET_USER_PAGES_DROPPED_VMA)
+            #include <linux/mm.h>
 
-        static inline long NV_GET_USER_PAGES(unsigned long start,
-                                             unsigned long nr_pages,
-                                             int write,
-                                             int force,
-                                             struct page **pages,
-                                             struct vm_area_struct **vmas)
-        {
-            unsigned int flags = 0;
-
-            if (write)
-                flags |= FOLL_WRITE;
-            if (force)
-                flags |= FOLL_FORCE;
-
-            return get_user_pages(start, nr_pages, flags, pages, vmas);
-        }
-    #endif
-#endif
-
-/*
- * get_user_pages_remote() was added by commit 1e9877902dc7
- * ("mm/gup: Introduce get_user_pages_remote()") in v4.6 (2016-02-12).
- *
- * The very next commit cde70140fed8 ("mm/gup: Overload get_user_pages()
- * functions") deprecated the 8-argument version of get_user_pages for the
- * non-remote case (calling get_user_pages with current and current->mm).
- *
- * The guidelines are: call NV_GET_USER_PAGES_REMOTE if you need the 8-argument
- * version that uses something other than current and current->mm. Use
- * NV_GET_USER_PAGES if you are refering to current and current->mm.
- *
- * Note that get_user_pages_remote() requires the caller to hold a reference on
- * the task_struct (if non-NULL and if this API has tsk argument) and the mm_struct.
- * This will always be true when using current and current->mm. If the kernel passes
- * the driver a vma via driver callback, the kernel holds a reference on vma->vm_mm
- * over that callback.
- *
- * get_user_pages_remote() write/force parameters were replaced
- * with gup_flags by commit 9beae1ea8930 ("mm: replace get_user_pages_remote()
- * write/force parameters with gup_flags") in v4.9 (2016-10-13).
- *
- * get_user_pages_remote() added 'locked' parameter by commit 5b56d49fc31d
- * ("mm: add locked parameter to get_user_pages_remote()") in
- * v4.10 (2016-12-14).
- *
- * get_user_pages_remote() removed 'tsk' parameter by
- * commit 64019a2e467a ("mm/gup: remove task_struct pointer for
- * all gup code") in v5.9-rc1 (2020-08-11).
- *
- */
-
-#if defined(NV_GET_USER_PAGES_REMOTE_PRESENT)
-    #if defined(NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS)
-        #define NV_GET_USER_PAGES_REMOTE    get_user_pages_remote
-    #else
-        static inline long NV_GET_USER_PAGES_REMOTE(struct task_struct *tsk,
-                                                    struct mm_struct *mm,
-                                                    unsigned long start,
-                                                    unsigned long nr_pages,
-                                                    int write,
-                                                    int force,
-                                                    struct page **pages,
-                                                    struct vm_area_struct **vmas)
-        {
-            unsigned int flags = 0;
-
-            if (write)
-                flags |= FOLL_WRITE;
-            if (force)
-                flags |= FOLL_FORCE;
-
-        #if defined(NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG)
-            #if defined (NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG)
-               return get_user_pages_remote(tsk, mm, start, nr_pages, flags,
-                                            pages, vmas, NULL);
-            #else
-               return get_user_pages_remote(mm, start, nr_pages, flags,
-                                            pages, vmas, NULL);
-            #endif
-
-        #else
-
-               return get_user_pages_remote(tsk, mm, start, nr_pages, flags,
-                                            pages, vmas);
-
-        #endif
-
-        }
-    #endif
-#else
-    #if defined(NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS)
-        #define NV_GET_USER_PAGES_REMOTE    NV_GET_USER_PAGES
-    #else
-        #include <linux/mm.h>
-        #include <linux/sched.h>
-
-        static inline long NV_GET_USER_PAGES_REMOTE(struct task_struct *tsk,
-                                                    struct mm_struct *mm,
-                                                    unsigned long start,
-                                                    unsigned long nr_pages,
-                                                    int write,
-                                                    int force,
-                                                    struct page **pages,
-                                                    struct vm_area_struct **vmas)
-        {
-            unsigned int flags = 0;
-
-            if (write)
-                flags |= FOLL_WRITE;
-            if (force)
-                flags |= FOLL_FORCE;
-
-            return get_user_pages(tsk, mm, start, nr_pages, flags, pages, vmas);
-        }
+            static inline long NV_GET_USER_PAGES(unsigned long start,
+                                                 unsigned long nr_pages,
+                                                 int write,
+                                                 int force,
+                                                 struct page **pages)
+            {
+                unsigned int flags = 0;
+
+                if (write)
+                    flags |= FOLL_WRITE;
+                if (force)
+                    flags |= FOLL_FORCE;
+
+                return get_user_pages(start, nr_pages, flags, pages);
+            }
+	#else
+            #include <linux/mm.h>
+
+            static inline long NV_GET_USER_PAGES(unsigned long start,
+                                                 unsigned long nr_pages,
+                                                 int write,
+                                                 int force,
+                                                 struct page **pages,
+                                                 struct vm_area_struct **vmas)
+            {
+                unsigned int flags = 0;
+
+                if (write)
+                    flags |= FOLL_WRITE;
+                if (force)
+                    flags |= FOLL_FORCE;
+
+                return get_user_pages(start, nr_pages, flags, pages, vmas);
+            }
+	#endif
     #endif
 #endif
 
-
 /*
  * The .virtual_address field was effectively renamed to .address, by these
  * two commits:
diff -urN kernel.orig/conftest.sh kernel/conftest.sh
--- kernel.orig/conftest.sh	2022-10-11 18:00:50.000000000 +0200
+++ kernel/conftest.sh	2024-07-03 13:02:14.180958831 +0200
@@ -3051,7 +3051,6 @@
             # write and force parameters AND that gup has task_struct and
             # mm_struct as its first arguments.
             # Return if available.
-            # Fall through to default case if absent.
 
             echo "$CONFTEST_PREAMBLE
             #include <linux/mm.h>
@@ -3075,99 +3074,16 @@
                 return
             fi
 
-            echo "#define NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions"
-            echo "#define NV_GET_USER_PAGES_HAS_TASK_STRUCT" | append_conftest "functions"
-
-            return
-        ;;
-
-        get_user_pages_remote)
-            #
-            # Determine if the function get_user_pages_remote() is
-            # present and has write/force/locked/tsk parameters.
-            #
-            # get_user_pages_remote() was added by:
-            #   2016 Feb 12: 1e9877902dc7e11d2be038371c6fbf2dfcd469d7
-            #
-            # get_user_pages[_remote]() write/force parameters
-            # replaced with gup_flags:
-            #   2016 Oct 12: 768ae309a96103ed02eb1e111e838c87854d8b51
-            #   2016 Oct 12: 9beae1ea89305a9667ceaab6d0bf46a045ad71e7
-            #
-            # get_user_pages_remote() added 'locked' parameter
-            #   2016 Dec 14:5b56d49fc31dbb0487e14ead790fc81ca9fb2c99
-            #
-            # get_user_pages_remote() removed 'tsk' parameter by
-            # commit 64019a2e467a ("mm/gup: remove task_struct pointer for
-            # all gup code") in v5.9-rc1 (2020-08-11).
-            #
-            # conftest #1: check if get_user_pages_remote() is available
-            # return if not available.
-            # Fall through to conftest #2 if it is present
-
-            echo "$CONFTEST_PREAMBLE
-            #include <linux/mm.h>
-            void conftest_get_user_pages_remote(void) {
-                get_user_pages_remote();
-            }" > conftest$$.c
-
-            $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
-            rm -f conftest$$.c
-
-            if [ -f conftest$$.o ]; then
-                echo "#undef NV_GET_USER_PAGES_REMOTE_PRESENT" | append_conftest "functions"
-                echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG" | append_conftest "functions"
-                echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions"
-                echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions"
-                rm -f conftest$$.o
-                return
-            fi
-
-            # conftest #2: check if get_user_pages_remote() has write and
-            # force arguments. Return if these arguments are present
-            # Fall through to conftest #3 if these args are absent.
-            echo "#define NV_GET_USER_PAGES_REMOTE_PRESENT" | append_conftest "functions"
-            echo "$CONFTEST_PREAMBLE
-            #include <linux/mm.h>
-            long get_user_pages_remote(struct task_struct *tsk,
-                                       struct mm_struct *mm,
-                                       unsigned long start,
-                                       unsigned long nr_pages,
-                                       int write,
-                                       int force,
-                                       struct page **pages,
-                                       struct vm_area_struct **vmas) {
-                return 0;
-            }" > conftest$$.c
-
-            $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
-            rm -f conftest$$.c
-
-            if [ -f conftest$$.o ]; then
-                echo "#define NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG" | append_conftest "functions"
-                echo "#define NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions"
-                echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions"
-                rm -f conftest$$.o
-                return
-            fi
-
-            echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions"
+            # Conftest #4: check if vma arg was dropped
+            # Return if available.
+            # Fall through to default case if absent.
 
-            #
-            # conftest #3: check if get_user_pages_remote() has locked argument
-            # Return if these arguments are present. Fall through to conftest #4
-            # if these args are absent.
-            #
             echo "$CONFTEST_PREAMBLE
             #include <linux/mm.h>
-            long get_user_pages_remote(struct task_struct *tsk,
-                                       struct mm_struct *mm,
-                                       unsigned long start,
-                                       unsigned long nr_pages,
-                                       unsigned int gup_flags,
-                                       struct page **pages,
-                                       struct vm_area_struct **vmas,
-                                       int *locked) {
+            long get_user_pages(unsigned long start,
+                                unsigned long nr_pages,
+                                unsigned int gup_flags,
+                                struct page **pages) {
                 return 0;
             }" > conftest$$.c
 
@@ -3175,40 +3091,18 @@
             rm -f conftest$$.c
 
             if [ -f conftest$$.o ]; then
-                echo "#define NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG" | append_conftest "functions"
-                echo "#define NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions"
-                rm -f conftest$$.o
+                echo "#define NV_GET_USER_PAGES_DROPPED_VMA" | append_conftest "functions"
+                echo "#undef NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions"
+                echo "#undef NV_GET_USER_PAGES_HAS_TASK_STRUCT" | append_conftest "functions"
+                 rm -f conftest$$.o
                 return
             fi
 
-            #
-            # conftest #4: check if get_user_pages_remote() does not take
-            # tsk argument.
-            #
-            echo "$CONFTEST_PREAMBLE
-            #include <linux/mm.h>
-            long get_user_pages_remote(struct mm_struct *mm,
-                                       unsigned long start,
-                                       unsigned long nr_pages,
-                                       unsigned int gup_flags,
-                                       struct page **pages,
-                                       struct vm_area_struct **vmas,
-                                       int *locked) {
-                return 0;
-            }" > conftest$$.c
-
-            $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
-            rm -f conftest$$.c
 
-            if [ -f conftest$$.o ]; then
-                echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG" | append_conftest "functions"
-                echo "#define NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions"
-                rm -f conftest$$.o
-            else
+            echo "#define NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions"
+            echo "#define NV_GET_USER_PAGES_HAS_TASK_STRUCT" | append_conftest "functions"
 
-                echo "#define NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG" | append_conftest "functions"
-                echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions"
-            fi
+            return
         ;;
 
         usleep_range)
diff -urN kernel.orig/nvidia/nv-acpi.c kernel/nvidia/nv-acpi.c
--- kernel.orig/nvidia/nv-acpi.c	2022-10-12 11:30:26.000000000 +0200
+++ kernel/nvidia/nv-acpi.c	2024-07-03 11:31:22.854692603 +0200
@@ -15,7 +15,13 @@
 #include "nv-linux.h"
 #include "nv-reg.h"
 
-#if defined(NV_LINUX_ACPI_EVENTS_SUPPORTED)
+#include <linux/version.h>
+#include <linux/utsname.h>
+
+#include <linux/version.h>
+// Rel.commit "ACPI: bus: Drop unused list heads from struct acpi_device" (Rafael J. Wysocki, 4 Jun 2022)
+// Disable ACPI support due to more GPL stuff (acpi_dev_for_each_child is only GPL-exported)
+#if defined(NV_LINUX_ACPI_EVENTS_SUPPORTED) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 0, 0))
 static NV_STATUS   nv_acpi_extract_integer (const union acpi_object *, void *, NvU32, NvU32 *);
 static NV_STATUS   nv_acpi_extract_buffer  (const union acpi_object *, void *, NvU32, NvU32 *);
 static NV_STATUS   nv_acpi_extract_package (const union acpi_object *, void *, NvU32, NvU32 *);
@@ -23,7 +29,9 @@
 
 static int         nv_acpi_add             (struct acpi_device *);
 
-#if !defined(NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT) || (NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT == 2)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 2, 0)
+static void        nv_acpi_remove_one_arg(struct acpi_device *device);
+#elif !defined(NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT) || (NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT == 2)
 static int         nv_acpi_remove_two_args(struct acpi_device *device, int type);
 #else
 static int         nv_acpi_remove_one_arg(struct acpi_device *device);
@@ -41,6 +49,10 @@
 static int         nv_acpi_match           (struct acpi_device *, struct acpi_driver *);
 #endif
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
+#undef NV_ACPI_BUS_GET_DEVICE_PRESENT
+#endif
+
 #if defined(ACPI_VIDEO_HID) && defined(NV_ACPI_DEVICE_ID_HAS_DRIVER_DATA) 
 static const struct acpi_device_id nv_video_device_ids[] = {
     { 
@@ -73,7 +85,9 @@
 #endif
     .ops = {
         .add = nv_acpi_add,
-#if !defined(NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT) || (NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT == 2)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 2, 0)
+        .remove = nv_acpi_remove_one_arg,
+#elif !defined(NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT) || (NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT == 2)
         .remove = nv_acpi_remove_two_args,
 #else
         .remove = nv_acpi_remove_one_arg,
@@ -331,7 +345,9 @@
     return 0;
 }
 
-#if !defined(NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT) || (NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT == 2)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 2, 0)
+static void nv_acpi_remove_one_arg(struct acpi_device *device)
+#elif !defined(NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT) || (NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT == 2)
 static int nv_acpi_remove_two_args(struct acpi_device *device, int type)
 #else
 static int nv_acpi_remove_one_arg(struct acpi_device *device)
@@ -384,8 +400,9 @@
         module_put(THIS_MODULE);
         device->driver_data = NULL;
     }
-
+#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 2, 0)
     return status;
+#endif
 }
 
 static void nv_acpi_event(acpi_handle handle, u32 event_type, void *data)
diff -urN kernel.orig/nvidia/nv.c kernel/nvidia/nv.c
--- kernel.orig/nvidia/nv.c	2022-10-12 11:30:26.000000000 +0200
+++ kernel/nvidia/nv.c	2024-07-03 11:30:50.031951572 +0200
@@ -337,6 +337,18 @@
  *** STATIC functions
  ***/
 
+#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 18, 0)
+static inline int pci_set_dma_mask(struct pci_dev *pdev, u64 mask)
+{
+      return dma_set_mask(&pdev->dev, mask);
+}
+
+static inline int pci_set_consistent_dma_mask(struct pci_dev *pdev, u64 mask)
+{
+      return dma_set_coherent_mask(&pdev->dev, mask);
+}
+#endif
+
 static
 nv_alloc_t *nvos_create_alloc(
     struct pci_dev *dev,
diff -urN kernel.orig/nvidia/nv-dma.c kernel/nvidia/nv-dma.c
--- kernel.orig/nvidia/nv-dma.c	2022-10-12 11:30:26.000000000 +0200
+++ kernel/nvidia/nv-dma.c	2024-07-03 11:30:49.410956441 +0200
@@ -14,6 +14,81 @@
 #include "os-interface.h"
 #include "nv-linux.h"
 
+#include <linux/version.h>
+#include <linux/utsname.h>
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
+#define PCI_DMA_TODEVICE DMA_TO_DEVICE
+#define PCI_DMA_FROMDEVICE DMA_FROM_DEVICE
+#define PCI_DMA_BIDIRECTIONAL DMA_BIDIRECTIONAL
+
+static inline dma_addr_t
+pci_map_page(struct pci_dev *hwdev, struct page *page,
+	     unsigned long offset, size_t size, int direction)
+{
+	return dma_map_page(&hwdev->dev, page, offset, size, (enum dma_data_direction)direction);
+}
+
+static inline void
+pci_unmap_page(struct pci_dev *hwdev, dma_addr_t dma_address,
+	       size_t size, int direction)
+{
+	dma_unmap_page(&hwdev->dev, dma_address, size, (enum dma_data_direction)direction);
+}
+
+static inline int pci_set_dma_mask(struct pci_dev *pdev, u64 mask)
+{
+	return dma_set_mask(&pdev->dev, mask);
+}
+
+static inline dma_addr_t
+pci_map_single(struct pci_dev *hwdev, void *ptr, size_t size, int direction)
+{
+	return dma_map_single(&hwdev->dev, ptr, size, (enum dma_data_direction)direction);
+}
+
+static inline void
+pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr,
+		 size_t size, int direction)
+{
+	dma_unmap_single(&hwdev->dev, dma_addr, size, (enum dma_data_direction)direction);
+}
+
+static inline int
+pci_dma_mapping_error(struct pci_dev *pdev, dma_addr_t dma_addr)
+{
+	return dma_mapping_error(&pdev->dev, dma_addr);
+}
+
+static inline void
+pci_dma_sync_single_for_cpu(struct pci_dev *hwdev, dma_addr_t dma_handle,
+			    size_t size, int direction)
+{
+	dma_sync_single_for_cpu(&hwdev->dev, dma_handle, size, (enum dma_data_direction)direction);
+}
+
+static inline void
+pci_dma_sync_single_for_device(struct pci_dev *hwdev, dma_addr_t dma_handle,
+			       size_t size, int direction)
+{
+	dma_sync_single_for_device(&hwdev->dev, dma_handle, size, (enum dma_data_direction)direction);
+}
+
+static inline int
+pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg,
+          int nents, int direction)
+{
+	return dma_map_sg(&hwdev->dev, sg, nents, (enum dma_data_direction)direction);
+}
+
+static inline void
+pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg,
+	      int nents, int direction)
+{
+	dma_unmap_sg(&hwdev->dev, sg, nents, (enum dma_data_direction)direction);
+}
+#endif
+
 NV_STATUS   nv_create_dma_map_scatterlist (nv_dma_map_t *dma_map);
 void        nv_destroy_dma_map_scatterlist(nv_dma_map_t *dma_map);
 NV_STATUS   nv_map_dma_map_scatterlist    (nv_dma_map_t *dma_map);
diff -urN kernel.orig/nvidia/nv-mmap.c kernel/nvidia/nv-mmap.c
--- kernel.orig/nvidia/nv-mmap.c	2022-10-12 11:30:26.000000000 +0200
+++ kernel/nvidia/nv-mmap.c	2024-07-03 11:31:45.136512765 +0200
@@ -447,7 +447,7 @@
             addr  = mmap_start;
             
             // Needed for the linux kernel for mapping compound pages
-            vma->vm_flags |= VM_MIXEDMAP;
+            vm_flags_set(vma, VM_MIXEDMAP);
 
             for (j = 0; j < pages; j++)
             {
@@ -471,7 +471,7 @@
             }
         }
 
-        vma->vm_flags |= VM_IO;
+        vm_flags_set(vma, VM_IO);
     }
     else
     {
@@ -533,15 +533,15 @@
 
         NV_PRINT_AT(NV_DBG_MEMINFO, at);
 
-        vma->vm_flags |= (VM_IO | VM_LOCKED | VM_RESERVED);
-        vma->vm_flags |= (VM_DONTEXPAND | VM_DONTDUMP);
+        vm_flags_set(vma, VM_IO | VM_LOCKED | VM_RESERVED);
+        vm_flags_set(vma, VM_DONTEXPAND | VM_DONTDUMP);
     }
 
     if ((prot & NV_PROTECT_WRITEABLE) == 0)
     {
         vma->vm_page_prot = NV_PGPROT_READ_ONLY(vma->vm_page_prot);
-        vma->vm_flags &= ~VM_WRITE;
-        vma->vm_flags &= ~VM_MAYWRITE;
+        vm_flags_clear(vma, VM_WRITE);
+        vm_flags_clear(vma, VM_MAYWRITE);
     }
 
     vma->vm_ops = &nv_vm_ops;
diff -urN kernel.orig/nvidia/os-mlock.c kernel/nvidia/os-mlock.c
--- kernel.orig/nvidia/os-mlock.c	2022-10-12 11:30:26.000000000 +0200
+++ kernel/nvidia/os-mlock.c	2024-07-03 13:02:15.042952023 +0200
@@ -127,8 +127,13 @@
     }
 
     nv_mmap_read_lock(mm);
+#if defined(NV_GET_USER_PAGES_DROPPED_VMA)
+    ret = NV_GET_USER_PAGES((unsigned long)address,
+                            page_count, write, force, user_pages);
+#else
     ret = NV_GET_USER_PAGES((unsigned long)address,
                             page_count, write, force, user_pages, NULL);
+#endif
     nv_mmap_read_unlock(mm);
     pinned = ret;
 
diff -urN kernel.orig/nvidia-drm/nvidia-drm-connector.c kernel/nvidia-drm/nvidia-drm-connector.c
--- kernel.orig/nvidia-drm/nvidia-drm-connector.c	2022-10-12 11:30:31.000000000 +0200
+++ kernel/nvidia-drm/nvidia-drm-connector.c	2024-07-03 11:31:23.552686968 +0200
@@ -30,6 +30,9 @@
 #include "nvidia-drm-utils.h"
 #include "nvidia-drm-encoder.h"
 
+#include <linux/version.h>
+#include <linux/utsname.h>
+
 /*
  * Commit fcd70cd36b9b ("drm: Split out drm_probe_helper.h")
  * moves a number of helper function definitions from
@@ -58,6 +61,24 @@
     nv_drm_free(nv_connector);
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 2, 0)
+static bool check_edid_override(struct drm_connector *connector)
+{
+	return connector->override_edid != NULL;
+}
+#else
+static bool check_edid_override(struct drm_connector *connector)
+{
+	int ret;
+
+	mutex_lock(&connector->edid_override_mutex);
+	ret = connector->edid_override != NULL;
+	mutex_lock(&connector->edid_override_mutex);
+
+	return ret;
+}
+#endif
+
 static bool
 __nv_drm_detect_encoder(struct NvKmsKapiDynamicDisplayParams *pDetectParams,
                         struct drm_connector *connector,
@@ -98,7 +119,7 @@
             break;
     }
 
-    if (connector->override_edid) {
+    if (check_edid_override(connector)) {
         const struct drm_property_blob *edid = connector->edid_blob_ptr;
 
         if (edid->length <= sizeof(pDetectParams->edid.buffer)) {
diff -urN kernel.orig/nvidia-drm/nvidia-drm-drv.c kernel/nvidia-drm/nvidia-drm-drv.c
--- kernel.orig/nvidia-drm/nvidia-drm-drv.c	2022-10-12 11:30:31.000000000 +0200
+++ kernel/nvidia-drm/nvidia-drm-drv.c	2024-07-06 10:09:52.790134069 +0200
@@ -61,6 +61,9 @@
 
 #include <linux/pci.h>
 
+#include <linux/version.h>
+#include <linux/utsname.h>
+
 /*
  * Commit fcd70cd36b9b ("drm: Split out drm_probe_helper.h")
  * moves a number of helper function definitions from
@@ -239,9 +242,10 @@
     dev->mode_config.preferred_depth = 24;
     dev->mode_config.prefer_shadow = 1;
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 2, 0)
     /* Currently unused. Update when needed. */
-
     dev->mode_config.fb_base = 0;
+#endif
 
     dev->mode_config.async_page_flip = false;
 
@@ -701,7 +705,11 @@
     .ioctls                 = nv_drm_ioctls,
     .num_ioctls             = ARRAY_SIZE(nv_drm_ioctls),
 
+// Rel. commit "drm/prime: Unexport helpers for fd/handle conversion" (Thomas Zimmermann, 20 Jun 2023)
+// This function is no longer exported, but leaving it to NULL is equivalent
+#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 6, 0)
     .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
+#endif
 
 #if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_CALLBACKS)
     .gem_prime_export       = nv_drm_gem_prime_export,
@@ -762,7 +770,9 @@
 
     nv_drm_driver.dumb_create      = nv_drm_dumb_create;
     nv_drm_driver.dumb_map_offset  = nv_drm_dumb_map_offset;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0)
     nv_drm_driver.dumb_destroy     = nv_drm_dumb_destroy;
+#endif
 
 #if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_CALLBACKS)
     nv_drm_driver.gem_vm_ops       = &nv_drm_gem_vma_ops;
diff -urN kernel.orig/nvidia-drm/nvidia-drm-fb.c kernel/nvidia-drm/nvidia-drm-fb.c
--- kernel.orig/nvidia-drm/nvidia-drm-fb.c	2022-10-12 11:30:31.000000000 +0200
+++ kernel/nvidia-drm/nvidia-drm-fb.c	2024-07-03 11:31:44.849515081 +0200
@@ -29,6 +29,7 @@
 #include "nvidia-drm-fb.h"
 #include "nvidia-drm-utils.h"
 #include "nvidia-drm-gem.h"
+#include "nvidia-drm-helper.h"
 
 #include <drm/drm_crtc_helper.h>
 
diff -urN kernel.orig/nvidia-drm/nvidia-drm-gem.c kernel/nvidia-drm/nvidia-drm-gem.c
--- kernel.orig/nvidia-drm/nvidia-drm-gem.c	2022-10-12 11:30:31.000000000 +0200
+++ kernel/nvidia-drm/nvidia-drm-gem.c	2024-07-03 11:30:50.374948879 +0200
@@ -31,12 +31,25 @@
 #include "nvidia-dma-resv-helper.h"
 #include "nvidia-drm-gem-nvkms-memory.h"
 
+#include <linux/version.h>
+#include <linux/utsname.h>
+
 #if defined(NV_DRM_DRM_PRIME_H_PRESENT)
 #include <drm/drm_prime.h>
 #endif
 
 #include "linux/dma-buf.h"
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
+struct dma_buf_map {
+	union {
+		void __iomem *vaddr_iomem;
+		void *vaddr;
+	};
+	bool is_iomem;
+};
+#endif
+
 void nv_drm_gem_free(struct drm_gem_object *gem)
 {
     struct nv_drm_gem_object *nv_gem = to_nv_gem_object(gem);
@@ -64,8 +77,13 @@
 typedef struct dma_buf_map nv_sysio_map_t;
 #endif
 
+#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,
-                           nv_sysio_map_t *map)
+			   struct dma_buf_map *map)
+#endif
 {
     map->vaddr = nv_drm_gem_prime_vmap(gem);
     if (map->vaddr == NULL) {
@@ -75,8 +93,14 @@
     return 0;
 }
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
 static void nv_drm_gem_vunmap(struct drm_gem_object *gem,
-                              nv_sysio_map_t *map)
+			      struct iosys_map *map)
+#else
+
+static void nv_drm_gem_vunmap(struct drm_gem_object *gem,
+			      struct dma_buf_map *map)
+#endif
 {
     nv_drm_gem_prime_vunmap(gem, map->vaddr);
     map->vaddr = NULL;
diff -urN kernel.orig/nvidia-drm/nvidia-drm-helper.c kernel/nvidia-drm/nvidia-drm-helper.c
--- kernel.orig/nvidia-drm/nvidia-drm-helper.c	2022-10-12 11:30:31.000000000 +0200
+++ kernel/nvidia-drm/nvidia-drm-helper.c	2024-07-03 11:31:14.313761164 +0200
@@ -52,6 +52,11 @@
 #include <drm/drm_framebuffer.h>
 #endif
 
+// Add header which is no longer indirectly referenced as of Linux 6.0-rc1
+#if defined(NV_DRM_DRM_FRAMEBUFFER_H_PRESENT)
+#include <drm/drm_framebuffer.h>
+#endif
+
 static void __nv_drm_framebuffer_put(struct drm_framebuffer *fb)
 {
 #if defined(NV_DRM_FRAMEBUFFER_GET_PRESENT)
diff -urN kernel.orig/nvidia-drm/nvidia-drm-linux.c kernel/nvidia-drm/nvidia-drm-linux.c
--- kernel.orig/nvidia-drm/nvidia-drm-linux.c	2022-10-12 11:30:31.000000000 +0200
+++ kernel/nvidia-drm/nvidia-drm-linux.c	2024-07-03 13:02:14.640955199 +0200
@@ -115,8 +115,13 @@
 
     nv_mmap_read_lock(mm);
 
+#if defined(NV_GET_USER_PAGES_DROPPED_VMA)
+    pages_pinned = NV_GET_USER_PAGES(address, pages_count, write, force,
+		                     user_pages);
+#else
     pages_pinned = NV_GET_USER_PAGES(address, pages_count, write, force,
                                      user_pages, NULL);
+#endif
     nv_mmap_read_unlock(mm);
 
     if (pages_pinned < 0 || (unsigned)pages_pinned < pages_count) {
diff -urN kernel.orig/nvidia-uvm/uvm8.c kernel/nvidia-uvm/uvm8.c
--- kernel.orig/nvidia-uvm/uvm8.c	2022-10-12 11:30:28.000000000 +0200
+++ kernel/nvidia-uvm/uvm8.c	2024-07-03 11:31:58.659403656 +0200
@@ -658,7 +658,7 @@
     // Using VM_DONTCOPY would be nice, but madvise(MADV_DOFORK) can reset that
     // so we have to handle vm_open on fork anyway. We could disable MADV_DOFORK
     // with VM_IO, but that causes other mapping issues.
-    vma->vm_flags |= VM_MIXEDMAP | VM_DONTEXPAND;
+    vm_flags_set(vma, VM_MIXEDMAP | VM_DONTEXPAND);
 
     vma->vm_ops = &uvm_vm_ops_managed;
 
diff -urN kernel.orig/nvidia-uvm/uvm8_gpu.c kernel/nvidia-uvm/uvm8_gpu.c
--- kernel.orig/nvidia-uvm/uvm8_gpu.c	2022-10-12 11:30:28.000000000 +0200
+++ kernel/nvidia-uvm/uvm8_gpu.c	2024-07-03 11:31:01.836858997 +0200
@@ -39,6 +39,67 @@
 #include "nv-kthread-q.h"
 #include "uvm8_gpu_access_counters.h"
 
+#include <linux/version.h>
+#include <linux/utsname.h>
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
+#define PCI_DMA_TODEVICE DMA_TO_DEVICE
+#define PCI_DMA_FROMDEVICE DMA_FROM_DEVICE
+#define PCI_DMA_BIDIRECTIONAL DMA_BIDIRECTIONAL
+
+static inline dma_addr_t
+pci_map_page(struct pci_dev *hwdev, struct page *page,
+	     unsigned long offset, size_t size, int direction)
+{
+	return dma_map_page(&hwdev->dev, page, offset, size, (enum dma_data_direction)direction);
+}
+
+static inline void
+pci_unmap_page(struct pci_dev *hwdev, dma_addr_t dma_address,
+	       size_t size, int direction)
+{
+	dma_unmap_page(&hwdev->dev, dma_address, size, (enum dma_data_direction)direction);
+}
+
+static inline int pci_set_dma_mask(struct pci_dev *pdev, u64 mask)
+{
+	return dma_set_mask(&pdev->dev, mask);
+}
+
+static inline dma_addr_t
+pci_map_single(struct pci_dev *hwdev, void *ptr, size_t size, int direction)
+{
+	return dma_map_single(&hwdev->dev, ptr, size, (enum dma_data_direction)direction);
+}
+
+static inline void
+pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr,
+		 size_t size, int direction)
+{
+	dma_unmap_single(&hwdev->dev, dma_addr, size, (enum dma_data_direction)direction);
+}
+
+static inline int
+pci_dma_mapping_error(struct pci_dev *pdev, dma_addr_t dma_addr)
+{
+	return dma_mapping_error(&pdev->dev, dma_addr);
+}
+
+static inline void
+pci_dma_sync_single_for_cpu(struct pci_dev *hwdev, dma_addr_t dma_handle,
+			    size_t size, int direction)
+{
+	dma_sync_single_for_cpu(&hwdev->dev, dma_handle, size, (enum dma_data_direction)direction);
+}
+
+static inline void
+pci_dma_sync_single_for_device(struct pci_dev *hwdev, dma_addr_t dma_handle,
+			       size_t size, int direction)
+{
+	dma_sync_single_for_device(&hwdev->dev, dma_handle, size, (enum dma_data_direction)direction);
+}
+#endif
+
 int uvm8_ats_mode = 0;
 module_param(uvm8_ats_mode, int, S_IRUGO);
 MODULE_PARM_DESC(uvm8_ats_mode, "Enable ATS (Address Translation Services) "
diff -urN kernel.orig/nvidia-uvm/uvm8_tools.c kernel/nvidia-uvm/uvm8_tools.c
--- kernel.orig/nvidia-uvm/uvm8_tools.c	2022-10-12 11:30:28.000000000 +0200
+++ kernel/nvidia-uvm/uvm8_tools.c	2024-07-03 13:02:20.617907972 +0200
@@ -251,13 +251,37 @@
     }
 
     nv_mmap_read_lock(current->mm);
+#if defined(NV_GET_USER_PAGES_DROPPED_VMA)
+    ret = NV_GET_USER_PAGES(user_va, num_pages, 1, 0, *pages);
+#else
     ret = NV_GET_USER_PAGES(user_va, num_pages, 1, 0, *pages, vmas);
+#endif
     nv_mmap_read_unlock(current->mm);
     if (ret != num_pages) {
         status = NV_ERR_INVALID_ARGUMENT;
         goto fail;
     }
 
+#if defined(NV_GET_USER_PAGES_DROPPED_VMA)
+    struct vm_area_struct *vma;
+    unsigned long start;
+
+    nv_mmap_read_lock(current->mm);
+    start = user_va;
+    for (i = 0; i < num_pages; i++) {
+        vma = find_vma(current->mm, start);
+        if (!vma) {
+	    nv_mmap_read_unlock(current->mm);
+	    status = NV_ERR_INVALID_ARGUMENT;
+	    goto fail;
+	}
+
+        vmas[i] = vma;
+        start = (start + PAGE_SIZE) & PAGE_MASK;
+    }
+    nv_mmap_read_unlock(current->mm);
+#endif
+
     for (i = 0; i < num_pages; i++) {
         if (page_count((*pages)[i]) > MAX_PAGE_COUNT || uvm_file_is_nvidia_uvm(vmas[i]->vm_file)) {
             status = NV_ERR_INVALID_ARGUMENT;
openSUSE Build Service is sponsored by