summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO18
-rw-r--r--PKGBUILD28
-rw-r--r--kernel-4.11.patch43
-rw-r--r--kernel-5.0.patch278
-rw-r--r--kernel-5.1.patch43
-rw-r--r--kernel-5.2.patch77
-rw-r--r--kernel-5.3.patch17
-rw-r--r--kernel-5.4.patch111
8 files changed, 495 insertions, 120 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 521cfa27b541..990fb5a74150 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,25 +1,27 @@
pkgbase = nvidia-340xx
pkgdesc = NVIDIA drivers for linux, 340xx legacy branch
pkgver = 340.107
- pkgrel = 93
+ pkgrel = 94
url = https://www.nvidia.com/
arch = x86_64
license = custom
makedepends = nvidia-340xx-utils=340.107
- makedepends = linux>=5.3.6
- makedepends = linux-headers>=5.3.6
+ makedepends = linux>=5.4
+ makedepends = linux-headers>=5.4
conflicts = nvidia
options = !strip
source = https://us.download.nvidia.com/XFree86/Linux-x86_64/340.107/NVIDIA-Linux-x86_64-340.107-no-compat32.run
source = kernel-4.11.patch
source = kernel-5.0.patch
- source = kernel-5.1.patch
+ source = kernel-5.2.patch
source = kernel-5.3.patch
+ source = kernel-5.4.patch
sha256sums = 6dc6f183c69c414670d8adef0286a2362eedd6e16ec6dfae811e48ea4a4505dc
- sha256sums = 5ba7e6d5e502882c3534d1d8578f7fd29fdf3d2aeb49206efa7b3514a7e3e821
- sha256sums = 236a1d1dc9adc1cafec828f0650d5a15f1f6d0fa27905dab58ca072a46f159fa
- sha256sums = 2b0e69814bfaee6b227bbf15d89d056ab27d84bd325248614e27cb5fa33a63a1
- sha256sums = 4b1146a46b21c67cc70ade6aadd7292f1d1d838875e8be9f92dc656768db636c
+ sha256sums = 8bbb99a5be38520793b9898f7a82116595260bfe667708957fb0bdabaa570dfb
+ sha256sums = b1e539b507dfbffda831de2c7145b62f9fc28e9df2c39cb7c22754e74057886e
+ sha256sums = f5f28225a621484286b2830c777db82065ff299536e6c2c851e68c326d2d0b73
+ sha256sums = 5ebfdad300029d41c5bc2b8cca4d661abf8f0aa1de8c0f9e7e03de1580e6395e
+ sha256sums = 6bb80349d980b48a7fc62cec4d6f36b408b51263d461b4b9935fac729dd701b6
pkgname = nvidia-340xx
pkgdesc = NVIDIA drivers for linux, 340xx legacy branch
diff --git a/PKGBUILD b/PKGBUILD
index b5072c1d54ff..c6da09536c32 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -6,22 +6,25 @@
pkgbase=nvidia-340xx
pkgname=(nvidia-340xx nvidia-340xx-dkms)
pkgver=340.107
-pkgrel=93
+pkgrel=94
pkgdesc="NVIDIA drivers for linux, 340xx legacy branch"
arch=('x86_64')
url="https://www.nvidia.com/"
-makedepends=("nvidia-340xx-utils=${pkgver}" 'linux>=5.3.6' 'linux-headers>=5.3.6')
+makedepends=("nvidia-340xx-utils=${pkgver}" 'linux>=5.4' 'linux-headers>=5.4')
conflicts=('nvidia')
license=('custom')
options=(!strip)
+# seems manjaro is keeping this current
+# https://gitlab.manjaro.org/packages?utf8=%E2%9C%93&filter=nvidia-340xx
source=("https://us.download.nvidia.com/XFree86/Linux-x86_64/${pkgver}/NVIDIA-Linux-x86_64-${pkgver}-no-compat32.run"
- 'kernel-4.11.patch' 'kernel-5.0.patch' 'kernel-5.1.patch' 'kernel-5.3.patch'
+ 'kernel-4.11.patch' 'kernel-5.0.patch' 'kernel-5.2.patch' 'kernel-5.3.patch' 'kernel-5.4.patch'
)
sha256sums=('6dc6f183c69c414670d8adef0286a2362eedd6e16ec6dfae811e48ea4a4505dc'
- '5ba7e6d5e502882c3534d1d8578f7fd29fdf3d2aeb49206efa7b3514a7e3e821'
- '236a1d1dc9adc1cafec828f0650d5a15f1f6d0fa27905dab58ca072a46f159fa'
- '2b0e69814bfaee6b227bbf15d89d056ab27d84bd325248614e27cb5fa33a63a1'
- '4b1146a46b21c67cc70ade6aadd7292f1d1d838875e8be9f92dc656768db636c')
+ '8bbb99a5be38520793b9898f7a82116595260bfe667708957fb0bdabaa570dfb'
+ 'b1e539b507dfbffda831de2c7145b62f9fc28e9df2c39cb7c22754e74057886e'
+ 'f5f28225a621484286b2830c777db82065ff299536e6c2c851e68c326d2d0b73'
+ '5ebfdad300029d41c5bc2b8cca4d661abf8f0aa1de8c0f9e7e03de1580e6395e'
+ '6bb80349d980b48a7fc62cec4d6f36b408b51263d461b4b9935fac729dd701b6')
_pkg="NVIDIA-Linux-x86_64-${pkgver}-no-compat32"
# default is 'linux' substitute custom name here
@@ -34,10 +37,13 @@ prepare() {
cd "${_pkg}"
# patches here
- patch -Np0 < "${srcdir}/kernel-4.11.patch"
- patch -Np0 < "${srcdir}/kernel-5.0.patch"
- patch -Np0 < "${srcdir}/kernel-5.1.patch"
- patch -Np0 < "${srcdir}/kernel-5.3.patch"
+ local src
+ for src in "${source[@]}"; do
+ src="${src%%::*}"
+ src="${src##*/}"
+ [[ $src = *.patch ]] || continue
+ (cd kernel ; patch -p1 --no-backup-if-mismatch -i "../../$src")
+ done
cp -a kernel kernel-dkms
}
diff --git a/kernel-4.11.patch b/kernel-4.11.patch
index b2b3a7a9d958..c832ff48d211 100644
--- a/kernel-4.11.patch
+++ b/kernel-4.11.patch
@@ -1,30 +1,34 @@
---- kernel/uvm/nvidia_uvm_lite.c 2017-09-27 13:50:46.334075042 +0200
-+++ kernel/uvm/nvidia_uvm_lite.c 2017-09-27 13:56:06.358041280 +0200
-@@ -818,7 +818,11 @@
+From 53d65b3781b7b2cf25368efd5382ed5bbda19bd9 Mon Sep 17 00:00:00 2001
+From: Alberto Milone <alberto.milone@canonical.com>
+Date: Thu, 21 Sep 2017 15:16:41 +0200
+Subject: [PATCH 1/1] Add support for Linux 4.11
+This only contains the last few bits that didn't make it into
+the 340 driver.
+Credit goes to Michael Marley for spotting the problem.
+---
+ uvm/nvidia_uvm_lite.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+diff --git a/uvm/nvidia_uvm_lite.c b/uvm/nvidia_uvm_lite.c
+index 246ed04..119c93a 100644
+--- a/uvm/nvidia_uvm_lite.c
++++ b/uvm/nvidia_uvm_lite.c
+@@ -818,8 +818,15 @@ done:
}
#if defined(NV_VM_OPERATIONS_STRUCT_HAS_FAULT)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
int _fault(struct vm_area_struct *vma, struct vm_fault *vmf)
-+#else
-+int _fault(struct vm_fault *vmf)
++#else
++int _fault(struct vm_fault *vmf)
+#endif
{
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
++ struct vm_area_struct *vma = vmf->vma;
++#endif
#if defined(NV_VM_FAULT_HAS_ADDRESS)
unsigned long vaddr = vmf->address;
-@@ -828,7 +832,11 @@
- struct page *page = NULL;
- int retval;
-
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
- retval = _fault_common(vma, vaddr, &page, vmf->flags);
-+#else
-+ retval = _fault_common(NULL, vaddr, &page, vmf->flags);
-+#endif
-
- vmf->page = page;
-
-@@ -866,7 +874,11 @@
+ #else
+@@ -866,7 +873,11 @@ static struct vm_operations_struct uvmlite_vma_ops =
// it's dealing with anonymous mapping (see handle_pte_fault).
//
#if defined(NV_VM_OPERATIONS_STRUCT_HAS_FAULT)
@@ -36,3 +40,6 @@
{
vmf->page = NULL;
return VM_FAULT_SIGBUS;
+--
+2.7.4
+
diff --git a/kernel-5.0.patch b/kernel-5.0.patch
index 4786b69b6265..9ae00f75c619 100644
--- a/kernel-5.0.patch
+++ b/kernel-5.0.patch
@@ -1,52 +1,256 @@
---- kernel/nv-drm.c 2018-05-25 04:16:20.000000000 +0000
-+++ kernel/nv-drm.c 2019-03-04 20:57:40.065280734 +0000
-@@ -252,7 +252,11 @@
- goto done;
- }
+From 0b4e74ba61c50aefa16a4bafac3a60799eab7a20 Mon Sep 17 00:00:00 2001
+From: Alberto Milone <alberto.milone@canonical.com>
+Date: Fri, 15 Feb 2019 14:43:21 +0100
+Subject: [PATCH 1/1] Add support for Linux 5.0
+
+---
+ Makefile | 2 ++
+ conftest.sh | 33 +++++++++++++++++++++++++++++++++
+ nv-drm.c | 12 +++++++++++-
+ nv-time.h | 24 ++++++++++++++++++++++++
+ os-interface.c | 13 +++++++------
+ uvm/Makefile | 1 +
+ uvm/nvidia_uvm_linux.h | 1 +
+ uvm/nvidia_uvm_lite.c | 4 ++--
+ 8 files changed, 81 insertions(+), 9 deletions(-)
+ create mode 100644 nv-time.h
+
+diff --git a/Makefile b/Makefile
+index 8ac3c1a..1959dce 100644
+--- a/Makefile
++++ b/Makefile
+@@ -147,6 +147,8 @@ COMPILE_TESTS = \
+ vm_fault_present \
+ vm_fault_has_address \
+ drm_driver_unload_has_int_return_type \
++ drm_gem_object_get \
++ do_gettimeofday \
+ drm_legacy_pci_init \
+ timer_setup
+ #
+diff --git a/conftest.sh b/conftest.sh
+index 64d75a1..fb0bf60 100755
+--- a/conftest.sh
++++ b/conftest.sh
+@@ -168,6 +168,7 @@ test_headers() {
+ FILES="$FILES linux/sched/task.h"
+ FILES="$FILES xen/ioemu.h"
+ FILES="$FILES linux/fence.h"
++ FILES="$FILES linux/ktime.h"
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0)
- drm_gem_object_unreference_unlocked(&nv_obj->base);
-+#else
-+ drm_gem_object_put_unlocked(&nv_obj->base);
-+#endif
+ FILES_ARCH="$FILES_ARCH asm/set_memory.h"
- status = RM_OK;
+@@ -1971,6 +1972,38 @@ compile_test() {
+ compile_check_conftest "$CODE" "NV_DRM_DRIVER_UNLOAD_HAS_INT_RETURN_TYPE" "" "types"
+ ;;
---- kernel/os-interface.c 2018-05-25 04:16:20.000000000 +0000
-+++ kernel/os-interface.c 2019-03-04 21:03:03.815854982 +0000
-@@ -14,6 +14,16 @@
- #include "os-interface.h"
- #include "nv-linux.h"
++ drm_gem_object_get)
++ #
++ # Determine if the function drm_gem_object_get() is present.
++ #
++ CODE="
++ #include <drm/drmP.h>
++ #if defined(NV_DRM_DRM_GEM_H_PRESENT)
++ #include <drm/drm_gem.h>
++ #endif
++ void conftest_drm_gem_object_get(void) {
++ drm_gem_object_get();
++ }"
++
++ compile_check_conftest "$CODE" "NV_DRM_GEM_OBJECT_GET_PRESENT" "" "functions"
++ ;;
++
++ do_gettimeofday)
++ #
++ # Determine if the function do_gettimeofday() is present.
++ #
++ CODE="
++ #include <linux/time.h>
++ #if defined(NV_LINUX_KTIME_H_PRESENT)
++ #include <linux/ktime.h>
++ #endif
++ void conftest_do_gettimeofday(void) {
++ do_gettimeofday();
++ }"
++
++ compile_check_conftest "$CODE" "NV_DO_GETTIMEOFDAY_PRESENT" "" "functions"
++ ;;
++
+ drm_legacy_pci_init)
+ #
+ # Determine if drm_legacy_pci_init() is present. drm_pci_init() was
+diff --git a/nv-drm.c b/nv-drm.c
+index 0eb72e4..1c968de 100644
+--- a/nv-drm.c
++++ b/nv-drm.c
+@@ -37,6 +37,16 @@ struct nv_gem_object {
+ struct page **pages;
+ };
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
-+static inline void do_gettimeofday(struct timeval *tv)
++static inline void
++nv_drm_gem_object_unreference_unlocked(struct nv_gem_object *nv_gem)
+{
-+ struct timespec64 now;
-+ ktime_get_real_ts64(&now);
-+ tv->tv_sec = now.tv_sec;
-+ tv->tv_usec = now.tv_nsec/1000;
++#if defined(NV_DRM_GEM_OBJECT_GET_PRESENT)
++ drm_gem_object_put_unlocked(&nv_gem->base);
++#else
++ drm_gem_object_unreference_unlocked(&nv_gem->base);
++#endif
+}
++
+ static int nv_drm_load(
+ struct drm_device *dev,
+ unsigned long flags
+@@ -252,7 +262,7 @@ RM_STATUS NV_API_CALL nv_alloc_os_descriptor_handle(
+ goto done;
+ }
+
+- drm_gem_object_unreference_unlocked(&nv_obj->base);
++ nv_drm_gem_object_unreference_unlocked(nv_obj);
+
+ status = RM_OK;
+
+diff --git a/nv-time.h b/nv-time.h
+new file mode 100644
+index 0000000..cc828aa
+--- /dev/null
++++ b/nv-time.h
+@@ -0,0 +1,24 @@
++#ifndef __NV_TIME_H__
++#define __NV_TIME_H__
++
++#include "conftest.h"
++#include <linux/time.h>
++
++#if defined(NV_LINUX_KTIME_H_PRESENT)
++#include <linux/ktime.h>
+#endif
+
- RM_STATUS NV_API_CALL os_disable_console_access(void)
- {
- NV_ACQUIRE_CONSOLE_SEM();
---- kernel/uvm/nvidia_uvm_lite.c 2019-03-04 20:57:25.815255511 +0000
-+++ kernel/uvm/nvidia_uvm_lite.c 2019-03-04 21:04:25.239333050 +0000
-@@ -30,6 +30,16 @@
- #include "nvidia_uvm_lite_counters.h"
- #include "ctrl2080mc.h"
-
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
-+static inline void do_gettimeofday(struct timeval *tv)
++static inline void nv_gettimeofday(struct timeval *tv)
+{
++#ifdef NV_DO_GETTIMEOFDAY_PRESENT
++ do_gettimeofday(tv);
++#else
+ struct timespec64 now;
++
+ ktime_get_real_ts64(&now);
+ tv->tv_sec = now.tv_sec;
+ tv->tv_usec = now.tv_nsec/1000;
-+}
+#endif
++}
+
- //
- // nvidia_uvm_lite.c
- // This file contains code that is specific to the UVM-Lite mode of operation.
++#endif
+diff --git a/os-interface.c b/os-interface.c
+index 7e3d362..7190b26 100644
+--- a/os-interface.c
++++ b/os-interface.c
+@@ -13,6 +13,7 @@
+
+ #include "os-interface.h"
+ #include "nv-linux.h"
++#include "nv-time.h"
+
+ RM_STATUS NV_API_CALL os_disable_console_access(void)
+ {
+@@ -440,7 +441,7 @@ RM_STATUS NV_API_CALL os_get_current_time(
+ {
+ struct timeval tm;
+
+- do_gettimeofday(&tm);
++ nv_gettimeofday(&tm);
+
+ *seconds = tm.tv_sec;
+ *useconds = tm.tv_usec;
+@@ -475,7 +476,7 @@ RM_STATUS NV_API_CALL os_delay_us(NvU32 MicroSeconds)
+ #ifdef NV_CHECK_DELAY_ACCURACY
+ struct timeval tm1, tm2;
+
+- do_gettimeofday(&tm1);
++ nv_gettimeofday(&tm1);
+ #endif
+
+ if (in_irq() && (MicroSeconds > NV_MAX_ISR_DELAY_US))
+@@ -490,7 +491,7 @@ RM_STATUS NV_API_CALL os_delay_us(NvU32 MicroSeconds)
+ udelay(usec);
+
+ #ifdef NV_CHECK_DELAY_ACCURACY
+- do_gettimeofday(&tm2);
++ nv_gettimeofday(&tm2);
+ nv_printf(NV_DBG_ERRORS, "NVRM: osDelayUs %d: 0x%x 0x%x\n",
+ MicroSeconds, tm2.tv_sec - tm1.tv_sec, tm2.tv_usec - tm1.tv_usec);
+ #endif
+@@ -518,7 +519,7 @@ RM_STATUS NV_API_CALL os_delay(NvU32 MilliSeconds)
+ struct timeval tm_start;
+ #endif
+
+- do_gettimeofday(&tm_aux);
++ nv_gettimeofday(&tm_aux);
+ #ifdef NV_CHECK_DELAY_ACCURACY
+ tm_start = tm_aux;
+ #endif
+@@ -552,7 +553,7 @@ RM_STATUS NV_API_CALL os_delay(NvU32 MilliSeconds)
+ do
+ {
+ schedule_timeout(jiffies);
+- do_gettimeofday(&tm_aux);
++ nv_gettimeofday(&tm_aux);
+ if (NV_TIMERCMP(&tm_aux, &tm_end, <))
+ {
+ NV_TIMERSUB(&tm_end, &tm_aux, &tm_aux);
+@@ -574,7 +575,7 @@ RM_STATUS NV_API_CALL os_delay(NvU32 MilliSeconds)
+ udelay(MicroSeconds);
+ }
+ #ifdef NV_CHECK_DELAY_ACCURACY
+- do_gettimeofday(&tm_aux);
++ nv_gettimeofday(&tm_aux);
+ timersub(&tm_aux, &tm_start, &tm_aux);
+ nv_printf(NV_DBG_ERRORS, "NVRM: osDelay %dmsec: %d.%06dsec\n",
+ MilliSeconds, tm_aux.tv_sec, tm_aux.tv_usec);
+diff --git a/uvm/Makefile b/uvm/Makefile
+index 42ad927..5c7b466 100644
+--- a/uvm/Makefile
++++ b/uvm/Makefile
+@@ -171,6 +171,7 @@ COMPILE_TESTS = \
+ kbasename \
+ fatal_signal_pending \
+ kuid_t \
++ do_gettimeofday \
+ vm_fault_has_address
+
+ MODULE_NAME:= nvidia-uvm
+diff --git a/uvm/nvidia_uvm_linux.h b/uvm/nvidia_uvm_linux.h
+index 1625209..1edb620 100644
+--- a/uvm/nvidia_uvm_linux.h
++++ b/uvm/nvidia_uvm_linux.h
+@@ -146,6 +146,7 @@
+ #include <linux/interrupt.h> /* tasklets, interrupt helpers */
+ #include <linux/timer.h>
+ #include <linux/time.h> /* do_gettimeofday()*/
++#include "nv-time.h"
+
+ #include <asm/div64.h> /* do_div() */
+ #if defined(NV_ASM_SYSTEM_H_PRESENT)
+diff --git a/uvm/nvidia_uvm_lite.c b/uvm/nvidia_uvm_lite.c
+index 119c93a..33b8d4b 100644
+--- a/uvm/nvidia_uvm_lite.c
++++ b/uvm/nvidia_uvm_lite.c
+@@ -2019,7 +2019,7 @@ static RM_STATUS _check_ecc_errors(UvmGpuMigrationTracking *pMigTracker,
+ {
+ if (!!(rmInterruptSet) && !bEccIncomingError)
+ {
+- do_gettimeofday(&eccErrorStartTime);
++ nv_gettimeofday(&eccErrorStartTime);
+ _set_timeout_in_usec(&eccErrorStartTime, &eccTimeout,
+ UVM_ECC_ERR_TIMEOUT_USEC);
+
+@@ -2051,7 +2051,7 @@ static RM_STATUS _check_ecc_errors(UvmGpuMigrationTracking *pMigTracker,
+ //
+ if (!!(rmInterruptSet) && (eccErrorStartTime.tv_usec != 0))
+ {
+- do_gettimeofday(&eccErrorCurrentTime);
++ nv_gettimeofday(&eccErrorCurrentTime);
+ if ((eccErrorCurrentTime.tv_sec > eccTimeout.tv_sec) ||
+ ((eccErrorCurrentTime.tv_sec == eccTimeout.tv_sec) &&
+ (eccErrorCurrentTime.tv_usec >= eccTimeout.tv_usec)))
+--
+2.19.1
+
diff --git a/kernel-5.1.patch b/kernel-5.1.patch
deleted file mode 100644
index 19e27a86f13a..000000000000
--- a/kernel-5.1.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-diff --git kernel/uvm/nvidia_uvm_lite.c kernel/uvm/nvidia_uvm_lite.c
-index 65b9a4d..f5ea5d7 100644
---- kernel/uvm/nvidia_uvm_lite.c
-+++ kernel/uvm/nvidia_uvm_lite.c
-@@ -830,8 +830,10 @@ done:
- #if defined(NV_VM_OPERATIONS_STRUCT_HAS_FAULT)
- #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
- int _fault(struct vm_area_struct *vma, struct vm_fault *vmf)
--#else
--int _fault(struct vm_fault *vmf)
-+#elif LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0)
-+int _fault(struct vm_fault *vmf)
-+#else
-+vm_fault_t _fault(struct vm_fault *vmf)
- #endif
- {
- #if defined(NV_VM_FAULT_HAS_ADDRESS)
-@@ -886,8 +888,10 @@ static struct vm_operations_struct uvmlite_vma_ops =
- #if defined(NV_VM_OPERATIONS_STRUCT_HAS_FAULT)
- #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
- int _sigbus_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
--#else
-+#elif LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0)
- int _sigbus_fault(struct vm_fault *vmf)
-+#else
-+vm_fault_t _sigbus_fault(struct vm_fault *vmf)
- #endif
- {
- vmf->page = NULL;
-diff --git kernel/nv-drm.c kernel/nv-drm.c
-index 122ba7d..1be5733 100644
---- kernel/nv-drm.c
-+++ kernel/nv-drm.c
-@@ -146,7 +146,7 @@ static const struct file_operations nv_drm_fops = {
- };
-
- static struct drm_driver nv_drm_driver = {
--#if defined(DRIVER_LEGACY)
-+#if defined(DRIVER_LEGACY) || LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
- .driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_LEGACY,
- #else
- .driver_features = DRIVER_GEM | DRIVER_PRIME,
-
diff --git a/kernel-5.2.patch b/kernel-5.2.patch
new file mode 100644
index 000000000000..923e50819460
--- /dev/null
+++ b/kernel-5.2.patch
@@ -0,0 +1,77 @@
+From d48c28c8f690cd1b7f1a252f3a33c9b536096054 Mon Sep 17 00:00:00 2001
+From: Alberto Milone <alberto.milone@canonical.com>
+Date: Mon, 10 Jun 2019 13:08:10 +0200
+Subject: [PATCH 1/1] Add support for Linux 5.2
+V2: make sure to force DRIVER_LEGACY for Linux >= 5.1
+---
+ nv-drm.c | 2 +-
+ uvm/nvidia_uvm_lite.c | 20 ++++++++++++++++++++
+ 2 files changed, 21 insertions(+), 1 deletion(-)
+diff --git a/nv-drm.c b/nv-drm.c
+index 1c968de..76719bb 100644
+--- a/nv-drm.c
++++ b/nv-drm.c
+@@ -156,7 +156,7 @@ static const struct file_operations nv_drm_fops = {
+ };
+
+ static struct drm_driver nv_drm_driver = {
+-#if defined(DRIVER_LEGACY)
++#if defined(DRIVER_LEGACY) || LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
+ .driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_LEGACY,
+ #else
+ .driver_features = DRIVER_GEM | DRIVER_PRIME,
+diff --git a/uvm/nvidia_uvm_lite.c b/uvm/nvidia_uvm_lite.c
+index 33b8d4b..8dbe050 100644
+--- a/uvm/nvidia_uvm_lite.c
++++ b/uvm/nvidia_uvm_lite.c
+@@ -689,7 +689,11 @@ static UvmGpuMigrationTracking * _get_mig_tracker(UvmCommitRecord * pRecord)
+ // return SIGBUS.
+ // 3. Otherwise, map in a page from the cache, and allow access.
+ //
++#ifdef VM_FAULT_OOM
+ int _fault_common(struct vm_area_struct *vma, unsigned long vaddr,
++#else
++unsigned int _fault_common(struct vm_area_struct *vma, unsigned long vaddr,
++#endif
+ struct page **ppage, unsigned vmfFlags)
+ {
+ int retValue = VM_FAULT_SIGBUS;
+@@ -819,9 +823,17 @@ done:
+
+ #if defined(NV_VM_OPERATIONS_STRUCT_HAS_FAULT)
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
++#ifdef VM_FAULT_OOM
+ int _fault(struct vm_area_struct *vma, struct vm_fault *vmf)
+ #else
++unsigned int _fault(struct vm_area_struct *vma, struct vm_fault *vmf)
++#endif
++#else
++#ifdef VM_FAULT_OOM
+ int _fault(struct vm_fault *vmf)
++#else
++unsigned int _fault(struct vm_fault *vmf)
++#endif
+ #endif
+ {
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+@@ -874,9 +886,17 @@ static struct vm_operations_struct uvmlite_vma_ops =
+ //
+ #if defined(NV_VM_OPERATIONS_STRUCT_HAS_FAULT)
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
++#ifdef VM_FAULT_OOM
+ int _sigbus_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
+ #else
++unsigned int _sigbus_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
++#endif
++#else
++#ifdef VM_FAULT_OOM
+ int _sigbus_fault(struct vm_fault *vmf)
++#else
++unsigned int _sigbus_fault(struct vm_fault *vmf)
++#endif
+ #endif
+ {
+ vmf->page = NULL;
+--
+2.20.1
+
diff --git a/kernel-5.3.patch b/kernel-5.3.patch
index c51a41d5d8f9..a1cecd687cb6 100644
--- a/kernel-5.3.patch
+++ b/kernel-5.3.patch
@@ -1,7 +1,16 @@
-diff --git kernel/nv-linux.h kernel/nv-linux.h
+From df6b6227e19b46cf23abca790570804872cbf87c Mon Sep 17 00:00:00 2001
+From: Alberto Milone <alberto.milone@canonical.com>
+Date: Tue, 13 Aug 2019 11:20:39 +0200
+Subject: [PATCH 1/1] Add support for Linux 5.3
+smp_call_function() and on_each_cpu() no longer have return values
+as per commit caa759323c73676b3e48c8d9c86093c88b4aba97
+---
+ nv-linux.h | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+diff --git a/nv-linux.h b/nv-linux.h
index 4043bf1..62f0874 100644
---- kernel/nv-linux.h
-+++ kernel/nv-linux.h
+--- a/nv-linux.h
++++ b/nv-linux.h
@@ -877,12 +877,21 @@ extern void *nv_stack_t_cache;
__ret; \
})
@@ -46,4 +55,6 @@ index 4043bf1..62f0874 100644
#error "NV_ON_EACH_CPU_ARGUMENT_COUNT value unrecognized!"
#endif
#elif defined(CONFIG_SMP)
+--
+2.20.1
diff --git a/kernel-5.4.patch b/kernel-5.4.patch
new file mode 100644
index 000000000000..be73f9a6dcd3
--- /dev/null
+++ b/kernel-5.4.patch
@@ -0,0 +1,111 @@
+From f90c388c755a6bd9b72cb51c712a0ae686e0b377 Mon Sep 17 00:00:00 2001
+From: Alberto Milone <alberto.milone@canonical.com>
+Date: Wed, 27 Nov 2019 13:01:18 +0100
+Subject: [PATCH 1/1] Add support for Linux 5.4
+---
+ conftest.sh | 46 ++++++++++++++++++++++++++++++++++++++++
+ nv-drm.c | 9 +++++---
+ nvidia-modules-common.mk | 2 +-
+ 3 files changed, 53 insertions(+), 4 deletions(-)
+diff --git a/conftest.sh b/conftest.sh
+index fb0bf60..babbb50 100755
+--- a/conftest.sh
++++ b/conftest.sh
+@@ -265,6 +265,23 @@ build_cflags() {
+ if [ -n "$BUILD_PARAMS" ]; then
+ CFLAGS="$CFLAGS -D$BUILD_PARAMS"
+ fi
++
++ # Check if gcc supports asm goto and set CC_HAVE_ASM_GOTO if it does.
++ # Older kernels perform this check and set this flag in Kbuild, and since
++ # conftest.sh runs outside of Kbuild it ends up building without this flag.
++ # Starting with commit e9666d10a5677a494260d60d1fa0b73cc7646eb3 this test
++ # is done within Kconfig, and the preprocessor flag is no longer needed.
++
++ GCC_GOTO_SH="$SOURCES/build/gcc-goto.sh"
++
++ if [ -f "$GCC_GOTO_SH" ]; then
++ # Newer versions of gcc-goto.sh don't print anything on success, but
++ # this is okay, since it's no longer necessary to set CC_HAVE_ASM_GOTO
++ # based on the output of those versions of gcc-goto.sh.
++ if [ `/bin/sh "$GCC_GOTO_SH" "$CC"` = "y" ]; then
++ CFLAGS="$CFLAGS -DCC_HAVE_ASM_GOTO"
++ fi
++ fi
+ }
+
+ CONFTEST_PREAMBLE="#include \"conftest.h\"
+@@ -1521,6 +1538,35 @@ compile_test() {
+ compile_check_conftest "$CODE" "NV_DRM_AVAILABLE" "" "generic"
+ ;;
+
++ drm_driver_prime_flag_present)
++ #
++ # Determine whether driver feature flag DRIVER_PRIME is present.
++ #
++ # The DRIVER_PRIME flag was added by commit 3248877ea179 (drm:
++ # base prime/dma-buf support (v5)) in v3.4 (2011-11-25) and is
++ # removed by commit 0424fdaf883a (drm/prime: Actually remove
++ # DRIVER_PRIME everywhere) on 2019-06-17.
++ #
++ # DRIVER_PRIME definition moved from drmP.h to drm_drv.h by
++ # commit 85e634bce01a (drm: Extract drm_drv.h) in v4.10
++ # (2016-11-14).
++ #
++ # DRIVER_PRIME define is changed to enum value by commit
++ # 0e2a933b02c9 (drm: Switch DRIVER_ flags to an enum) in v5.1
++ # (2019-01-29).
++ #
++ CODE="
++ #include <drm/drmP.h>
++ #if defined(NV_DRM_DRM_DRV_H_PRESENT)
++ #include <drm/drm_drv.h>
++ #endif
++ unsigned int drm_driver_prime_flag_present_conftest(void) {
++ return DRIVER_PRIME;
++ }"
++
++ compile_check_conftest "$CODE" "NV_DRM_DRIVER_PRIME_FLAG_PRESENT" "" "types"
++ ;;
++
+ proc_create_data)
+ #
+ # Determine if the proc_create_data() function is present.
+diff --git a/nv-drm.c b/nv-drm.c
+index 76719bb..12f7029 100644
+--- a/nv-drm.c
++++ b/nv-drm.c
+@@ -156,11 +156,14 @@ static const struct file_operations nv_drm_fops = {
+ };
+
+ static struct drm_driver nv_drm_driver = {
++ .driver_features =
++#if defined(NV_DRM_DRIVER_PRIME_FLAG_PRESENT)
++ DRIVER_PRIME |
++#endif
+ #if defined(DRIVER_LEGACY) || LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
+- .driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_LEGACY,
+-#else
+- .driver_features = DRIVER_GEM | DRIVER_PRIME,
++ DRIVER_LEGACY |
+ #endif
++ DRIVER_GEM,
+ .load = nv_drm_load,
+ .unload = nv_drm_unload,
+ .fops = &nv_drm_fops,
+diff --git a/nvidia-modules-common.mk b/nvidia-modules-common.mk
+index 8ac7058..7418005 100644
+--- a/nvidia-modules-common.mk
++++ b/nvidia-modules-common.mk
+@@ -180,7 +180,7 @@ ifndef NV_VERBOSE
+ endif
+
+ KBUILD_PARAMS += KBUILD_VERBOSE=$(NV_VERBOSE)
+-KBUILD_PARAMS += -C $(KERNEL_SOURCES) SUBDIRS=$(PWD)
++KBUILD_PARAMS += -C $(KERNEL_SOURCES) M=$(PWD)
+ KBUILD_PARAMS += ARCH=$(ARCH)
+
+ #
+--
+2.20.1
+