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;