mirror of
https://github.com/archlinux-jerry/nvidia-340xx
synced 2024-11-16 12:50:40 +08:00
256 lines
7.5 KiB
Diff
256 lines
7.5 KiB
Diff
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"
|
|
|
|
FILES_ARCH="$FILES_ARCH asm/set_memory.h"
|
|
|
|
@@ -1971,6 +1972,38 @@ compile_test() {
|
|
compile_check_conftest "$CODE" "NV_DRM_DRIVER_UNLOAD_HAS_INT_RETURN_TYPE" "" "types"
|
|
;;
|
|
|
|
+ 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;
|
|
};
|
|
|
|
+static inline void
|
|
+nv_drm_gem_object_unreference_unlocked(struct nv_gem_object *nv_gem)
|
|
+{
|
|
+#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
|
|
+
|
|
+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
|
|
+}
|
|
+
|
|
+#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
|
|
|