* [PR PATCH] nvidia390: patch for linux5.9
@ 2020-12-04 22:12 abenson
2020-12-04 22:37 ` ericonr
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: abenson @ 2020-12-04 22:12 UTC (permalink / raw)
To: ml
[-- Attachment #1: Type: text/plain, Size: 336 bytes --]
There is a new pull request by abenson against master on the void-packages repository
https://github.com/abenson/void-packages nvidia390_5.9_fixquestionmark
https://github.com/void-linux/void-packages/pull/26945
nvidia390: patch for linux5.9
A patch file from https://github.com/void-linux/void-packages/pull/26945.patch is attached
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-nvidia390_5.9_fixquestionmark-26945.patch --]
[-- Type: text/x-diff, Size: 19606 bytes --]
From a4ecb18f865471b18985787ea006086fc949009e Mon Sep 17 00:00:00 2001
From: Andrew Benson <abenson+void@gmail.com>
Date: Fri, 4 Dec 2020 16:00:24 -0600
Subject: [PATCH] nvidia390: patch for linux5.9
---
srcpkgs/nvidia390/files/linux-5.9.x.patch | 481 ++++++++++++++++++++++
srcpkgs/nvidia390/template | 3 +-
2 files changed, 483 insertions(+), 1 deletion(-)
create mode 100644 srcpkgs/nvidia390/files/linux-5.9.x.patch
diff --git a/srcpkgs/nvidia390/files/linux-5.9.x.patch b/srcpkgs/nvidia390/files/linux-5.9.x.patch
new file mode 100644
index 00000000000..8942745eab2
--- /dev/null
+++ b/srcpkgs/nvidia390/files/linux-5.9.x.patch
@@ -0,0 +1,481 @@
+diff --git a/kernel/common/inc/nv-linux.h b/kernel/common/inc/nv-linux.h
+index 37c6841..23efe9e 100644
+--- a/kernel/common/inc/nv-linux.h
++++ b/kernel/common/inc/nv-linux.h
+@@ -159,12 +159,14 @@ static inline uid_t __kuid_val(kuid_t uid)
+ }
+ #endif
+
+ #if defined(NVCPU_X86_64) && !defined(HAVE_COMPAT_IOCTL)
+ #include <linux/syscalls.h> /* sys_ioctl() */
++#if defined(NV_LINUX_IOCTL32_H_PRESENT)
+ #include <linux/ioctl32.h> /* register_ioctl32_conversion() */
+ #endif
++#endif
+
+ #if !defined(NV_FILE_OPERATIONS_HAS_IOCTL) && \
+ !defined(NV_FILE_OPERATIONS_HAS_UNLOCKED_IOCTL)
+ #error "struct file_operations compile test likely failed!"
+ #endif
+diff --git a/kernel/common/inc/nv-mm.h b/kernel/common/inc/nv-mm.h
+index 8df26f1..e791bb2 100644
+--- a/kernel/common/inc/nv-mm.h
++++ b/kernel/common/inc/nv-mm.h
+@@ -146,10 +146,15 @@ typedef int vm_fault_t;
+ #if defined(NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG)
+
+ return get_user_pages_remote(tsk, mm, start, nr_pages, flags,
+ pages, vmas, NULL);
+
++ #elif defined(NV_GET_USER_PAGES_REMOTE_REMOVED_TSK_ARG)
++
++ return get_user_pages_remote(mm, start, nr_pages, flags,
++ pages, vmas, NULL);
++
+ #else
+
+ return get_user_pages_remote(tsk, mm, start, nr_pages, flags,
+ pages, vmas);
+
+diff --git a/kernel/conftest.sh b/kernel/conftest.sh
+index cdb249c..54da233 100755
+--- a/kernel/conftest.sh
++++ b/kernel/conftest.sh
+@@ -132,10 +132,11 @@ test_headers() {
+ FILES="$FILES linux/sched/task_stack.h"
+ FILES="$FILES xen/ioemu.h"
+ FILES="$FILES linux/fence.h"
+ FILES="$FILES linux/ktime.h"
+ FILES="$FILES linux/dma-resv.h"
++ FILES="$FILES linux/ioctl32.h"
+
+ # Arch specific headers which need testing
+ FILES_ARCH="asm/book3s/64/hash-64k.h"
+ FILES_ARCH="$FILES_ARCH asm/set_memory.h"
+ FILES_ARCH="$FILES_ARCH asm/powernv.h"
+@@ -2449,10 +2450,69 @@ compile_test() {
+ }"
+
+ compile_check_conftest "$CODE" "NV_DRM_DRIVER_HAS_LEGACY_DEV_LIST" "" "types"
+ ;;
+
++ drm_driver_has_gem_free_object)
++ CODE="
++ #if defined(NV_DRM_DRMP_H_PRESENT)
++ #include <drm/drmP.h>
++ #endif
++
++ #if defined(NV_DRM_DRM_DRV_H_PRESENT)
++ #include <drm/drm_drv.h>
++ #endif
++
++ int conftest_drm_driver_has_gem_free_object(void) {
++ return offsetof(struct drm_driver, gem_free_object);
++ }"
++
++ compile_check_conftest "$CODE" "NV_DRM_DRIVER_HAS_GEM_FREE_OBJECT" "" "types"
++ ;;
++
++ drm_display_mode_has_vrefresh)
++ CODE="
++ #if defined(NV_DRM_DRMP_H_PRESENT)
++ #include <drm/drmP.h>
++ #endif
++
++ #if defined(NV_DRM_DRM_DRV_H_PRESENT)
++ #include <drm/drm_drv.h>
++ #endif
++
++ int conftest_drm_display_mode_has_vrefresh(void) {
++ return offsetof(struct drm_display_mode, vrefresh);
++ }"
++
++ compile_check_conftest "$CODE" "NV_DRM_DISPLAY_MODE_HAS_VREFRESH" "" "types"
++ ;;
++
++ drm_master_set_returns_int)
++ CODE="
++ #if defined(NV_DRM_DRMP_H_PRESENT)
++ #include <drm/drmP.h>
++ #endif
++
++ #if defined(NV_DRM_DRM_DRV_H_PRESENT)
++ #include <drm/drm_drv.h>
++ #endif
++
++ static int nv_master_set(struct drm_device *x, struct drm_file *y, bool z)
++ {
++ return 1;
++ }
++
++ int conftest_drm_master_set_returns_int(void) {
++ struct drm_driver nv_drm_driver;
++ nv_drm_driver.master_set = nv_master_set;
++
++ return nv_drm_driver.master_set(NULL, NULL, false);
++ }"
++
++ compile_check_conftest "$CODE" "NV_DRM_MASTER_SET_RETURNS_INT" "" "generic"
++ ;;
++
+ jiffies_to_timespec)
+ #
+ # Determine if jiffies_to_timespec() is present
+ #
+ # removed by commit 751addac78b6
+@@ -3138,10 +3198,33 @@ compile_test() {
+ else
+ echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions"
+ fi
+ echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions"
+
++ # conftest #4: check if get_user_pages_remote() has removed 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 "#define NV_GET_USER_PAGES_REMOTE_REMOVED_TSK_ARG" | append_conftest "functions"
++ rm -f conftest$$.o
++ else
++ echo "#undef NV_GET_USER_PAGES_REMOTE_REMOVED_TSK_ARG" | append_conftest "functions"
++ fi
+ ;;
+
+ usleep_range)
+ #
+ # Determine if the function usleep_range() is present.
+@@ -3227,10 +3310,25 @@ compile_test() {
+ echo "#undef NV_DRM_GEM_OBJECT_LOOKUP_PRESENT" | append_conftest "functions"
+ echo "#undef NV_DRM_GEM_OBJECT_LOOKUP_ARGUMENT_COUNT" | append_conftest "functions"
+ fi
+ ;;
+
++ drm_gem_object_put_unlocked)
++ CODE="
++ #if defined(NV_DRM_DRMP_H_PRESENT)
++ #include <drm/drmP.h>
++ #endif
++ #if defined(NV_DRM_DRM_GEM_H_PRESENT)
++ #include <drm/drm_gem.h>
++ #endif
++ int conftest_drm_gem_object_put_unlocked(void) {
++ drm_gem_object_put_unlocked();
++ }"
++
++ compile_check_conftest "$CODE" "NV_DRM_GEM_OBJECT_PUT_UNLOCKED_PRESENT" "" "functions"
++ ;;
++
+ drm_master_drop_has_from_release_arg)
+ #
+ # Determine if drm_driver::master_drop() has 'from_release' argument.
+ #
+ # Last argument 'bool from_release' has been removed by:
+@@ -4129,10 +4227,30 @@ compile_test() {
+ }"
+
+ compile_check_conftest "$CODE" "NV_PCI_DEV_HAS_SKIP_BUS_PM" "" "types"
+ ;;
+
++ smp_read_barrier_depends)
++ CODE="
++ #include <asm/barrier.h>
++ void conftest_smp_read_barrier_depends(void) {
++ smp_read_barrier_depends(0);
++ }"
++
++ compile_check_conftest "$CODE" "NV_SMP_READ_BARRIER_DEPENDS_PRESENT" "" "functions"
++ ;;
++
++ vga_tryget)
++ CODE="
++ #include <linux/vgaarb.h>
++ void conftest_vga_tryget(void) {
++ vga_tryget();
++ }"
++
++ compile_check_conftest "$CODE" "NV_VGA_TRYGET_PRESENT" "" "functions"
++ ;;
++
+ esac
+ }
+
+ case "$6" in
+ cc_sanity_check)
+diff --git a/kernel/nvidia-drm/nvidia-drm-drv.c b/kernel/nvidia-drm/nvidia-drm-drv.c
+index 17e377d..95e035b 100644
+--- a/kernel/nvidia-drm/nvidia-drm-drv.c
++++ b/kernel/nvidia-drm/nvidia-drm-drv.c
+@@ -464,20 +464,29 @@ static void nv_drm_unload(struct drm_device *dev)
+ }
+ #endif
+
+ #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE)
+
++#if defined(NV_DRM_MASTER_SET_RETURNS_INT)
+ static int nv_drm_master_set(struct drm_device *dev,
+ struct drm_file *file_priv, bool from_open)
++#else
++static void nv_drm_master_set(struct drm_device *dev,
++ struct drm_file *file_priv, bool from_open)
++#endif
+ {
+ struct nv_drm_device *nv_dev = to_nv_device(dev);
+
++#if defined(NV_DRM_MASTER_SET_RETURNS_INT)
+ if (!nvKms->grabOwnership(nv_dev->pDevice)) {
+ return -EINVAL;
+ }
+
+ return 0;
++#else
++ nvKms->grabOwnership(nv_dev->pDevice);
++#endif
+ }
+
+ #if defined(NV_DRM_MASTER_DROP_HAS_FROM_RELEASE_ARG)
+ static
+ void nv_drm_master_drop(struct drm_device *dev,
+@@ -675,11 +684,15 @@ static struct drm_driver nv_drm_driver = {
+ #if defined(NV_DRM_DRIVER_PRIME_FLAG_PRESENT)
+ DRIVER_PRIME |
+ #endif
+ DRIVER_GEM | DRIVER_RENDER,
+
++#if defined(NV_DRM_DRIVER_HAS_GEM_FREE_OBJECT)
+ .gem_free_object = nv_drm_gem_free,
++#else
++ .gem_free_object_unlocked = nv_drm_gem_free,
++#endif
+
+ .ioctls = nv_drm_ioctls,
+ .num_ioctls = ARRAY_SIZE(nv_drm_ioctls),
+
+ .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
+diff --git a/kernel/nvidia-drm/nvidia-drm-gem.c b/kernel/nvidia-drm/nvidia-drm-gem.c
+index 37100ed..eb7b959 100644
+--- a/kernel/nvidia-drm/nvidia-drm-gem.c
++++ b/kernel/nvidia-drm/nvidia-drm-gem.c
+@@ -41,11 +41,13 @@
+ void nv_drm_gem_free(struct drm_gem_object *gem)
+ {
+ struct drm_device *dev = gem->dev;
+ struct nv_drm_gem_object *nv_gem = to_nv_gem_object(gem);
+
++#if !defined(NV_DRM_DRIVER_HAS_GEM_FREE_OBJECT)
+ WARN_ON(!mutex_is_locked(&dev->struct_mutex));
++#endif
+
+ /* Cleanup core gem object */
+
+ drm_gem_object_release(&nv_gem->base);
+
+diff --git a/kernel/nvidia-drm/nvidia-drm-gem.h b/kernel/nvidia-drm/nvidia-drm-gem.h
+index 5691a7a..7fc6f69 100644
+--- a/kernel/nvidia-drm/nvidia-drm-gem.h
++++ b/kernel/nvidia-drm/nvidia-drm-gem.h
+@@ -85,11 +85,15 @@ static inline struct nv_drm_gem_object *to_nv_gem_object(
+
+ 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 defined(NV_DRM_GEM_OBJECT_PUT_UNLOCKED_PRESENT)
+ 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
+ }
+
+@@ -136,11 +140,10 @@ void nv_drm_gem_object_init(struct nv_drm_device *nv_dev,
+ nv_dma_resv_init(&nv_gem->resv);
+
+ #if defined(NV_DRM_GEM_OBJECT_HAS_RESV)
+ nv_gem->base.resv = &nv_gem->resv;
+ #endif
+-
+ #endif
+
+ drm_gem_private_object_init(dev, &nv_gem->base, size);
+ }
+
+diff --git a/kernel/nvidia-drm/nvidia-drm-utils.c b/kernel/nvidia-drm/nvidia-drm-utils.c
+index 8cb2d5e..6460d4d 100644
+--- a/kernel/nvidia-drm/nvidia-drm-utils.c
++++ b/kernel/nvidia-drm/nvidia-drm-utils.c
+@@ -101,11 +101,13 @@ int nvkms_connector_type_to_drm_connector_type(NvKmsConnectorType type,
+
+ void
+ nvkms_display_mode_to_drm_mode(const struct NvKmsKapiDisplayMode *displayMode,
+ struct drm_display_mode *mode)
+ {
++#if defined(NV_DRM_DISPLAY_MODE_HAS_VREFRESH)
+ mode->vrefresh = (displayMode->timings.refreshRate + 500) / 1000; /* In Hz */
++#endif
+
+ mode->clock = (displayMode->timings.pixelClockHz + 500) / 1000; /* In Hz */
+
+ mode->hdisplay = displayMode->timings.hVisible;
+ mode->hsync_start = displayMode->timings.hSyncStart;
+@@ -187,11 +189,13 @@ bool drm_format_to_nvkms_format(u32 format,
+ }
+
+ void drm_mode_to_nvkms_display_mode(const struct drm_display_mode *src,
+ struct NvKmsKapiDisplayMode *dst)
+ {
++#if defined(NV_DRM_DISPLAY_MODE_HAS_VREFRESH)
+ dst->timings.refreshRate = src->vrefresh * 1000;
++#endif
+
+ dst->timings.pixelClockHz = src->clock * 1000; /* In Hz */
+
+ dst->timings.hVisible = src->hdisplay;
+ dst->timings.hSyncStart = src->hsync_start;
+diff --git a/kernel/nvidia-drm/nvidia-drm.Kbuild b/kernel/nvidia-drm/nvidia-drm.Kbuild
+index 4cfbbbc..d9dbab8 100644
+--- a/kernel/nvidia-drm/nvidia-drm.Kbuild
++++ b/kernel/nvidia-drm/nvidia-drm.Kbuild
+@@ -47,18 +47,20 @@ $(call ASSIGN_PER_OBJ_CFLAGS, $(NVIDIA_DRM_OBJECTS), $(NVIDIA_DRM_CFLAGS))
+
+ NV_OBJECTS_DEPEND_ON_CONFTEST += $(NVIDIA_DRM_OBJECTS)
+
+ NV_CONFTEST_GENERIC_COMPILE_TESTS += drm_available
+ NV_CONFTEST_GENERIC_COMPILE_TESTS += drm_atomic_available
++NV_CONFTEST_GENERIC_COMPILE_TESTS += drm_master_set_returns_int
+ NV_CONFTEST_GENERIC_COMPILE_TESTS += is_export_symbol_gpl_refcount_inc
+ NV_CONFTEST_GENERIC_COMPILE_TESTS += is_export_symbol_gpl_refcount_dec_and_test
+
+ NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_dev_unref
+ NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_reinit_primary_mode_group
+ NV_CONFTEST_FUNCTION_COMPILE_TESTS += get_user_pages_remote
+ NV_CONFTEST_FUNCTION_COMPILE_TESTS += get_user_pages
+ NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_gem_object_lookup
++NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_gem_object_put_unlocked
+ NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_atomic_state_ref_counting
+ NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_driver_has_gem_prime_res_obj
+ NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_atomic_helper_connector_dpms
+ NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_connector_funcs_have_mode_in_name
+ NV_CONFTEST_FUNCTION_COMPILE_TESTS += vmf_insert_pfn
+@@ -70,10 +72,12 @@ NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_connector_for_each_possible_encoder
+ NV_CONFTEST_TYPE_COMPILE_TESTS += drm_bus_present
+ NV_CONFTEST_TYPE_COMPILE_TESTS += drm_bus_has_bus_type
+ NV_CONFTEST_TYPE_COMPILE_TESTS += drm_bus_has_get_irq
+ NV_CONFTEST_TYPE_COMPILE_TESTS += drm_bus_has_get_name
+ NV_CONFTEST_TYPE_COMPILE_TESTS += drm_driver_has_legacy_dev_list
++NV_CONFTEST_TYPE_COMPILE_TESTS += drm_driver_has_gem_free_object
++NV_CONFTEST_TYPE_COMPILE_TESTS += drm_display_mode_has_vrefresh
+ NV_CONFTEST_TYPE_COMPILE_TESTS += drm_driver_has_set_busid
+ NV_CONFTEST_TYPE_COMPILE_TESTS += drm_crtc_state_has_connectors_changed
+ NV_CONFTEST_TYPE_COMPILE_TESTS += drm_init_function_args
+ NV_CONFTEST_TYPE_COMPILE_TESTS += drm_mode_connector_list_update_has_merge_type_bits_arg
+ NV_CONFTEST_TYPE_COMPILE_TESTS += drm_helper_mode_fill_fb_struct
+diff --git a/kernel/nvidia-modeset/nvidia-modeset-linux.c b/kernel/nvidia-modeset/nvidia-modeset-linux.c
+index f7f1def..8fb2161 100644
+--- a/kernel/nvidia-modeset/nvidia-modeset-linux.c
++++ b/kernel/nvidia-modeset/nvidia-modeset-linux.c
+@@ -49,12 +49,14 @@
+ #endif
+
+
+ #if NV_NEEDS_COMPAT_IOCTL_REGISTRATION
+ #include <linux/syscalls.h> /* sys_ioctl() */
++#if defined(NV_LINUX_IOCTL32_H_PRESENT)
+ #include <linux/ioctl32.h> /* register_ioctl32_conversion() */
+ #endif
++#endif
+
+ #define NVKMS_MAJOR_DEVICE_NUMBER 195
+ #define NVKMS_MINOR_DEVICE_NUMBER 254
+
+ #define NVKMS_LOG_PREFIX "nvidia-modeset: "
+diff --git a/kernel/nvidia-uvm/nvidia-uvm.Kbuild b/kernel/nvidia-uvm/nvidia-uvm.Kbuild
+index 650c922..0c83fae 100644
+--- a/kernel/nvidia-uvm/nvidia-uvm.Kbuild
++++ b/kernel/nvidia-uvm/nvidia-uvm.Kbuild
+@@ -108,10 +108,11 @@ NV_CONFTEST_FUNCTION_COMPILE_TESTS += bitmap_clear
+ NV_CONFTEST_FUNCTION_COMPILE_TESTS += usleep_range
+ NV_CONFTEST_FUNCTION_COMPILE_TESTS += radix_tree_empty
+ NV_CONFTEST_FUNCTION_COMPILE_TESTS += radix_tree_replace_slot
+ NV_CONFTEST_FUNCTION_COMPILE_TESTS += do_gettimeofday
+ NV_CONFTEST_FUNCTION_COMPILE_TESTS += ktime_get_raw_ts64
++NV_CONFTEST_FUNCTION_COMPILE_TESTS += smp_read_barrier_depends
+
+ NV_CONFTEST_TYPE_COMPILE_TESTS += proc_dir_entry
+ NV_CONFTEST_TYPE_COMPILE_TESTS += irq_handler_t
+ NV_CONFTEST_TYPE_COMPILE_TESTS += outer_flush_all
+ NV_CONFTEST_TYPE_COMPILE_TESTS += vm_operations_struct
+diff --git a/kernel/nvidia-uvm/uvm8_tools.c b/kernel/nvidia-uvm/uvm8_tools.c
+index 86dbb77..be865bc 100644
+--- a/kernel/nvidia-uvm/uvm8_tools.c
++++ b/kernel/nvidia-uvm/uvm8_tools.c
+@@ -188,11 +188,15 @@ static NV_STATUS tools_update_status(uvm_va_space_t *va_space);
+
+ static uvm_tools_event_tracker_t *tools_event_tracker(struct file *filp)
+ {
+ long event_tracker = atomic_long_read((atomic_long_t *)&filp->private_data);
+
++#if defined(NV_SMP_READ_BARRIER_DEPENDS_PRESENT)
+ smp_read_barrier_depends();
++#else
++ smp_rmb();
++#endif
+ return (uvm_tools_event_tracker_t *)event_tracker;
+ }
+
+ static bool tracker_is_queue(uvm_tools_event_tracker_t *event_tracker)
+ {
+diff --git a/kernel/nvidia-uvm/uvm8_va_range.h b/kernel/nvidia-uvm/uvm8_va_range.h
+index 8cae357..a74ad24 100644
+--- a/kernel/nvidia-uvm/uvm8_va_range.h
++++ b/kernel/nvidia-uvm/uvm8_va_range.h
+@@ -715,11 +715,15 @@ static uvm_va_block_t *uvm_va_range_block(uvm_va_range_t *va_range, size_t index
+ // Later accesses in this thread will read state out of block, potentially
+ // as soon as the block pointer is updated by another thread. We have to
+ // make sure that any initialization of this block by the creating thread is
+ // visible to later accesses in this thread, which requires a data
+ // dependency barrier.
++#if defined(NV_SMP_READ_BARRIER_DEPENDS_PRESENT)
+ smp_read_barrier_depends();
++#else
++ smp_mb();
++#endif
+ return block;
+ }
+
+ // Same as uvm_va_range_block except that the block is created if not already
+ // present in the array. If NV_OK is returned, the block has been allocated
+diff --git a/kernel/nvidia/nv.c b/kernel/nvidia/nv.c
+index 15983f6..a7be80a 100644
+--- a/kernel/nvidia/nv.c
++++ b/kernel/nvidia/nv.c
+@@ -3870,11 +3870,15 @@ nvidia_probe
+
+ pci_set_master(dev);
+
+ #if defined(CONFIG_VGA_ARB) && !defined(NVCPU_PPC64LE)
+ #if defined(VGA_DEFAULT_DEVICE)
++#if defined(NV_VGA_TRYGET_PRESENT)
+ vga_tryget(VGA_DEFAULT_DEVICE, VGA_RSRC_LEGACY_MASK);
++#else
++ vga_get(VGA_DEFAULT_DEVICE, VGA_RSRC_LEGACY_MASK, 0);
++#endif
+ #endif
+ vga_set_legacy_decoding(dev, VGA_RSRC_NONE);
+ #endif
+
+ if (rm_get_cpu_type(sp, &nv_cpu_type) != NV_OK)
diff --git a/srcpkgs/nvidia390/template b/srcpkgs/nvidia390/template
index 4fb6ff6ec88..14667cd53b8 100644
--- a/srcpkgs/nvidia390/template
+++ b/srcpkgs/nvidia390/template
@@ -4,7 +4,7 @@ _desc="NVIDIA drivers (GeForce 400, 500 series)"
pkgname=nvidia390
version=390.138
-revision=2
+revision=3
maintainer="Andrew Benson <abenson+void@gmail.com>"
license="custom:NVIDIA Proprietary"
homepage="https://www.nvidia.com"
@@ -43,6 +43,7 @@ pre_install() {
cp nvidia_icd.json.template nvidia_icd.json
sed -i -e 's:__NV_VK_ICD__:libGLX_nvidia.so.0:g' nvidia_icd.json
patch -Np1 < ${FILESDIR}/linux-5.8.x.patch
+ patch -Np1 < ${FILESDIR}/linux-5.9.x.patch
}
do_install() {
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: nvidia390: patch for linux5.9
2020-12-04 22:12 [PR PATCH] nvidia390: patch for linux5.9 abenson
@ 2020-12-04 22:37 ` ericonr
2020-12-05 0:50 ` [PR PATCH] [Updated] " abenson
2021-01-04 22:50 ` [PR PATCH] [Closed]: " abenson
2 siblings, 0 replies; 4+ messages in thread
From: ericonr @ 2020-12-04 22:37 UTC (permalink / raw)
To: ml
[-- Attachment #1: Type: text/plain, Size: 179 bytes --]
New comment by ericonr on void-packages repository
https://github.com/void-linux/void-packages/pull/26945#issuecomment-739060390
Comment:
Might make sense to add patch sources.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PR PATCH] [Updated] nvidia390: patch for linux5.9
2020-12-04 22:12 [PR PATCH] nvidia390: patch for linux5.9 abenson
2020-12-04 22:37 ` ericonr
@ 2020-12-05 0:50 ` abenson
2021-01-04 22:50 ` [PR PATCH] [Closed]: " abenson
2 siblings, 0 replies; 4+ messages in thread
From: abenson @ 2020-12-05 0:50 UTC (permalink / raw)
To: ml
[-- Attachment #1: Type: text/plain, Size: 341 bytes --]
There is an updated pull request by abenson against master on the void-packages repository
https://github.com/abenson/void-packages nvidia390_5.9_fixquestionmark
https://github.com/void-linux/void-packages/pull/26945
nvidia390: patch for linux5.9
A patch file from https://github.com/void-linux/void-packages/pull/26945.patch is attached
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-nvidia390_5.9_fixquestionmark-26945.patch --]
[-- Type: text/x-diff, Size: 15676 bytes --]
From 81cc090144d24babc42f2d95d7cd9119712c92db Mon Sep 17 00:00:00 2001
From: Andrew Benson <abenson+void@gmail.com>
Date: Fri, 4 Dec 2020 16:00:24 -0600
Subject: [PATCH] nvidia390: patch for linux5.9
---
srcpkgs/nvidia390/files/linux-5.9.x.patch | 365 ++++++++++++++++++++++
srcpkgs/nvidia390/template | 3 +-
2 files changed, 367 insertions(+), 1 deletion(-)
create mode 100644 srcpkgs/nvidia390/files/linux-5.9.x.patch
diff --git a/srcpkgs/nvidia390/files/linux-5.9.x.patch b/srcpkgs/nvidia390/files/linux-5.9.x.patch
new file mode 100644
index 00000000000..fa919e4b02f
--- /dev/null
+++ b/srcpkgs/nvidia390/files/linux-5.9.x.patch
@@ -0,0 +1,365 @@
+https://bbs.archlinux.org/viewtopic.php?pid=1932201#p1932201
+
+diff --git a/kernel/common/inc/nv-linux.h b/kernel/common/inc/nv-linux.h
+index ab06dbc..dd335b5 100644
+--- a/kernel/common/inc/nv-linux.h
++++ b/kernel/common/inc/nv-linux.h
+@@ -159,7 +159,7 @@ static inline uid_t __kuid_val(kuid_t uid)
+ }
+ #endif
+
+-#if defined(NVCPU_X86_64) && !defined(HAVE_COMPAT_IOCTL)
++#if defined(NVCPU_X86_64) && !defined(NV_FILE_OPERATIONS_HAS_COMPAT_IOCTL)
+ #include <linux/syscalls.h> /* sys_ioctl() */
+ #include <linux/ioctl32.h> /* register_ioctl32_conversion() */
+ #endif
+diff --git a/kernel/common/inc/nv-mm.h b/kernel/common/inc/nv-mm.h
+index d2d7657..a5325fe 100644
+--- a/kernel/common/inc/nv-mm.h
++++ b/kernel/common/inc/nv-mm.h
+@@ -144,9 +144,13 @@ typedef int vm_fault_t;
+ 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
+
+@@ -159,7 +163,7 @@ typedef int vm_fault_t;
+ #endif
+ #else
+ #if defined(NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS)
+- #define NV_GET_USER_PAGES_REMOTE NV_GET_USER_PAGES
++ #define NV_GET_USER_PAGES_REMOTE get_user_pages
+ #else
+ #include <linux/mm.h>
+ #include <linux/sched.h>
+diff --git a/kernel/conftest.sh b/kernel/conftest.sh
+index e900963..ef82dee 100755
+--- a/kernel/conftest.sh
++++ b/kernel/conftest.sh
+@@ -3043,6 +3043,7 @@ compile_test() {
+
+ 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
+@@ -3070,14 +3071,20 @@ compile_test() {
+ 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 #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,
+@@ -3095,13 +3102,40 @@ compile_test() {
+ 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
++ 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_REMOTE_HAS_TSK_ARG" | append_conftest "functions"
+ echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions"
+ fi
+- echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions"
+-
+ ;;
+
+ usleep_range)
+@@ -4131,6 +4165,115 @@ compile_test() {
+ compile_check_conftest "$CODE" "NV_PCI_DEV_HAS_SKIP_BUS_PM" "" "types"
+ ;;
+
++ drm_gem_object_put_unlocked)
++ #
++ # Determine if the function drm_gem_object_put_unlocked() is present.
++ #
++ # In v5.9-rc1, commit 2f4dd13d4bb8 ("drm/gem: add
++ # drm_gem_object_put helper") removes drm_gem_object_put_unlocked()
++ # function and replace its definition by transient macro. Commit
++ # ab15d56e27be ("drm: remove transient
++ # drm_gem_object_put_unlocked()") finally removes
++ # drm_gem_object_put_unlocked() macro.
++ #
++ CODE="
++ #if defined(NV_DRM_DRMP_H_PRESENT)
++ #include <drm/drmP.h>
++ #endif
++
++ #if defined(NV_DRM_DRM_GEM_H_PRESENT)
++ #include <drm/drm_gem.h>
++ #endif
++ void conftest_drm_gem_object_put_unlocked(void) {
++ drm_gem_object_put_unlocked();
++ }"
++
++ compile_check_conftest "$CODE" "NV_DRM_GEM_OBJECT_PUT_UNLOCK_PRESENT" "" "functions"
++ ;;
++
++ drm_display_mode_has_vrefresh)
++ #
++ # Determine if the 'drm_display_mode' structure has a 'vrefresh'
++ # field.
++ #
++ # Removed by commit 0425662fdf05 ("drm: Nuke mode->vrefresh") in
++ # v5.9-rc1.
++ #
++ CODE="
++ #include <drm/drm_modes.h>
++
++ int conftest_drm_display_mode_has_vrefresh(void) {
++ return offsetof(struct drm_display_mode, vrefresh);
++ }"
++
++ compile_check_conftest "$CODE" "NV_DRM_DISPLAY_MODE_HAS_VREFRESH" "types"
++
++ ;;
++
++ drm_driver_master_set_has_int_return_type)
++ #
++ # Determine if drm_driver::master_set() returns integer value
++ #
++ # Changed to void by commit 907f53200f98 ("drm: vmwgfx: remove
++ # drm_driver::master_set() return type") in v5.9-rc1.
++ #
++ CODE="
++ #if defined(NV_DRM_DRMP_H_PRESENT)
++ #include <drm/drmP.h>
++ #endif
++
++ #if defined(NV_DRM_DRM_DRV_H_PRESENT)
++ #include <drm/drm_drv.h>
++ #endif
++
++ int conftest_drm_driver_master_set_has_int_return_type(struct drm_driver *drv,
++ struct drm_device *dev, struct drm_file *file_priv, bool from_open) {
++
++ return drv->master_set(dev, file_priv, from_open);
++ }"
++
++ compile_check_conftest "$CODE" "NV_DRM_DRIVER_SET_MASTER_HAS_INT_RETURN_TYPE" "" "types"
++ ;;
++
++ drm_driver_has_gem_free_object)
++ #
++ # Determine if the 'drm_driver' structure has a 'gem_free_object'
++ # function pointer.
++ #
++ # drm_driver::gem_free_object is removed by commit 1a9458aeb8eb
++ # ("drm: remove drm_driver::gem_free_object") in v5.9-rc1.
++ #
++ CODE="
++ #if defined(NV_DRM_DRMP_H_PRESENT)
++ #include <drm/drmP.h>
++ #endif
++
++ #if defined(NV_DRM_DRM_DRV_H_PRESENT)
++ #include <drm/drm_drv.h>
++ #endif
++
++ int conftest_drm_driver_has_gem_free_object(void) {
++ return offsetof(struct drm_driver, gem_free_object);
++ }"
++
++ compile_check_conftest "$CODE" "NV_DRM_DRIVER_HAS_GEM_FREE_OBJECT" "" "types"
++ ;;
++
++ vga_tryget)
++ #
++ # Determine if vga_tryget() is present
++ #
++ # vga_tryget() was removed by commit f369bc3f9096 ("vgaarb: mark
++ # vga_tryget static") in v5.9-rc1 (2020-08-01).
++ #
++ CODE="
++ #include <linux/vgaarb.h>
++ void conftest_vga_tryget(void) {
++ vga_tryget();
++ }"
++
++ compile_check_conftest "$CODE" "NV_VGA_TRYGET_PRESENT" "" "functions"
++ ;;
+ esac
+ }
+
+diff --git a/kernel/nvidia-drm/nvidia-drm-drv.c b/kernel/nvidia-drm/nvidia-drm-drv.c
+index 17e377d..1b4cc6d 100644
+--- a/kernel/nvidia-drm/nvidia-drm-drv.c
++++ b/kernel/nvidia-drm/nvidia-drm-drv.c
+@@ -466,8 +466,8 @@ static void nv_drm_unload(struct drm_device *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 +478,21 @@ static int nv_drm_master_set(struct drm_device *dev,
+ 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 +692,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 --git a/kernel/nvidia-drm/nvidia-drm-gem.h b/kernel/nvidia-drm/nvidia-drm-gem.h
+index 5691a7a..18c50ca 100644
+--- a/kernel/nvidia-drm/nvidia-drm-gem.h
++++ b/kernel/nvidia-drm/nvidia-drm-gem.h
+@@ -87,7 +87,13 @@ 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 defined(NV_DRM_GEM_OBJECT_PUT_UNLOCK_PRESENT)
+ 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 --git a/kernel/nvidia-drm/nvidia-drm-utils.c b/kernel/nvidia-drm/nvidia-drm-utils.c
+index 8cb2d5e..e30b2b6 100644
+--- a/kernel/nvidia-drm/nvidia-drm-utils.c
++++ b/kernel/nvidia-drm/nvidia-drm-utils.c
+@@ -103,7 +103,9 @@ void
+ nvkms_display_mode_to_drm_mode(const struct NvKmsKapiDisplayMode *displayMode,
+ struct drm_display_mode *mode)
+ {
++#if defined(NV_DRM_DISPLAY_MODE_HAS_VREFRESH)
+ mode->vrefresh = (displayMode->timings.refreshRate + 500) / 1000; /* In Hz */
++#endif
+
+ mode->clock = (displayMode->timings.pixelClockHz + 500) / 1000; /* In Hz */
+
+@@ -189,7 +191,11 @@ bool drm_format_to_nvkms_format(u32 format,
+ void drm_mode_to_nvkms_display_mode(const struct drm_display_mode *src,
+ struct NvKmsKapiDisplayMode *dst)
+ {
++#if defined(NV_DRM_DISPLAY_MODE_HAS_VREFRESH)
+ dst->timings.refreshRate = src->vrefresh * 1000;
++#else
++ dst->timings.refreshRate = drm_mode_vrefresh(src) * 1000;
++#endif
+
+ dst->timings.pixelClockHz = src->clock * 1000; /* In Hz */
+
+diff --git a/kernel/nvidia-uvm/uvm8_tools.c b/kernel/nvidia-uvm/uvm8_tools.c
+index 86dbb77..63d0b64 100644
+--- a/kernel/nvidia-uvm/uvm8_tools.c
++++ b/kernel/nvidia-uvm/uvm8_tools.c
+@@ -190,7 +190,6 @@ static uvm_tools_event_tracker_t *tools_event_tracker(struct file *filp)
+ {
+ long event_tracker = atomic_long_read((atomic_long_t *)&filp->private_data);
+
+- smp_read_barrier_depends();
+ return (uvm_tools_event_tracker_t *)event_tracker;
+ }
+
+diff --git a/kernel/nvidia-uvm/uvm8_va_range.h b/kernel/nvidia-uvm/uvm8_va_range.h
+index 8cae357..6166cc8 100644
+--- a/kernel/nvidia-uvm/uvm8_va_range.h
++++ b/kernel/nvidia-uvm/uvm8_va_range.h
+@@ -717,7 +717,6 @@ static uvm_va_block_t *uvm_va_range_block(uvm_va_range_t *va_range, size_t index
+ // make sure that any initialization of this block by the creating thread is
+ // visible to later accesses in this thread, which requires a data
+ // dependency barrier.
+- smp_read_barrier_depends();
+ return block;
+ }
+
+diff --git a/kernel/nvidia/nv.c b/kernel/nvidia/nv.c
+index 15983f6..cfb2375 100644
+--- a/kernel/nvidia/nv.c
++++ b/kernel/nvidia/nv.c
+@@ -3872,7 +3872,9 @@ nvidia_probe
+
+ #if defined(CONFIG_VGA_ARB) && !defined(NVCPU_PPC64LE)
+ #if defined(VGA_DEFAULT_DEVICE)
++#if defined(NV_VGA_TRYGET_PRESENT)
+ vga_tryget(VGA_DEFAULT_DEVICE, VGA_RSRC_LEGACY_MASK);
++#endif
+ #endif
+ vga_set_legacy_decoding(dev, VGA_RSRC_NONE);
+ #endif
diff --git a/srcpkgs/nvidia390/template b/srcpkgs/nvidia390/template
index 4fb6ff6ec88..14667cd53b8 100644
--- a/srcpkgs/nvidia390/template
+++ b/srcpkgs/nvidia390/template
@@ -4,7 +4,7 @@ _desc="NVIDIA drivers (GeForce 400, 500 series)"
pkgname=nvidia390
version=390.138
-revision=2
+revision=3
maintainer="Andrew Benson <abenson+void@gmail.com>"
license="custom:NVIDIA Proprietary"
homepage="https://www.nvidia.com"
@@ -43,6 +43,7 @@ pre_install() {
cp nvidia_icd.json.template nvidia_icd.json
sed -i -e 's:__NV_VK_ICD__:libGLX_nvidia.so.0:g' nvidia_icd.json
patch -Np1 < ${FILESDIR}/linux-5.8.x.patch
+ patch -Np1 < ${FILESDIR}/linux-5.9.x.patch
}
do_install() {
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PR PATCH] [Closed]: nvidia390: patch for linux5.9
2020-12-04 22:12 [PR PATCH] nvidia390: patch for linux5.9 abenson
2020-12-04 22:37 ` ericonr
2020-12-05 0:50 ` [PR PATCH] [Updated] " abenson
@ 2021-01-04 22:50 ` abenson
2 siblings, 0 replies; 4+ messages in thread
From: abenson @ 2021-01-04 22:50 UTC (permalink / raw)
To: ml
[-- Attachment #1: Type: text/plain, Size: 163 bytes --]
There's a closed pull request on the void-packages repository
nvidia390: patch for linux5.9
https://github.com/void-linux/void-packages/pull/26945
Description:
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2021-01-04 22:50 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-04 22:12 [PR PATCH] nvidia390: patch for linux5.9 abenson
2020-12-04 22:37 ` ericonr
2020-12-05 0:50 ` [PR PATCH] [Updated] " abenson
2021-01-04 22:50 ` [PR PATCH] [Closed]: " abenson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).