diff -Nru nvidia-graphics-drivers-390-390.138/debian/changelog nvidia-graphics-drivers-390-390.138/debian/changelog --- nvidia-graphics-drivers-390-390.138/debian/changelog 2020-07-13 16:03:46.000000000 +0000 +++ nvidia-graphics-drivers-390-390.138/debian/changelog 2020-12-14 17:18:10.000000000 +0000 @@ -1,3 +1,11 @@ +nvidia-graphics-drivers-390 (390.138-0ubuntu3) hirsute; urgency=medium + + * Prevent building UVM on Linux 5.10 or newer (LP: #1908099) + * debian/dkms_nvidia/patches/buildfix_kernel_5.10.patch (LP: #1908099): + - Add support for Linux 5.10 (fix build errors). + + -- Andrea Righi Mon, 14 Dec 2020 17:18:10 +0000 + nvidia-graphics-drivers-390 (390.138-0ubuntu2) groovy; urgency=medium * debian/dkms_nvidia/patches/buildfix_kernel_5.8.patch, diff -Nru nvidia-graphics-drivers-390-390.138/debian/dkms.conf.fragment nvidia-graphics-drivers-390-390.138/debian/dkms.conf.fragment --- nvidia-graphics-drivers-390-390.138/debian/dkms.conf.fragment 2020-07-13 16:03:46.000000000 +0000 +++ nvidia-graphics-drivers-390-390.138/debian/dkms.conf.fragment 2020-12-14 17:18:10.000000000 +0000 @@ -1,3 +1,5 @@ -BUILT_MODULE_NAME[3]="nvidia-uvm" -DEST_MODULE_LOCATION[3]="/kernel/drivers/char/drm" +if [ -z "$EXCLUDED" ]; then + BUILT_MODULE_NAME[3]="nvidia-uvm" + DEST_MODULE_LOCATION[3]="/kernel/drivers/char/drm" +fi #PATCH[2]="buildfix_kernel_4.9_amd64_only.patch" diff -Nru nvidia-graphics-drivers-390-390.138/debian/dkms_nvidia/patches/buildfix_kernel_5.10.patch nvidia-graphics-drivers-390-390.138/debian/dkms_nvidia/patches/buildfix_kernel_5.10.patch --- nvidia-graphics-drivers-390-390.138/debian/dkms_nvidia/patches/buildfix_kernel_5.10.patch 1970-01-01 00:00:00.000000000 +0000 +++ nvidia-graphics-drivers-390-390.138/debian/dkms_nvidia/patches/buildfix_kernel_5.10.patch 2020-12-14 17:18:10.000000000 +0000 @@ -0,0 +1,312 @@ +diff -urpN a/common/inc/nv-linux.h b/common/inc/nv-linux.h +--- a/common/inc/nv-linux.h 2021-01-07 11:40:57.406665892 +0000 ++++ b/common/inc/nv-linux.h 2021-01-07 11:55:01.738263821 +0000 +@@ -161,8 +161,10 @@ static inline uid_t __kuid_val(kuid_t ui + + #if defined(NVCPU_X86_64) && !defined(HAVE_COMPAT_IOCTL) + #include /* sys_ioctl() */ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) + #include /* register_ioctl32_conversion() */ + #endif ++#endif + + #if !defined(NV_FILE_OPERATIONS_HAS_IOCTL) && \ + !defined(NV_FILE_OPERATIONS_HAS_UNLOCKED_IOCTL) +@@ -175,7 +177,11 @@ static inline uid_t __kuid_val(kuid_t ui + + #if defined(NV_VM_INSERT_PAGE_PRESENT) + #include ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) + #include ++#else ++#include ++#endif + #endif + + #if defined(CONFIG_SWIOTLB) && defined(NVCPU_AARCH64) +diff -urpN a/common/inc/nv-mm.h b/common/inc/nv-mm.h +--- a/common/inc/nv-mm.h 2021-01-07 11:40:57.406665892 +0000 ++++ b/common/inc/nv-mm.h 2021-01-07 11:55:01.738263821 +0000 +@@ -25,6 +25,9 @@ + + #include "conftest.h" + ++#include ++#include ++ + #if !defined(NV_VM_FAULT_T_IS_PRESENT) + typedef int vm_fault_t; + #endif +@@ -143,7 +146,11 @@ typedef int vm_fault_t; + if (force) + flags |= FOLL_FORCE; + +- #if defined(NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG) ++ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) ++ return get_user_pages_remote(mm, start, nr_pages, flags, ++ pages, vmas, NULL); ++ ++ #elif defined(NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG) + + return get_user_pages_remote(tsk, mm, start, nr_pages, flags, + pages, vmas, NULL); +diff -urpN a/conftest.sh b/conftest.sh +--- a/conftest.sh 2021-01-07 11:40:57.406665892 +0000 ++++ b/conftest.sh 2021-01-07 11:55:01.742263745 +0000 +@@ -2045,7 +2045,12 @@ compile_test() { + # Determine if the phys_to_dma function is present. + # + CODE=" ++ #include ++ #include + #include ++ #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) ++ #include ++ #endif + void conftest_phys_to_dma(void) { + phys_to_dma(); + }" +@@ -2058,7 +2063,12 @@ compile_test() { + # Determine if the 'dma_ops' structure is present. + # + CODE=" ++ #include ++ #include + #include ++ #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) ++ #include ++ #endif + void conftest_dma_ops(void) { + (void)dma_ops; + }" +@@ -2072,7 +2082,12 @@ compile_test() { + # It does not exist on all architectures. + # + CODE=" ++ #include ++ #include + #include ++ #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) ++ #include ++ #endif + void conftest_dma_ops(void) { + (void)swiotlb_dma_ops; + }" +@@ -2085,7 +2100,12 @@ compile_test() { + # Determine if the 'struct dma_map_ops' type is present. + # + CODE=" ++ #include ++ #include + #include ++ #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) ++ #include ++ #endif + void conftest_dma_map_ops(void) { + struct dma_map_ops ops; + }" +@@ -2098,7 +2118,12 @@ compile_test() { + # Determine if the get_dma_ops() function is present. + # + CODE=" ++ #include ++ #include + #include ++ #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) ++ #include ++ #endif + void conftest_get_dma_ops(void) { + get_dma_ops(); + }" +@@ -2111,7 +2136,12 @@ compile_test() { + # Determine if the 'noncoherent_swiotlb_dma_ops' symbol is present. + # + CODE=" ++ #include ++ #include + #include ++ #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) ++ #include ++ #endif + void conftest_noncoherent_swiotlb_dma_ops(void) { + (void)noncoherent_swiotlb_dma_ops; + }" +@@ -2127,7 +2157,12 @@ compile_test() { + # 2016-08-10 6f3d87968f9c8b529bc81eff5a1f45e92553493d + # + CODE=" ++ #include ++ #include + #include ++ #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) ++ #include ++ #endif + void conftest_dma_map_resource(void) { + dma_map_resource(); + }" +@@ -3878,7 +3913,12 @@ compile_test() { + # means that dma_direct can perform DMA mappings itself. + # + CODE=" ++ #include ++ #include + #include ++ #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) ++ #include ++ #endif + void conftest_dma_is_direct(void) { + dma_is_direct(); + }" +diff -urpN a/nvidia/nv.c b/nvidia/nv.c +--- a/nvidia/nv.c 2020-05-14 12:29:21.000000000 +0000 ++++ b/nvidia/nv.c 2021-01-07 11:55:01.742263745 +0000 +@@ -36,6 +36,9 @@ + #include "nv-retpoline.h" + #endif + ++#include ++#include ++ + /* + * The module information macros for Linux single-module builds + * are present in nv-frontend.c. +@@ -3871,7 +3874,8 @@ nvidia_probe + pci_set_master(dev); + + #if defined(CONFIG_VGA_ARB) && !defined(NVCPU_PPC64LE) +-#if defined(VGA_DEFAULT_DEVICE) ++#if defined(VGA_DEFAULT_DEVICE) && \ ++ (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) + vga_tryget(VGA_DEFAULT_DEVICE, VGA_RSRC_LEGACY_MASK); + #endif + vga_set_legacy_decoding(dev, VGA_RSRC_NONE); +diff -urpN a/nvidia-drm/nvidia-drm-drv.c b/nvidia-drm/nvidia-drm-drv.c +--- a/nvidia-drm/nvidia-drm-drv.c 2020-05-14 12:29:25.000000000 +0000 ++++ b/nvidia-drm/nvidia-drm-drv.c 2021-01-07 11:59:39.197334560 +0000 +@@ -35,6 +35,13 @@ + #include "nvidia-drm-gem-nvkms-memory.h" + #include "nvidia-drm-gem-user-memory.h" + ++#include ++#include ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) ++#define NV_DRM_DRIVER_HAS_GEM_FREE_OBJECT ++#endif ++ + #if defined(NV_DRM_AVAILABLE) + + #include "nvidia-drm-ioctl.h" +@@ -466,8 +473,8 @@ static void nv_drm_unload(struct drm_dev + + #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) + +-static int nv_drm_master_set(struct drm_device *dev, +- struct drm_file *file_priv, bool from_open) ++static int __nv_drm_master_set(struct drm_device *dev, ++ struct drm_file *file_priv, bool from_open) + { + struct nv_drm_device *nv_dev = to_nv_device(dev); + +@@ -478,6 +485,21 @@ static int nv_drm_master_set(struct drm_ + return 0; + } + ++#if defined(NV_DRM_DRIVER_SET_MASTER_HAS_INT_RETURN_TYPE) ++static int nv_drm_master_set(struct drm_device *dev, ++ struct drm_file *file_priv, bool from_open) ++{ ++ return __nv_drm_master_set(dev, file_priv, from_open); ++} ++#else ++static void nv_drm_master_set(struct drm_device *dev, ++ struct drm_file *file_priv, bool from_open) ++{ ++ WARN_ON(__nv_drm_master_set(dev, file_priv, from_open) != 0); ++} ++#endif ++ ++ + #if defined(NV_DRM_MASTER_DROP_HAS_FROM_RELEASE_ARG) + static + void nv_drm_master_drop(struct drm_device *dev, +@@ -677,7 +699,9 @@ static struct drm_driver nv_drm_driver = + #endif + DRIVER_GEM | DRIVER_RENDER, + ++#if defined(NV_DRM_DRIVER_HAS_GEM_FREE_OBJECT) + .gem_free_object = nv_drm_gem_free, ++#endif + + .ioctls = nv_drm_ioctls, + .num_ioctls = ARRAY_SIZE(nv_drm_ioctls), +diff -urpN a/nvidia-drm/nvidia-drm-gem-user-memory.c b/nvidia-drm/nvidia-drm-gem-user-memory.c +--- a/nvidia-drm/nvidia-drm-gem-user-memory.c 2020-05-14 12:29:25.000000000 +0000 ++++ b/nvidia-drm/nvidia-drm-gem-user-memory.c 2021-01-07 11:55:01.746263668 +0000 +@@ -31,6 +31,9 @@ + #include "nvidia-drm-gem-user-memory.h" + #include "nvidia-drm-ioctl.h" + ++#include ++#include ++ + static inline + void __nv_drm_gem_user_memory_free(struct nv_drm_gem_object *nv_gem) + { +@@ -47,8 +50,13 @@ static struct sg_table *__nv_drm_gem_use + { + struct nv_drm_gem_user_memory *nv_user_memory = to_nv_user_memory(nv_gem); + ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) + return drm_prime_pages_to_sg(nv_user_memory->pages, + nv_user_memory->pages_count); ++#else ++ return drm_prime_pages_to_sg(nv_gem->nv_dev->dev, nv_user_memory->pages, ++ nv_user_memory->pages_count); ++#endif + } + + static void *__nv_drm_gem_user_memory_prime_vmap( +diff -urpN a/nvidia-drm/nvidia-drm-gem.h b/nvidia-drm/nvidia-drm-gem.h +--- a/nvidia-drm/nvidia-drm-gem.h 2020-05-14 12:29:24.000000000 +0000 ++++ b/nvidia-drm/nvidia-drm-gem.h 2021-01-07 11:55:01.750263592 +0000 +@@ -44,6 +44,9 @@ + #include "nvidia-dma-resv-helper.h" + #endif + ++#include ++#include ++ + struct nv_drm_gem_object; + + struct nv_drm_gem_object_funcs { +@@ -87,8 +90,12 @@ static inline void + nv_drm_gem_object_unreference_unlocked(struct nv_drm_gem_object *nv_gem) + { + #if defined(NV_DRM_GEM_OBJECT_GET_PRESENT) ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) + drm_gem_object_put_unlocked(&nv_gem->base); + #else ++ drm_gem_object_put(&nv_gem->base); ++#endif ++#else + drm_gem_object_unreference_unlocked(&nv_gem->base); + #endif + } +diff -urpN a/nvidia-uvm/uvm8_va_range.h b/nvidia-uvm/uvm8_va_range.h +--- a/nvidia-uvm/uvm8_va_range.h 2020-05-14 12:29:23.000000000 +0000 ++++ b/nvidia-uvm/uvm8_va_range.h 2021-01-07 11:55:01.750263592 +0000 +@@ -42,6 +42,13 @@ + #include "uvm8_tracker.h" + #include "uvm_ioctl.h" + ++#include ++#include ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) ++#define smp_read_barrier_depends smp_rmb ++#endif ++ + // VA Ranges are the UVM driver equivalent of Linux kernel vmas. They represent + // user allocations of any page-aligned size. We maintain these as a separate + // data structure from the vma tree for several reasons: diff -Nru nvidia-graphics-drivers-390-390.138/debian/dkms_nvidia.conf nvidia-graphics-drivers-390-390.138/debian/dkms_nvidia.conf --- nvidia-graphics-drivers-390-390.138/debian/dkms_nvidia.conf 2020-07-13 16:03:46.000000000 +0000 +++ nvidia-graphics-drivers-390-390.138/debian/dkms_nvidia.conf 2020-12-14 17:18:10.000000000 +0000 @@ -1,6 +1,18 @@ PACKAGE_NAME="nvidia" PACKAGE_VERSION="390.138" CLEAN="make clean" +UNAME=${kernelver%%-*} +UNAME_MAJ=${UNAME%%.*} +UNAME_MIN=${UNAME#*.} +UNAME_MIN=${UNAME_MIN%%.*} +TARGET_MAJ=5 +TARGET_MIN=10 +# Disable UVM on from Linux 5.10 on +if [ "$UNAME_MAJ" -gt "$TARGET_MAJ" ] || [ "$UNAME_MAJ" -eq "$TARGET_MAJ" ] && [ "$UNAME_MIN" -ge "$TARGET_MIN" ]; then + EXCLUDED="nvidia-uvm" +else + EXCLUDED="" +fi BUILT_MODULE_NAME[0]="nvidia" DEST_MODULE_LOCATION[0]="/kernel/drivers/char/drm" PROCS_NUM=`nproc` @@ -14,5 +26,6 @@ AUTOINSTALL="yes" PATCH[0]="disable_fstack-clash-protection_fcf-protection.patch" PATCH[1]="buildfix_kernel_5.8.patch" +PATCH[2]="buildfix_kernel_5.10.patch" #PATCH[1]="do-not-call-pci_save_state.patch" #PATCH_MATCH[0]="^4.[6-7]" diff -Nru nvidia-graphics-drivers-390-390.138/debian/templates/dkms.conf.fragment.in nvidia-graphics-drivers-390-390.138/debian/templates/dkms.conf.fragment.in --- nvidia-graphics-drivers-390-390.138/debian/templates/dkms.conf.fragment.in 2020-06-25 06:53:35.000000000 +0000 +++ nvidia-graphics-drivers-390-390.138/debian/templates/dkms.conf.fragment.in 2020-12-14 17:18:10.000000000 +0000 @@ -1,3 +1,5 @@ -BUILT_MODULE_NAME[3]="nvidia-uvm" -DEST_MODULE_LOCATION[3]="/kernel/drivers/char/drm" +if [ -z "$EXCLUDED" ]; then + BUILT_MODULE_NAME[3]="nvidia-uvm" + DEST_MODULE_LOCATION[3]="/kernel/drivers/char/drm" +fi #PATCH[2]="buildfix_kernel_4.9_amd64_only.patch" diff -Nru nvidia-graphics-drivers-390-390.138/debian/templates/dkms_nvidia.conf.in nvidia-graphics-drivers-390-390.138/debian/templates/dkms_nvidia.conf.in --- nvidia-graphics-drivers-390-390.138/debian/templates/dkms_nvidia.conf.in 2020-07-13 16:03:07.000000000 +0000 +++ nvidia-graphics-drivers-390-390.138/debian/templates/dkms_nvidia.conf.in 2020-12-14 17:18:10.000000000 +0000 @@ -1,6 +1,18 @@ PACKAGE_NAME="nvidia" PACKAGE_VERSION="#VERSION#" CLEAN="make clean" +UNAME=${kernelver%%-*} +UNAME_MAJ=${UNAME%%.*} +UNAME_MIN=${UNAME#*.} +UNAME_MIN=${UNAME_MIN%%.*} +TARGET_MAJ=5 +TARGET_MIN=10 +# Disable UVM on from Linux 5.10 on +if [ "$UNAME_MAJ" -gt "$TARGET_MAJ" ] || [ "$UNAME_MAJ" -eq "$TARGET_MAJ" ] && [ "$UNAME_MIN" -ge "$TARGET_MIN" ]; then + EXCLUDED="nvidia-uvm" +else + EXCLUDED="" +fi BUILT_MODULE_NAME[0]="nvidia" DEST_MODULE_LOCATION[0]="/kernel/drivers/char/drm" PROCS_NUM=`nproc` @@ -14,5 +26,6 @@ AUTOINSTALL="yes" PATCH[0]="disable_fstack-clash-protection_fcf-protection.patch" PATCH[1]="buildfix_kernel_5.8.patch" +PATCH[2]="buildfix_kernel_5.10.patch" #PATCH[1]="do-not-call-pci_save_state.patch" #PATCH_MATCH[0]="^4.[6-7]"