├── .gitignore ├── 60-nvidia.rules ├── PKGBUILD ├── README.md ├── customization.cfg ├── patches ├── 01-ipmi-vm.diff ├── 02-ipmi-vm.diff ├── 455-crashfix.diff ├── 5.11-legacy.diff ├── 5.6-ioremap.diff ├── 5.6-legacy-includes.diff ├── 5.8-legacy.diff ├── 5.9-gpl.diff ├── 6.1-6-7-8-gpl.diff ├── 6.11-fbdev.diff ├── Add-IBT-support.diff ├── Enable-atomic-kernel-modesetting-by-default.diff ├── GFP_RETRY_MAYFAIL-test.diff ├── fix-hdmi-names.diff ├── gcc-14-470.diff ├── gcc-14.diff ├── gcc-15.diff ├── kernel-4.16.patch ├── kernel-4.19.patch ├── kernel-5.0.patch ├── kernel-5.1.patch ├── kernel-5.10.patch ├── kernel-5.11.patch ├── kernel-5.12.patch ├── kernel-5.14.patch ├── kernel-5.16-std.diff ├── kernel-5.16.patch ├── kernel-5.17.patch ├── kernel-5.2.patch ├── kernel-5.3.patch ├── kernel-5.4-prime.diff ├── kernel-5.4-symver.diff ├── kernel-5.4.patch ├── kernel-5.5.patch ├── kernel-5.6.patch ├── kernel-5.7.patch ├── kernel-5.8.patch ├── kernel-5.9.patch ├── kernel-6.0-470.patch ├── kernel-6.0.patch ├── kernel-6.12.patch ├── kernel-6.2.patch ├── kernel-6.3.patch ├── kernel-6.4.patch ├── kernel-6.5.patch ├── kernel-6.8.patch ├── legacy-kernel-6.4.diff ├── legacy-kernel-6.5.diff ├── legacy-kernel-6.6.diff ├── linux-version.diff ├── list_is_first.diff ├── make-modeset-fbdev-default-565.diff ├── make-modeset-fbdev-default.diff ├── nvidia-open-gcc-ibt-sls.diff └── silence-event-assert-until-570.diff └── system ├── 10-nvidia-drm-outputclass.conf ├── egl-wayland ├── licenses │ └── egl-wayland │ │ └── COPYING ├── pkgconfig │ ├── wayland-eglstream-protocols.pc │ └── wayland-eglstream.pc └── wayland-eglstream │ ├── wayland-eglstream-controller.xml │ └── wayland-eglstream.xml ├── nvidia-sleep.conf ├── nvidia-tkg.hook ├── nvidia-tkg.install ├── nvidia-utils-tkg.install └── nvidia-utils-tkg.sysusers /.gitignore: -------------------------------------------------------------------------------- 1 | .* 2 | !.gitignore 3 | *~ 4 | *.orig 5 | *.log 6 | *.run 7 | *.tgz 8 | *.xz 9 | *.pkg 10 | *.bak 11 | *.tar.gz 12 | *.tar.zst 13 | *.old 14 | *.db 15 | *.files 16 | src/ 17 | pkg/ 18 | -------------------------------------------------------------------------------- /60-nvidia.rules: -------------------------------------------------------------------------------- 1 | # Device nodes are created by nvidia-modprobe, which is called by the nvidia DDX. 2 | # In case the DDX is not started, the device nodes are never created, so call 3 | # nvidia-modprobe in the udev rules to cover the Wayland/EGLStream and compute 4 | # case without a started display. In the case where vfio-pci is used 5 | # nvidia-modprobe should not be invoked. 6 | ACTION=="add|bind", ATTR{vendor}=="0x10de", ATTR{class}=="0x03[0-9]*", \ 7 | DRIVER=="nvidia", TEST!="/dev/nvidia-uvm", \ 8 | RUN+="/usr/bin/nvidia-modprobe", \ 9 | RUN+="/usr/bin/nvidia-modprobe -c0 -u" 10 | 11 | # Enable runtime PM for NVIDIA VGA/3D controller devices 12 | ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x03[0-9]*", TEST=="power/control", ATTR{power/control}="auto" 13 | # Enable runtime PM for NVIDIA Audio devices 14 | ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", TEST=="power/control", ATTR{power/control}="auto" 15 | # Enable runtime PM for NVIDIA USB xHCI Host Controller devices 16 | ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", TEST=="power/control", ATTR{power/control}="auto" 17 | # Enable runtime PM for NVIDIA USB Type-C UCSI devices 18 | ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c8000", TEST=="power/control", ATTR{power/control}="auto" 19 | 20 | # Disable runtime PM for NVIDIA VGA/3D controller devices 21 | ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x03[0-9]*", TEST=="power/control", ATTR{power/control}="on" 22 | # Disable runtime PM for NVIDIA Audio devices 23 | ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", TEST=="power/control", ATTR{power/control}="on" 24 | # Disable runtime PM for NVIDIA USB xHCI Host Controller devices 25 | ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", TEST=="power/control", ATTR{power/control}="on" 26 | # Disable runtime PM for NVIDIA USB Type-C UCSI devices 27 | ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c8000", TEST=="power/control", ATTR{power/control}="on" 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Nvidia driver latest to 396 series AIO installer 2 | 3 | LIBGLVND compatible, with 32 bit libs and DKMS enabled out of the box (you will still be asked if you want to use the regular package). Installs for all currently installed kernels. Comes with custom patches to enhance kernel compatibility, dynamically applied when you're requesting a driver that's not compatible OOTB with your currently installed kernel(s). 4 | Unwanted packages can be disabled with switches in the PKGBUILD. Defaults to complete installation. 5 | 6 | Huge thanks to Isaak I. Aleksandrov who has been much faster at offering compat patches than myself for a good while now! https://gitlab.com/EULA 7 | 8 | You may need/want to add a pacman hook for nvidia depending on your setup : https://wiki.archlinux.org/index.php/NVIDIA#DRM_kernel_mode_setting 9 | 10 | Vulkan dev drivers : https://developer.nvidia.com/vulkan-driver 11 | 12 | Regular drivers : https://www.nvidia.com/object/unix.html 13 | 14 | ## Note regarding 470 series 15 | 16 | **Nvidia's support for Kepler GPUs ended on September 2024 ( see https://nvidia.custhelp.com/app/answers/detail/a_id/5202 ), so 470 series is unlikely to be updated going forward. As a result using a LTS kernel is recommended/needed to prevent issues (<=6.6.y).** 17 | 18 | ## How to run the installer 19 | ``` 20 | git clone https://github.com/Frogging-Family/nvidia-all.git 21 | cd nvidia-all 22 | makepkg -si 23 | ``` 24 | Then follow the prompts. 25 | 26 | ### To update the installer 27 | ``` 28 | cd nvidia-all 29 | git pull 30 | makepkg -si 31 | ``` 32 | Then follow the prompts as before. 33 | 34 | ## How to uninstall and revert to distro provided packages 35 | For arch and its derivatives you can uninstall using: 36 | ``` 37 | sudo pacman -Rdd lib32-nvidia-utils-tkg lib32-opencl-nvidia-tkg nvidia-dkms-tkg nvidia-egl-wayland-tkg nvidia-settings-tkg nvidia-utils-tkg opencl-nvidia-tkg 38 | ``` 39 | And install the distro dkms packages: 40 | 41 | ``` 42 | sudo pacman -S nvidia-dkms egl-wayland lib32-nvidia-utils lib32-opencl-nvidia nvidia-settings opencl-nvidia nvidia-utils 43 | ``` 44 | Alternatively install the dkms open kernel modules (Turing or newer hardware only!!!) with: 45 | ``` 46 | sudo pacman -S nvidia-open-dkms egl-wayland lib32-nvidia-utils lib32-opencl-nvidia nvidia-settings opencl-nvidia nvidia-utils 47 | ``` 48 | After installing the drivers provided by your distro everything should function as normal after a reboot. 49 | # DKMS or regular? 50 | DKMS is recommended as it allows for automatic module rebuilding on kernel updates. As long as you're on the same major version (5.8.x for example), you won't need to regenerate the packages on updates, which is a huge QoL feature. Regular modules can also be problematic on Manjaro due to differences in kernel hooking mechanisms compared to Arch. So if in doubt, go DKMS. 51 | 52 | 53 | ## My DKMS driver installed with kernel X.1 doesn't work/build anymore after I upgraded to kernel X.2! Help! 54 | - Simply rebuild the packages so the script can detect your currently installed kernel(s) and patch your driver accordingly to fix compatibility issues. 55 | 56 | # How to generate a package for a driver that isn't listed (390 and lower branches are not supported) : 57 | - When you are prompted for driver version, select "custom" (choice 6). 58 | - You'll then be asked the branch group. Select either "Vulkan dev" (choice 2) for Vulkan dev drivers or "stable or regular beta" (choice 1) for every other driver. 59 | - Now you have to enter the version number of the desired driver. Vulkan dev drivers version is usually formatted as `mainbranch.version.subversion` (i.e.: 415.22.01) while the stable or regular beta drivers version is usually (but not always) `mainbranch.version` (i.e.: 415.25) 60 | - To finish, you'll be asked if you want dkms(recommended) or regular modules, similarly to the usual drivers versions. 61 | 62 | # Optimus users : 63 | - A great tool exists for you and works with these nvidia-all packages: https://github.com/Askannz/optimus-manager 64 | - 435.17 beta has introduced PRIME render offload support. You can learn more about the needed setup here: http://us.download.nvidia.com/XFree86/Linux-x86_64/435.17/README/primerenderoffload.html 65 | 66 | # Mostlyportable-gcc users : 67 | - For non-dkms nvidia-all packages, setting your `CUSTOM_GCC_PATH` in .cfg is enough. 68 | - For dkms nvidia-all packages, you'll need to make DKMS aware of your mostlyportable-gcc build. See: https://github.com/Tk-Glitch/PKGBUILDS/issues/334#issuecomment-537197636 69 | -------------------------------------------------------------------------------- /customization.cfg: -------------------------------------------------------------------------------- 1 | # nvidia-all config file 2 | 3 | 4 | #### OPTIONS #### 5 | 6 | # External config file to use - If the given file exists in path, it will override default config (customization.cfg) - Default is ~/.config/frogminer/nvidia-all.cfg 7 | _EXT_CONFIG_PATH=~/.config/frogminer/nvidia-all.cfg 8 | 9 | # Custom compiler root dirs - For non-dkms builds (see readme to use this with dkms) - Leave empty to use system compilers 10 | # ! If your kernel was built with mostlyportable GCC, you need to use the exact same build here or module compilation will fail ! 11 | # Example: CUSTOM_GCC_PATH="/home/frog/PKGBUILDS/mostlyportable-gcc/gcc-mostlyportable-9.2.0" 12 | CUSTOM_GCC_PATH="" 13 | 14 | # Set to "true" to add driver series versioning to package name. For repo owners wanting to store multiple series at once. 15 | _series_in_pkgname="" 16 | 17 | # Allows enforcing kernel patches application for a target kernel, independently of currently installed ones (example: "5.5") 18 | # You typically don't want to use this as a user. The proper way it to install your kernel(s), then run makepkg against nvidia-all's PKGBUILD to get things autodetected. 19 | _kerneloverride="" 20 | 21 | # Put the built packages in a versioned dir in the same folder as the nvidia-all PKGBUILD on exit - Will fail to install if running makepkg with -i option 22 | _local_package_storing="false" 23 | 24 | # If you want to ignore some packages, set them to "false". Default is all set to "true" for a complete installation. 25 | _lib32="true" 26 | _opencl="true" 27 | _nvsettings="true" 28 | 29 | # Set _eglwayland to "true" to create egl-wayland package using Nvidia's tarball - conflicts with Arch's egl-wayland package 30 | # Set _eglwayland to "false" to skip egl-wayland package creation and not depend on the Arch provided egl-wayland package 31 | # Set _eglwayland to "external" to use the Arch provided egl-wayland package (default) 32 | _eglwayland="external" 33 | 34 | # Set _eglgbm to "true" to add egl-gbm binaries to the egl-wayland package using Nvidia's tarball - conflicts with Arch's egl-gbm package 35 | # Set _eglgbm to "false" to skip Nvidia's tarball egl-gbm binaries and not depend on the Arch provided egl-gbm package 36 | # Set _eglgbm to "external" to use the Arch provided egl-gbm package (default) 37 | # Depends on _eglwayland="external" 38 | _eglgbm="external" 39 | 40 | # Either "vulkandev" for vulkan developer drivers or "regular" for all others 41 | _driver_branch="" 42 | 43 | # Desired driver version - !! needs to be available from the selected branch above !! 44 | # Set to "latest" to use the latest driver on the selected branch. 45 | _driver_version="" 46 | 47 | # Set to "true" to build open source modules if available, or leave empty to get a prompt 48 | # Available for 515.43.04 beta or newer only 49 | _open_source_modules="" 50 | 51 | # Set to "true" to blacklist nouveau. may be needed early kms on nvidia. 52 | # if you on like prime system, and not need nvidia module on startup, then can false. 53 | # (default true) 54 | _blacklist_nouveau="" 55 | 56 | # Only updates if there is a newer version available 57 | # Semi-hack, compares version-strings as strings, i.e. if "460.39" > "455.45.01" update etc 58 | # Set to "true" to enable 59 | _only_update_if_newer="" 60 | 61 | # Set to "true" to use DKMS or "false" to use regular modules. You can also use "full" to build both dkms and regular packages (don't use it if you don't know you need it!). 62 | _dkms="" 63 | 64 | # Enable GCC 15 fixup patch 65 | _gcc15_fix="true" 66 | 67 | 68 | ## LEGACY OPTIONS 69 | 70 | # Enable GCC 14 fixup patch - Allows older branches to build on GCC14 71 | _gcc14_fix="false" 72 | 73 | # Attempt at fixing PRIME sync on kernel 5.4 and 5.5rc - https://devtalk.nvidia.com/default/topic/1068045/linux/5-4-kernel-breaks-prime-synchronization-/post/5416631/#5416631 74 | _54_prime_fixing_attempt="false" 75 | 76 | # Fix for https://bugs.archlinux.org/task/62142 affecting SLi configs 77 | _62142_fix="false" 78 | -------------------------------------------------------------------------------- /patches/01-ipmi-vm.diff: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh 2 | index e8de161..04d6683 100755 3 | --- a/kernel-dkms/conftest.sh 4 | +++ b/kernel-dkms/conftest.sh 5 | @@ -1780,11 +1780,14 @@ compile_test() { 6 | # Determine if atomic64_t and associated functions are defined 7 | CODE=" 8 | #include 9 | + #include 10 | void conftest_atomic64(void) { 11 | atomic64_t data; 12 | atomic64_read(&data); 13 | atomic64_set(&data, 0); 14 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0) 15 | atomic64_inc(&data); 16 | +#endif 17 | }" 18 | 19 | compile_check_conftest "$CODE" "NV_ATOMIC64_PRESENT" "" "types" 20 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-gem-nvkms-memory.c b/kernel-dkms/nvidia-drm/nvidia-drm-gem-nvkms-memory.c 21 | index 1db7777..863bb77 100644 22 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-gem-nvkms-memory.c 23 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-gem-nvkms-memory.c 24 | @@ -345,7 +347,11 @@ static int __nv_drm_vma_fault(struct vm_area_struct *vma, 25 | 26 | page_offset = vmf->pgoff - drm_vma_node_start(&gem->vma_node); 27 | 28 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 19, 0) 29 | ret = vm_insert_pfn(vma, address, pfn + page_offset); 30 | +#else 31 | + ret = vmf_insert_pfn(vma, address, pfn + page_offset); 32 | +#endif 33 | 34 | switch (ret) { 35 | case 0: 36 | --- a/kernel-dkms/nvidia/os-interface.c 2018-11-15 21:56:59.000000000 -0600 37 | +++ b/kernel-dkms/nvidia/os-interface.c 2018-11-26 21:53:39.970635906 -0600 38 | @@ -1670,7 +1670,7 @@ 39 | 40 | struct nv_ipmi_softc 41 | { 42 | - ipmi_user_t p_user; // ptr to ipmi_msghandler user structure 43 | + struct ipmi_user *p_user; 44 | spinlock_t msg_lock; 45 | struct list_head msgs; 46 | NvU32 seqNum; //request sequence number 47 | @@ -1679,7 +1679,7 @@ 48 | static inline int 49 | nv_ipmi_set_my_address 50 | ( 51 | - ipmi_user_t user, 52 | + struct ipmi_user *user, 53 | unsigned char address 54 | ) 55 | { 56 | -------------------------------------------------------------------------------- /patches/02-ipmi-vm.diff: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/nvidia/linux_nvswitch.c b/kernel-dkms/nvidia/linux_nvswitch.c 2 | index 75b5598..9841775 100644 3 | --- a/kernel-dkms/nvidia/linux_nvswitch.c 4 | +++ b/kernel-dkms/nvidia/linux_nvswitch.c 5 | @@ -1582,7 +1582,11 @@ nvswitch_os_snprintf_time 6 | struct tm t; 7 | NvS32 date_end; 8 | 9 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 19, 0) 10 | time_to_tm(time_nsec / NVSWITCH_NSEC_PER_SEC, 0, &t); 11 | +#else 12 | + time64_to_tm(time_nsec / NVSWITCH_NSEC_PER_SEC, 0, &t); 13 | +#endif 14 | 15 | date_end = snprintf(date, 16 | date_len, 17 | -------------------------------------------------------------------------------- /patches/455-crashfix.diff: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/nvidia-modeset/nvidia-modeset-linux.c b/kernel-dkms/nvidia-modeset/nvidia-modeset-linux.c 2 | index ffbbeb9..2302541 100644 3 | --- a/kernel-dkms/nvidia-modeset/nvidia-modeset-linux.c 4 | +++ b/kernel-dkms/nvidia-modeset/nvidia-modeset-linux.c 5 | @@ -21,6 +21,8 @@ 6 | #include 7 | #include 8 | #include 9 | +#include 10 | +#include 11 | 12 | #include "nvstatus.h" 13 | 14 | @@ -169,8 +171,9 @@ static inline void nvkms_write_unlock_pm_lock(void) 15 | * are called while nvkms_lock is held. 16 | *************************************************************************/ 17 | 18 | -/* Don't use kmalloc for allocations larger than 128k */ 19 | -#define KMALLOC_LIMIT (128 * 1024) 20 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0) 21 | +/* Don't use kmalloc for allocations larger than PAGE_SIZE */ 22 | +#define KMALLOC_LIMIT (PAGE_SIZE) 23 | 24 | void* NVKMS_API_CALL nvkms_alloc(size_t size, NvBool zero) 25 | { 26 | @@ -197,6 +200,19 @@ void NVKMS_API_CALL nvkms_free(void *ptr, size_t size) 27 | vfree(ptr); 28 | } 29 | } 30 | +#else 31 | +void* NVKMS_API_CALL nvkms_alloc(size_t size, NvBool zero) 32 | +{ 33 | + if (zero) 34 | + return kvzalloc(size, GFP_KERNEL); 35 | + return kvmalloc(size, GFP_KERNEL); 36 | +} 37 | + 38 | +void NVKMS_API_CALL nvkms_free(void *ptr, size_t size) 39 | +{ 40 | + kvfree(ptr); 41 | +} 42 | +#endif 43 | 44 | void* NVKMS_API_CALL nvkms_memset(void *ptr, NvU8 c, size_t size) 45 | { 46 | -------------------------------------------------------------------------------- /patches/5.11-legacy.diff: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/common/inc/nv-linux.h b/kernel-dkms/common/inc/nv-linux.h 2 | index db9706d..3ee157e 100644 3 | --- a/kernel-dkms/common/inc/nv-linux.h 4 | +++ b/kernel-dkms/common/inc/nv-linux.h 5 | @@ -117,7 +117,9 @@ 6 | 7 | #include /* module_param() */ 8 | #include /* flush_tlb(), flush_tlb_all() */ 9 | +#if defined(NV_ASM_KMAP_TYPES_H_PRESENT) 10 | #include /* page table entry lookup */ 11 | +#endif 12 | 13 | #include /* pci_find_class, etc */ 14 | #include /* tasklets, interrupt helpers */ 15 | -------------------------------------------------------------------------------- /patches/5.6-ioremap.diff: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/common/inc/nv-linux.h b/kernel-dkms/common/inc/nv-linux.h 2 | index e235842..805e525 100644 3 | --- a/kernel-dkms/common/inc/nv-linux.h 4 | +++ b/kernel-dkms/common/inc/nv-linux.h 5 | @@ -531,7 +531,11 @@ static inline void *nv_ioremap(NvU64 phys, NvU64 size) 6 | 7 | static inline void *nv_ioremap_nocache(NvU64 phys, NvU64 size) 8 | { 9 | +#if defined(NV_IOREMAP_NOCACHE_PRESENT) 10 | void *ptr = ioremap_nocache(phys, size); 11 | +#else 12 | + void *ptr = ioremap(phys, size); 13 | +#endif 14 | if (ptr) 15 | NV_MEMDBG_ADD(ptr, size); 16 | return ptr; 17 | diff --git a/kernel-dkms/nvidia/nvidia.Kbuild b/kernel-dkms/nvidia/nvidia.Kbuild 18 | index 5ec3e65..2897e31 100644 19 | --- a/kernel-dkms/nvidia/nvidia.Kbuild 20 | +++ b/kernel-dkms/nvidia/nvidia.Kbuild 21 | @@ -104,6 +104,7 @@ NV_CONFTEST_FUNCTION_COMPILE_TESTS += set_memory_array_uc 22 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += acquire_console_sem 23 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += console_lock 24 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += ioremap_cache 25 | +NV_CONFTEST_FUNCTION_COMPILE_TESTS += ioremap_nocache 26 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += ioremap_wc 27 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += acpi_walk_namespace 28 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += sg_alloc_table 29 | diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh 30 | index 57d85a4..4902248 100755 31 | --- a/kernel-dkms/conftest.sh 32 | +++ b/kernel-dkms/conftest.sh 33 | @@ -780,6 +780,22 @@ compile_test() { 34 | compile_check_conftest "$CODE" "NV_IOREMAP_CACHE_PRESENT" "" "functions" 35 | ;; 36 | 37 | + ioremap_nocache) 38 | + # 39 | + # Determine if the ioremap_nocache() function is present. 40 | + # 41 | + # Removed by commit 4bdc0d676a64 ("remove ioremap_nocache and 42 | + # devm_ioremap_nocache") in v5.6 (2020-01-06) 43 | + # 44 | + CODE=" 45 | + #include 46 | + void conftest_ioremap_nocache(void) { 47 | + ioremap_nocache(); 48 | + }" 49 | + 50 | + compile_check_conftest "$CODE" "NV_IOREMAP_NOCACHE_PRESENT" "" "functions" 51 | + ;; 52 | + 53 | ioremap_wc) 54 | # 55 | # Determine if the ioremap_wc() function is present. 56 | -------------------------------------------------------------------------------- /patches/5.6-legacy-includes.diff: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-gem-nvkms-memory.c b/kernel-dkms/nvidia-drm/nvidia-drm-gem-nvkms-memory.c 2 | index b9cdaae..c73ed43 100644 3 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-gem-nvkms-memory.c 4 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-gem-nvkms-memory.c 5 | @@ -31,6 +31,8 @@ 6 | #include 7 | #endif 8 | 9 | +#include 10 | + 11 | #include "nv-mm.h" 12 | 13 | static void __nv_drm_gem_nvkms_memory_free(struct nv_drm_gem_object *nv_gem) 14 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-linux.c b/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 15 | index 650b96d..1d3e658 100644 16 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 17 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 18 | @@ -35,6 +35,8 @@ 19 | #include 20 | #endif 21 | 22 | +#include 23 | + 24 | #include "nv-mm.h" 25 | 26 | MODULE_PARM_DESC( 27 | 28 | 29 | -------------------------------------------------------------------------------- /patches/5.8-legacy.diff: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/common/inc/nv-linux.h b/kernel-dkms/common/inc/nv-linux.h 2 | index 70d336d..c31ec94 100644 3 | --- a/kernel-dkms/common/inc/nv-linux.h 4 | +++ b/kernel-dkms/common/inc/nv-linux.h 5 | @@ -509,7 +509,13 @@ extern NvBool nvos_is_chipset_io_coherent(void); 6 | 7 | static inline void *nv_vmalloc(unsigned long size) 8 | { 9 | +#if NV_VMALLOC_ARGUMENT_COUNT_ARGUMENT_COUNT == 3 10 | void *ptr = __vmalloc(size, GFP_KERNEL, PAGE_KERNEL); 11 | +#elif NV_VMALLOC_ARGUMENT_COUNT_ARGUMENT_COUNT == 2 12 | + void *ptr = __vmalloc(size, GFP_KERNEL); 13 | +#else 14 | +#error "NV_VMALLOC_ARGUMENT_COUNT_ARGUMENT_COUNT value unrecognized!" 15 | +#endif 16 | if (ptr) 17 | NV_MEMDBG_ADD(ptr, size); 18 | return ptr; 19 | -------------------------------------------------------------------------------- /patches/5.9-gpl.diff: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/nvidia-modeset/nvidia-modeset-linux.c b/kernel-dkms/nvidia-modeset/nvidia-modeset-linux.c 2 | index ffbbeb9..60c9787 100644 3 | --- a/kernel-dkms/nvidia-modeset/nvidia-modeset-linux.c 4 | +++ b/kernel-dkms/nvidia-modeset/nvidia-modeset-linux.c 5 | @@ -1401,11 +1401,11 @@ restart: 6 | 7 | module_init(nvkms_init); 8 | module_exit(nvkms_exit); 9 | 10 | #if defined(MODULE_LICENSE) 11 | - MODULE_LICENSE("NVIDIA"); 12 | + MODULE_LICENSE("GPL"); 13 | #endif 14 | #if defined(MODULE_INFO) 15 | MODULE_INFO(supported, "external"); 16 | #endif 17 | #if defined(MODULE_VERSION) 18 | diff --git a/kernel-dkms/nvidia/nv-frontend.c b/kernel-dkms/nvidia/nv-frontend.c 19 | index 45d91b3..244a7a8 100644 20 | --- a/kernel-dkms/nvidia/nv-frontend.c 21 | +++ b/kernel-dkms/nvidia/nv-frontend.c 22 | @@ -13,11 +13,11 @@ 23 | #include "nv-linux.h" 24 | #include "nv-reg.h" 25 | #include "nv-frontend.h" 26 | 27 | #if defined(MODULE_LICENSE) 28 | -MODULE_LICENSE("NVIDIA"); 29 | +MODULE_LICENSE("GPL"); 30 | #endif 31 | #if defined(MODULE_INFO) 32 | MODULE_INFO(supported, "external"); 33 | #endif 34 | #if defined(MODULE_VERSION) 35 | -------------------------------------------------------------------------------- /patches/6.1-6-7-8-gpl.diff: -------------------------------------------------------------------------------- 1 | linux-6.1.76, 6.6.15, and 6.7.3 have modified the non-ARCH-specific 2 | pfn_valid() to use __rcu_read_lock/unlock[1] that is marked GPL and 3 | cannot be used here[2][3][4] unless use the open source variant. 4 | 5 | As a workaround, reuse the old implementation until NVIDIA makes 6 | a fixed release (due to no longer be using pfn_valid[5], likely 7 | with its own implementation similarly to this patch). 8 | 9 | Safe to use with kernel >=5.15 or so but older ones had a different 10 | pfn_valid implementation. However 5.15 and older branches are 11 | "currently" not affected, so simply limit to >=6.1.76. 12 | 13 | [1] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/include/linux/mmzone.h?h=v6.7.3&id=3a01daace71b521563c38bbbf874e14c3e58adb7 14 | [2] https://bugs.gentoo.org/923456 15 | [3] https://forums.developer.nvidia.com/t/280908 16 | [4] https://github.com/NVIDIA/open-gpu-kernel-modules/issues/594 17 | [5] https://github.com/NVIDIA/open-gpu-kernel-modules/issues/594#issuecomment-1916197641 18 | --- a/kernel-dkms/common/inc/nv-linux.h 19 | +++ b/kernel-dkms/common/inc/nv-linux.h 20 | @@ -1990,2 +1990,23 @@ 21 | 22 | +#if defined(CONFIG_HAVE_ARCH_PFN_VALID) || LINUX_VERSION_CODE < KERNEL_VERSION(6,1,76) 23 | +# define nv_pfn_valid pfn_valid 24 | +#else 25 | +/* pre-6.1.76 kernel pfn_valid version without GPL rcu_read_lock/unlock() */ 26 | +static inline int nv_pfn_valid(unsigned long pfn) 27 | +{ 28 | + struct mem_section *ms; 29 | + 30 | + if (PHYS_PFN(PFN_PHYS(pfn)) != pfn) 31 | + return 0; 32 | + 33 | + if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS) 34 | + return 0; 35 | + 36 | + ms = __pfn_to_section(pfn); 37 | + if (!valid_section(ms)) 38 | + return 0; 39 | + 40 | + return early_section(ms) || pfn_section_valid(ms, pfn); 41 | +} 42 | +#endif 43 | #endif /* _NV_LINUX_H_ */ 44 | --- a/kernel-dkms/nvidia/nv-mmap.c 45 | +++ b/kernel-dkms/nvidia/nv-mmap.c 46 | @@ -576,3 +576,3 @@ 47 | if (!IS_REG_OFFSET(nv, access_start, access_len) && 48 | - (pfn_valid(PFN_DOWN(mmap_start)))) 49 | + (nv_pfn_valid(PFN_DOWN(mmap_start)))) 50 | { 51 | --- a/kernel-dkms/nvidia/os-mlock.c 52 | +++ b/kernel-dkms/nvidia/os-mlock.c 53 | @@ -102,3 +102,3 @@ 54 | if ((nv_follow_pfn(vma, (start + (i * PAGE_SIZE)), &pfn) < 0) || 55 | - (!pfn_valid(pfn))) 56 | + (!nv_pfn_valid(pfn))) 57 | { 58 | @@ -176,3 +176,3 @@ 59 | 60 | - if (pfn_valid(pfn)) 61 | + if (nv_pfn_valid(pfn)) 62 | { 63 | -------------------------------------------------------------------------------- /patches/6.11-fbdev.diff: -------------------------------------------------------------------------------- 1 | From 772eaa91e1e79fb0a4a7e9d80abd99db7a0c0b61 Mon Sep 17 00:00:00 2001 2 | From: Peter Jung 3 | Date: Thu, 26 Sep 2024 14:52:57 +0200 4 | Subject: [PATCH 4/5] 6.11: Add fix for fbdev 5 | 6 | --- 7 | kernel/conftest.sh | 23 ++++++++++++++++++- 8 | kernel/header-presence-tests.mk | 1 + 9 | kernel/nvidia-drm/nvidia-drm-drv.c | 22 +++++++++++------- 10 | kernel/nvidia-drm/nvidia-drm-linux.c | 2 +- 11 | .../nvidia-drm/nvidia-drm-os-interface.h | 8 ++++++- 12 | kernel/nvidia-drm/nvidia-drm-sources.mk | 1 + 13 | 6 files changed, 46 insertions(+), 11 deletions(-) 14 | 15 | diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh 16 | index 1226cea2..4a239e63 100755 17 | --- a/kernel-dkms/conftest.sh 18 | +++ b/kernel-dkms/conftest.sh 19 | @@ -6596,7 +6596,9 @@ compile_test() { 20 | # Determine whether drm_fbdev_generic_setup is present. 21 | # 22 | # Added by commit 9060d7f49376 ("drm/fb-helper: Finish the 23 | - # generic fbdev emulation") in v4.19. 24 | + # generic fbdev emulation") in v4.19. Removed by commit 25 | + # aae4682e5d66 ("drm/fbdev-generic: Convert to fbdev-ttm") 26 | + # in v6.11. 27 | # 28 | CODE=" 29 | #include 30 | @@ -6610,6 +6612,25 @@ compile_test() { 31 | compile_check_conftest "$CODE" "NV_DRM_FBDEV_GENERIC_SETUP_PRESENT" "" "functions" 32 | ;; 33 | 34 | + drm_fbdev_ttm_setup) 35 | + # 36 | + # Determine whether drm_fbdev_ttm_setup is present. 37 | + # 38 | + # Added by commit aae4682e5d66 ("drm/fbdev-generic: 39 | + # Convert to fbdev-ttm") in v6.11. 40 | + # 41 | + CODE=" 42 | + #include 43 | + #if defined(NV_DRM_DRM_FBDEV_TTM_H_PRESENT) 44 | + #include 45 | + #endif 46 | + void conftest_drm_fbdev_ttm_setup(void) { 47 | + drm_fbdev_ttm_setup(); 48 | + }" 49 | + 50 | + compile_check_conftest "$CODE" "NV_DRM_FBDEV_TTM_SETUP_PRESENT" "" "functions" 51 | + ;; 52 | + 53 | drm_aperture_remove_conflicting_pci_framebuffers) 54 | # 55 | # Determine whether drm_aperture_remove_conflicting_pci_framebuffers is present. 56 | diff --git a/kernel-dkms/header-presence-tests.mk b/kernel-dkms/header-presence-tests.mk 57 | index e8d2e02b..40204ae4 100644 58 | --- a/kernel-dkms/header-presence-tests.mk 59 | +++ b/kernel-dkms/header-presence-tests.mk 60 | @@ -15,6 +15,7 @@ NV_HEADER_PRESENCE_TESTS = \ 61 | drm/drm_atomic_uapi.h \ 62 | drm/drm_drv.h \ 63 | drm/drm_fbdev_generic.h \ 64 | + drm/drm_fbdev_ttm.h \ 65 | drm/drm_framebuffer.h \ 66 | drm/drm_connector.h \ 67 | drm/drm_probe_helper.h \ 68 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 69 | index 359ff0c4..50028c26 100644 70 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 71 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 72 | @@ -64,12 +64,14 @@ 73 | #include 74 | #endif 75 | 76 | -#if defined(NV_DRM_FBDEV_GENERIC_AVAILABLE) 77 | +#if defined(NV_DRM_FBDEV_AVAILABLE) 78 | #include 79 | #include 80 | #endif 81 | 82 | -#if defined(NV_DRM_DRM_FBDEV_GENERIC_H_PRESENT) 83 | +#if defined(NV_DRM_DRM_FBDEV_TTM_H_PRESENT) 84 | +#include 85 | +#elif defined(NV_DRM_DRM_FBDEV_GENERIC_H_PRESENT) 86 | #include 87 | #endif 88 | 89 | @@ -476,7 +478,7 @@ static int nv_drm_load(struct drm_device *dev, unsigned long flags) 90 | return -ENODEV; 91 | } 92 | 93 | -#if defined(NV_DRM_FBDEV_GENERIC_AVAILABLE) 94 | +#if defined(NV_DRM_FBDEV_AVAILABLE) 95 | /* 96 | * If fbdev is enabled, take modeset ownership now before other DRM clients 97 | * can take master (and thus NVKMS ownership). 98 | @@ -610,7 +612,7 @@ static void __nv_drm_unload(struct drm_device *dev) 99 | 100 | /* Release modeset ownership if fbdev is enabled */ 101 | 102 | -#if defined(NV_DRM_FBDEV_GENERIC_AVAILABLE) 103 | +#if defined(NV_DRM_FBDEV_AVAILABLE) 104 | if (nv_dev->hasFramebufferConsole) { 105 | drm_atomic_helper_shutdown(dev); 106 | nvKms->releaseOwnership(nv_dev->pDevice); 107 | @@ -1838,7 +1840,7 @@ void nv_drm_register_drm_device(const nv_gpu_info_t *gpu_info) 108 | goto failed_drm_register; 109 | } 110 | 111 | -#if defined(NV_DRM_FBDEV_GENERIC_AVAILABLE) 112 | +#if defined(NV_DRM_FBDEV_AVAILABLE) 113 | if (nv_drm_fbdev_module_param && 114 | drm_core_check_feature(dev, DRIVER_MODESET)) { 115 | 116 | @@ -1851,9 +1853,13 @@ void nv_drm_register_drm_device(const nv_gpu_info_t *gpu_info) 117 | drm_aperture_remove_conflicting_pci_framebuffers(pdev, nv_drm_driver.name); 118 | #endif 119 | } 120 | + #if defined(NV_DRM_FBDEV_TTM_AVAILABLE) 121 | + drm_fbdev_ttm_setup(dev, 32); 122 | + #elif defined(NV_DRM_FBDEV_GENERIC_AVAILABLE) 123 | drm_fbdev_generic_setup(dev, 32); 124 | + #endif 125 | } 126 | -#endif /* defined(NV_DRM_FBDEV_GENERIC_AVAILABLE) */ 127 | +#endif /* defined(NV_DRM_FBDEV_AVAILABLE) */ 128 | 129 | /* Add NVIDIA-DRM device into list */ 130 | 131 | @@ -1995,12 +2001,12 @@ void nv_drm_suspend_resume(NvBool suspend) 132 | 133 | if (suspend) { 134 | drm_kms_helper_poll_disable(dev); 135 | -#if defined(NV_DRM_FBDEV_GENERIC_AVAILABLE) 136 | +#if defined(NV_DRM_FBDEV_AVAILABLE) 137 | drm_fb_helper_set_suspend_unlocked(dev->fb_helper, 1); 138 | #endif 139 | drm_mode_config_reset(dev); 140 | } else { 141 | -#if defined(NV_DRM_FBDEV_GENERIC_AVAILABLE) 142 | +#if defined(NV_DRM_FBDEV_AVAILABLE) 143 | drm_fb_helper_set_suspend_unlocked(dev->fb_helper, 0); 144 | #endif 145 | drm_kms_helper_poll_enable(dev); 146 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-linux.c b/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 147 | index c7f4a239..83d40983 100644 148 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 149 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 150 | @@ -34,7 +34,7 @@ MODULE_PARM_DESC( 151 | "Enable atomic kernel modesetting (1 = enable (default), 0 = disable)"); 152 | module_param_named(modeset, nv_drm_modeset_module_param, bool, 0400); 153 | 154 | -#if defined(NV_DRM_FBDEV_GENERIC_AVAILABLE) 155 | +#if defined(NV_DRM_FBDEV_AVAILABLE) 156 | MODULE_PARM_DESC( 157 | fbdev, 158 | "Create a framebuffer device (1 = enable (default), 0 = disable) (EXPERIMENTAL)"); 159 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-os-interface.h b/kernel-dkms/nvidia-drm/nvidia-drm-os-interface.h 160 | index 6f8cfea9..a6b0f947 100644 161 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-os-interface.h 162 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-os-interface.h 163 | @@ -59,14 +59,20 @@ typedef struct nv_timer nv_drm_timer; 164 | #endif 165 | 166 | #if defined(NV_DRM_FBDEV_GENERIC_SETUP_PRESENT) && defined(NV_DRM_APERTURE_REMOVE_CONFLICTING_PCI_FRAMEBUFFERS_PRESENT) 167 | +#define NV_DRM_FBDEV_AVAILABLE 168 | #define NV_DRM_FBDEV_GENERIC_AVAILABLE 169 | #endif 170 | 171 | +#if defined(NV_DRM_FBDEV_TTM_SETUP_PRESENT) && defined(NV_DRM_APERTURE_REMOVE_CONFLICTING_PCI_FRAMEBUFFERS_PRESENT) 172 | +#define NV_DRM_FBDEV_AVAILABLE 173 | +#define NV_DRM_FBDEV_TTM_AVAILABLE 174 | +#endif 175 | + 176 | struct page; 177 | 178 | /* Set to true when the atomic modeset feature is enabled. */ 179 | extern bool nv_drm_modeset_module_param; 180 | -#if defined(NV_DRM_FBDEV_GENERIC_AVAILABLE) 181 | +#if defined(NV_DRM_FBDEV_AVAILABLE) 182 | /* Set to true when the nvidia-drm driver should install a framebuffer device */ 183 | extern bool nv_drm_fbdev_module_param; 184 | #endif 185 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-sources.mk b/kernel-dkms/nvidia-drm/nvidia-drm-sources.mk 186 | index 7ef0c5b8..247096b7 100644 187 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-sources.mk 188 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-sources.mk 189 | @@ -67,6 +67,7 @@ NV_CONFTEST_FUNCTION_COMPILE_TESTS += fence_set_error 190 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += sync_file_get_fence 191 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_aperture_remove_conflicting_pci_framebuffers 192 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_fbdev_generic_setup 193 | +NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_fbdev_ttm_setup 194 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_connector_attach_hdr_output_metadata_property 195 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_helper_crtc_enable_color_mgmt 196 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_crtc_enable_color_mgmt 197 | -- 198 | 2.46.2 199 | 200 | -------------------------------------------------------------------------------- /patches/Add-IBT-support.diff: -------------------------------------------------------------------------------- 1 | From 1484c9ee0a60468dfd88954011fae0e28c0f73de Mon Sep 17 00:00:00 2001 2 | From: Peter Jung 3 | Date: Fri, 18 Oct 2024 22:40:58 +0200 4 | Subject: [PATCH 3/6] Add IBT support 5 | 6 | Signed-off-by: Peter Jung 7 | --- 8 | src/nvidia-modeset/Makefile | 1 + 9 | 1 file changed, 1 insertion(+) 10 | 11 | diff --git a/src/nvidia-modeset/Makefile b/src/nvidia-modeset/Makefile 12 | index 2b96f3fa..ed934014 100644 13 | --- a/src/nvidia-modeset/Makefile 14 | +++ b/src/nvidia-modeset/Makefile 15 | @@ -151,6 +151,7 @@ ifeq ($(TARGET_ARCH),x86_64) 16 | CONDITIONAL_CFLAGS += $(call TEST_CC_ARG, -fno-jump-tables) 17 | CONDITIONAL_CFLAGS += $(call TEST_CC_ARG, -mindirect-branch=thunk-extern) 18 | CONDITIONAL_CFLAGS += $(call TEST_CC_ARG, -mindirect-branch-register) 19 | + CONDITIONAL_CFLAGS += $(call TEST_CC_ARG, -mharden-sls=all) 20 | endif 21 | 22 | CFLAGS += $(CONDITIONAL_CFLAGS) 23 | -- 24 | 2.47.0 25 | 26 | -------------------------------------------------------------------------------- /patches/Enable-atomic-kernel-modesetting-by-default.diff: -------------------------------------------------------------------------------- 1 | From 69769b8ebaaeca84a5188330f80c460dcc0fa747 Mon Sep 17 00:00:00 2001 2 | From: Eric Naim 3 | Date: Fri, 24 Jan 2025 19:34:24 +0700 4 | Subject: [PATCH] Enable atomic kernel modesetting by default 5 | 6 | This is required for proper functionality under Wayland. fbdev has been default enabled since 570 so that 7 | hunk can be removed from this patch. 8 | 9 | Signed-off-by: Eric Naim 10 | --- 11 | nvidia-drm/nvidia-drm-linux.c | 2 +- 12 | nvidia-drm/nvidia-drm-os-interface.c | 2 +- 13 | 2 files changed, 2 insertions(+), 2 deletions(-) 14 | 15 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-linux.c b/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 16 | index 0007cbf..bd0b9eb 100644 17 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 18 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 19 | @@ -31,7 +31,7 @@ 20 | 21 | MODULE_PARM_DESC( 22 | modeset, 23 | - "Enable atomic kernel modesetting (1 = enable, 0 = disable (default))"); 24 | + "Enable atomic kernel modesetting (1 = enable (default), 0 = disable)"); 25 | module_param_named(modeset, nv_drm_modeset_module_param, bool, 0400); 26 | 27 | #if defined(NV_DRM_FBDEV_AVAILABLE) 28 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-os-interface.c b/kernel-dkms/nvidia-drm/nvidia-drm-os-interface.c 29 | index 7617476..f22afd7 100644 30 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-os-interface.c 31 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-os-interface.c 32 | @@ -41,7 +41,7 @@ 33 | #include 34 | #endif 35 | 36 | -bool nv_drm_modeset_module_param = false; 37 | +bool nv_drm_modeset_module_param = true; 38 | bool nv_drm_fbdev_module_param = true; 39 | 40 | void *nv_drm_calloc(size_t nmemb, size_t size) 41 | -- 42 | 2.48.1 43 | 44 | -------------------------------------------------------------------------------- /patches/GFP_RETRY_MAYFAIL-test.diff: -------------------------------------------------------------------------------- 1 | From 681303f341929adacb8fd493c501f3864716ae9c Mon Sep 17 00:00:00 2001 2 | From: Tk-Glitch 3 | Date: Mon, 9 Sep 2019 12:05:43 +0200 4 | Subject: nv-vm: Replace __GFP_NORETRY flag by __GFP_RETRY_MAYFAIL 5 | This is a test for DXVK issue #1100, suggested by NVIDIA. 6 | https://github.com/doitsujin/dxvk/issues/1100 7 | 8 | 9 | diff --git a/kernel-dkms/nvidia/nv-vm.c b/kernel-dkms/nvidia/nv-vm.c 10 | index 09cd39bda..e1fd7cfd2 100644 11 | --- a/kernel-dkms/nvidia/nv-vm.c 12 | +++ b/kernel-dkms/nvidia/nv-vm.c 13 | @@ -235,8 +235,8 @@ static unsigned int nv_compute_gfp_mask( 14 | gfp_mask = NV_GFP_DMA32; 15 | } 16 | } 17 | -#if defined(__GFP_NORETRY) 18 | - gfp_mask |= __GFP_NORETRY; 19 | +#if defined(__GFP_RETRY_MAYFAIL) 20 | + gfp_mask |= __GFP_RETRY_MAYFAIL; 21 | #endif 22 | #if defined(__GFP_ZERO) 23 | if (at->flags & NV_ALLOC_TYPE_ZEROED) 24 | -------------------------------------------------------------------------------- /patches/fix-hdmi-names.diff: -------------------------------------------------------------------------------- 1 | From 2585511f4d92c57a77f3c144c86ba30017df338c Mon Sep 17 00:00:00 2001 2 | From: Aaron Plattner 3 | Date: Fri, 4 Oct 2024 16:01:54 -0700 4 | Subject: [PATCH] nvkms: Sanitize & trim ELD product name strings 5 | 6 | --- 7 | src/nvidia-modeset/src/nvkms-hdmi.c | 26 ++++++-------------------- 8 | 1 file changed, 6 insertions(+), 20 deletions(-) 9 | 10 | diff --git a/src/nvidia-modeset/src/nvkms-hdmi.c b/src/nvidia-modeset/src/nvkms-hdmi.c 11 | index 1dbc6c482..963c47f6f 100644 12 | --- a/src/nvidia-modeset/src/nvkms-hdmi.c 13 | +++ b/src/nvidia-modeset/src/nvkms-hdmi.c 14 | @@ -1030,27 +1030,13 @@ static NvBool FillELDBuffer(const NVDpyEvoRec *pDpyEvo, 15 | 16 | if (status == NVT_STATUS_SUCCESS) { 17 | /* 18 | - * NvTiming_GetProductName() returns a nul-terminated string, but the 19 | - * string in the EDID is terminated with 0x0A and padded with 0x20. 20 | - * Put back these special characters. 21 | + * NvTiming_GetProductName returns a nul-terminated string. Figure out 22 | + * how long it is and copy the bytes up to, but not including, the nul 23 | + * terminator. 24 | */ 25 | - NvBool pastTerminator = FALSE; 26 | - NvU32 i; 27 | - 28 | - for (i = 0; i < NVT_EDID_LDD_PAYLOAD_SIZE; i++) { 29 | - if (pastTerminator) { 30 | - name[i] = 0x20; 31 | - } 32 | - if (name[i] == '\0') { 33 | - name[i] = 0x0A; 34 | - pastTerminator = TRUE; 35 | - } 36 | - } 37 | - 38 | - monitorNameLen = NVT_EDID_LDD_PAYLOAD_SIZE; 39 | - pEld->buffer[4] |= NVT_EDID_LDD_PAYLOAD_SIZE; 40 | - nvkms_memcpy(&pEld->buffer[20], name, 41 | - NVT_EDID_LDD_PAYLOAD_SIZE); 42 | + monitorNameLen = nvkms_strlen((char *)name); 43 | + pEld->buffer[4] |= monitorNameLen; 44 | + nvkms_memcpy(&pEld->buffer[20], name, monitorNameLen); 45 | } 46 | 47 | /* offset 20 + MNL ~ 20 + MNL + (3 * SAD_Count) - 1 : CEA_SADs */ 48 | -------------------------------------------------------------------------------- /patches/gcc-14-470.diff: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh 2 | --- a/kernel-dkms/conftest.sh 3 | +++ b/kernel-dkms/conftest.sh 4 | @@ -100,7 +100,8 @@ test_headers() { 5 | build_cflags() { 6 | BASE_CFLAGS="-O2 -D__KERNEL__ \ 7 | -DKBUILD_BASENAME=\"#conftest$$\" -DKBUILD_MODNAME=\"#conftest$$\" \ 8 | --nostdinc -isystem $ISYSTEM" 9 | +-nostdinc -isystem $ISYSTEM \ 10 | +-Wno-implicit-function-declaration -Wno-strict-prototypes -Wno-incompatible-pointer-types" 11 | 12 | if [ "$OUTPUT" != "$SOURCES" ]; then 13 | OUTPUT_CFLAGS="-I$OUTPUT/include2 -I$OUTPUT/include" 14 | -------------------------------------------------------------------------------- /patches/gcc-14.diff: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh 2 | --- a/kernel-dkms/conftest.sh 3 | +++ b/kernel-dkms/conftest.sh 4 | @@ -100,7 +100,7 @@ test_headers() { 5 | BASE_CFLAGS="-O2 -D__KERNEL__ \ 6 | -DKBUILD_BASENAME=\"#conftest$$\" -DKBUILD_MODNAME=\"#conftest$$\" \ 7 | -nostdinc -isystem $ISYSTEM \ 8 | --Wno-implicit-function-declaration -Wno-strict-prototypes" 9 | +-Wno-implicit-function-declaration -Wno-strict-prototypes -Wno-incompatible-pointer-types" 10 | 11 | if [ "$OUTPUT" != "$SOURCES" ]; then 12 | OUTPUT_CFLAGS="-I$OUTPUT/include2 -I$OUTPUT/include" 13 | -------------------------------------------------------------------------------- /patches/gcc-15.diff: -------------------------------------------------------------------------------- 1 | From 610f6f8a297e6d4b3457c46d73611edb9e46405c Mon Sep 17 00:00:00 2001 2 | From: Peter Jung 3 | Date: Tue, 29 Apr 2025 11:24:31 +0200 4 | Subject: [PATCH] CFLAGS: Set -std=gnu17 for all compilation flags 5 | 6 | GCC15 uses C23 by default, which breaks a lot of compatibility with the 7 | kernel and this module. Explicitly use -std=gnu17, which was the default in 8 | GCC14. 9 | 10 | Signed-off-by: Peter Jung 11 | Signed-off-by: Eric Naim 12 | --- 13 | kernel-dkms/Kbuild | 1 + 14 | kernel-dkms/conftest.sh | 4 ++-- 15 | 2 files changed, 3 insertions(+), 2 deletions(-) 16 | 17 | diff --git a/kernel-dkms/Kbuild b/kernel-dkms/Kbuild 18 | index bf06edb7..6cbc79d3 100644 19 | --- a/kernel-dkms/Kbuild 20 | +++ b/kernel-dkms/Kbuild 21 | @@ -82,6 +82,7 @@ $(foreach _module, $(NV_KERNEL_MODULES), \ 22 | # $(EXTRA_CFLAGS) to ccflags-y for compatibility. 23 | # 24 | 25 | +EXTRA_CFLAGS += -std=gnu17 26 | EXTRA_CFLAGS += -I$(src)/common/inc 27 | EXTRA_CFLAGS += -I$(src) 28 | EXTRA_CFLAGS += -Wall $(DEFINES) $(INCLUDES) -Wno-cast-qual -Wno-format-extra-args 29 | diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh 30 | index 20f694ec..0019e67c 100755 31 | --- a/kernel-dkms/conftest.sh 32 | +++ b/kernel-dkms/conftest.sh 33 | @@ -69,7 +69,7 @@ test_header_presence() { 34 | # NV_LINUX_FENCE_H_PRESENT, and that is either defined or undefined, in the 35 | # output (which goes to stdout, just like the rest of this file). 36 | 37 | - TEST_CFLAGS="-E -M $CFLAGS" 38 | + TEST_CFLAGS="-std=gnu17 -E -M $CFLAGS" 39 | 40 | file="$1" 41 | file_define=NV_`echo $file | tr '/.-' '___' | tr 'a-z' 'A-Z'`_PRESENT 42 | @@ -94,7 +94,7 @@ test_header_presence() { 43 | 44 | build_cflags() { 45 | ISYSTEM=`$CC -print-file-name=include 2> /dev/null` 46 | - BASE_CFLAGS="-O2 -D__KERNEL__ \ 47 | + BASE_CFLAGS="-std=gnu17 -O2 -D__KERNEL__ \ 48 | -DKBUILD_BASENAME=\"#conftest$$\" -DKBUILD_MODNAME=\"#conftest$$\" \ 49 | -nostdinc -isystem $ISYSTEM \ 50 | -Wno-implicit-function-declaration -Wno-strict-prototypes" 51 | -------------------------------------------------------------------------------- /patches/kernel-4.16.patch: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/common/inc/nv-linux.h b/kernel-dkms/common/inc/nv-linux.h 2 | index 10fc418..22ef968 100644 3 | --- a/kernel-dkms/common/inc/nv-linux.h 4 | +++ b/kernel-dkms/common/inc/nv-linux.h 5 | @@ -175,7 +175,11 @@ static inline uid_t __kuid_val(kuid_t uid) 6 | 7 | #if defined(NV_VM_INSERT_PAGE_PRESENT) 8 | #include 9 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0) 10 | #include 11 | +#else 12 | +#include 13 | +#endif 14 | #endif 15 | 16 | #if defined(CONFIG_SWIOTLB) && defined(NVCPU_AARCH64) 17 | diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh 18 | index b23dbb4..42dc576 100755 19 | --- a/kernel-dkms/conftest.sh 20 | +++ b/kernel-dkms/conftest.sh 21 | @@ -1906,7 +1906,12 @@ compile_test() { 22 | # Determine if the phys_to_dma function is present. 23 | # 24 | CODE=" 25 | + #include 26 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0) 27 | #include 28 | +#else 29 | + #include 30 | +#endif 31 | void conftest_phys_to_dma(void) { 32 | phys_to_dma(); 33 | }" 34 | -------------------------------------------------------------------------------- /patches/kernel-4.19.patch: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-connector.c b/kernel-dkms/nvidia-drm/nvidia-drm-connector.c 2 | index dbda66d..99333d9 100644 3 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-connector.c 4 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-connector.c 5 | @@ -226,7 +228,11 @@ static int nv_drm_connector_get_modes(struct drm_connector *connector) 6 | 7 | 8 | if (nv_connector->edid != NULL) { 9 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,19,0) 10 | drm_mode_connector_update_edid_property( 11 | +#else 12 | + drm_connector_update_edid_property( 13 | +#endif 14 | connector, nv_connector->edid); 15 | } 16 | 17 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-encoder.c b/kernel-dkms/nvidia-drm/nvidia-drm-encoder.c 18 | index 3dc2400..e8b4aad 100644 19 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-encoder.c 20 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-encoder.c 21 | @@ -216,7 +218,11 @@ nv_drm_add_encoder(struct drm_device *dev, NvKmsKapiDisplay hDisplay) 22 | 23 | /* Attach encoder and connector */ 24 | 25 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,19,0) 26 | ret = drm_mode_connector_attach_encoder(connector, encoder); 27 | +#else 28 | + ret = drm_connector_attach_encoder(connector, encoder); 29 | +#endif 30 | 31 | if (ret != 0) { 32 | NV_DRM_DEV_LOG_ERR( 33 | diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh 34 | index dd61566..30c88a1 100755 35 | --- a/kernel-dkms/conftest.sh 36 | +++ b/kernel-dkms/conftest.sh 37 | @@ -2363,17 +2363,22 @@ compile_test() { 38 | 39 | ;; 40 | 41 | - drm_mode_connector_list_update_has_merge_type_bits_arg) 42 | + drm_connector_list_update_has_merge_type_bits_arg) 43 | # 44 | - # Detect if drm_mode_connector_list_update() has a 45 | + # Detect if drm_connector_list_update() has a 46 | # 'merge_type_bits' second argument. This argument was 47 | # remove by: 48 | # 2015-12-03 6af3e6561243f167dabc03f732d27ff5365cd4a4 49 | # 50 | CODE=" 51 | #include 52 | - void conftest_drm_mode_connector_list_update_has_merge_type_bits_arg(void) { 53 | + #include 54 | + void conftest_drm_connector_list_update_has_merge_type_bits_arg(void) { 55 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,19,0) 56 | drm_mode_connector_list_update( 57 | +#else 58 | + drm_connector_list_update( 59 | +#endif 60 | NULL, /* struct drm_connector *connector */ 61 | true); /* bool merge_type_bits */ 62 | }" 63 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm.Kbuild b/kernel-dkms/nvidia-drm/nvidia-drm.Kbuild 64 | index b4a45a7..3b7f3a1 100644 65 | --- a/kernel-dkms/nvidia-drm/nvidia-drm.Kbuild 66 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm.Kbuild 67 | @@ -74,7 +74,7 @@ NV_CONFTEST_TYPE_COMPILE_TESTS += drm_driver_has_legacy_dev_list 68 | NV_CONFTEST_TYPE_COMPILE_TESTS += drm_driver_has_set_busid 69 | NV_CONFTEST_TYPE_COMPILE_TESTS += drm_crtc_state_has_connectors_changed 70 | NV_CONFTEST_TYPE_COMPILE_TESTS += drm_init_function_args 71 | -NV_CONFTEST_TYPE_COMPILE_TESTS += drm_mode_connector_list_update_has_merge_type_bits_arg 72 | +NV_CONFTEST_TYPE_COMPILE_TESTS += drm_connector_list_update_has_merge_type_bits_arg 73 | NV_CONFTEST_TYPE_COMPILE_TESTS += drm_helper_mode_fill_fb_struct 74 | NV_CONFTEST_TYPE_COMPILE_TESTS += drm_master_drop_has_from_release_arg 75 | NV_CONFTEST_TYPE_COMPILE_TESTS += drm_driver_unload_has_int_return_type 76 | -------------------------------------------------------------------------------- /patches/kernel-5.0.patch: -------------------------------------------------------------------------------- 1 | From 11adcf1e8d2fbebeb614390832de08388a46bcda Mon Sep 17 00:00:00 2001 2 | From: Tk-Glitch 3 | Date: Mon, 28 Jan 2019 18:21:34 +0100 4 | Subject: kernel 5.0 patch 5 | 6 | 7 | diff --git a/kernel-dkms/common/inc/nv.h b/kernel-dkms/common/inc/nv.h 8 | index d52c2a1ef..f6dc2dc32 100644 9 | --- a/kernel-dkms/common/inc/nv.h 10 | +++ b/kernel-dkms/common/inc/nv.h 11 | @@ -603,6 +605,7 @@ typedef NV_STATUS (*nvPmaEvictRangeCallback)(void *, NvU64, NvU64); 12 | #define NV_MAX_ISR_DELAY_US 20000 13 | #define NV_MAX_ISR_DELAY_MS (NV_MAX_ISR_DELAY_US / 1000) 14 | 15 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5,0,0) 16 | #define NV_TIMERCMP(a, b, CMP) \ 17 | (((a)->tv_sec == (b)->tv_sec) ? \ 18 | ((a)->tv_usec CMP (b)->tv_usec) : ((a)->tv_sec CMP (b)->tv_sec)) 19 | @@ -630,6 +633,35 @@ typedef NV_STATUS (*nvPmaEvictRangeCallback)(void *, NvU64, NvU64); 20 | } 21 | 22 | #define NV_TIMEVAL_TO_US(tv) ((NvU64)(tv).tv_sec * 1000000 + (tv).tv_usec) 23 | +#else 24 | +#define NV_TIMERCMP(a, b, CMP) \ 25 | + (((a)->tv_sec == (b)->tv_sec) ? \ 26 | + ((a)->tv_nsec CMP (b)->tv_nsec) : ((a)->tv_sec CMP (b)->tv_sec)) 27 | + 28 | +#define NV_TIMERADD(a, b, result) \ 29 | + { \ 30 | + (result)->tv_sec = (a)->tv_sec + (b)->tv_sec; \ 31 | + (result)->tv_nsec = (a)->tv_nsec + (b)->tv_nsec; \ 32 | + if ((result)->tv_nsec >= NSEC_PER_SEC) \ 33 | + { \ 34 | + ++(result)->tv_sec; \ 35 | + (result)->tv_nsec -= NSEC_PER_SEC; \ 36 | + } \ 37 | + } 38 | + 39 | +#define NV_TIMERSUB(a, b, result) \ 40 | + { \ 41 | + (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ 42 | + (result)->tv_nsec = (a)->tv_nsec - (b)->tv_nsec; \ 43 | + if ((result)->tv_nsec < 0) \ 44 | + { \ 45 | + --(result)->tv_sec; \ 46 | + (result)->tv_nsec += NSEC_PER_SEC; \ 47 | + } \ 48 | + } 49 | + 50 | +#define NV_TIMEVAL_TO_US(tv) ((NvU64)(tv).tv_sec * USEC_PER_SEC + (tv).tv_nsec/NSEC_PER_USEC) 51 | +#endif 52 | 53 | #ifndef NV_ALIGN_UP 54 | #define NV_ALIGN_UP(v,g) (((v) + ((g) - 1)) & ~((g) - 1)) 55 | diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh 56 | index 0ae7a2662..9a71ae7b3 100755 57 | --- a/kernel-dkms/conftest.sh 58 | +++ b/kernel-dkms/conftest.sh 59 | @@ -1653,6 +1653,24 @@ compile_test() { 60 | compile_check_conftest "$CODE" "NV_DRM_AVAILABLE" "" "generic" 61 | ;; 62 | 63 | + drm_dev_put) 64 | + # 65 | + # Determine if drm_dev_put() is present. 66 | + # 67 | + CODE=" 68 | + #include 69 | + #if defined(NV_DRM_DRMP_H_PRESENT) 70 | + #include 71 | + #endif 72 | +#if LINUX_VERSION_CODE => KERNEL_VERSION(5,0,0) 73 | + void conftest_drm_dev_put(void) { 74 | + drm_dev_put(); 75 | + } 76 | +#endif" 77 | + 78 | + compile_check_conftest "$CODE" "NV_DRM_DEV_PUT_PRESENT" "" "functions" 79 | + ;; 80 | + 81 | drm_dev_unref) 82 | # 83 | # Determine if drm_dev_unref() is present. 84 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-gem.h b/kernel-dkms/nvidia-drm/nvidia-drm-gem.h 85 | index f276588db..7cbdbe632 100644 86 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-gem.h 87 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-gem.h 88 | @@ -79,7 +81,11 @@ static inline int nv_drm_gem_handle_create_drop_reference( 89 | 90 | /* drop reference from allocate - handle holds it now */ 91 | 92 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) 93 | drm_gem_object_unreference_unlocked(&nv_gem->base); 94 | +#else 95 | + drm_gem_object_put_unlocked(&nv_gem->base); 96 | +#endif 97 | 98 | return ret; 99 | } 100 | @@ -148,13 +154,21 @@ static inline struct nv_drm_gem_object *nv_drm_gem_object_lookup( 101 | static inline void 102 | nv_drm_gem_object_unreference_unlocked(struct nv_drm_gem_object *nv_gem) 103 | { 104 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) 105 | drm_gem_object_unreference_unlocked(&nv_gem->base); 106 | +#else 107 | + drm_gem_object_put_unlocked(&nv_gem->base); 108 | +#endif 109 | } 110 | 111 | static inline void 112 | nv_drm_gem_object_unreference(struct nv_drm_gem_object *nv_gem) 113 | { 114 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) 115 | drm_gem_object_unreference(&nv_gem->base); 116 | +#else 117 | + drm_gem_object_put(&nv_gem->base); 118 | +#endif 119 | } 120 | 121 | static inline int nv_drm_gem_handle_create(struct drm_file *filp, 122 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-helper.c b/kernel-dkms/nvidia-drm/nvidia-drm-helper.c 123 | index 4ccf81929..7fb59bbb3 100644 124 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-helper.c 125 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-helper.c 126 | @@ -149,12 +151,20 @@ void nv_drm_atomic_clean_old_fb(struct drm_device *dev, 127 | if (ret == 0) { 128 | struct drm_framebuffer *new_fb = plane->state->fb; 129 | if (new_fb) 130 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) 131 | drm_framebuffer_reference(new_fb); 132 | +#else 133 | + drm_framebuffer_get(new_fb); 134 | +#endif 135 | plane->fb = new_fb; 136 | plane->crtc = plane->state->crtc; 137 | 138 | if (plane->old_fb) 139 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) 140 | drm_framebuffer_unreference(plane->old_fb); 141 | +#else 142 | + drm_framebuffer_put(plane->old_fb); 143 | +#endif 144 | } 145 | plane->old_fb = NULL; 146 | } 147 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-helper.h b/kernel-dkms/nvidia-drm/nvidia-drm-helper.h 148 | index efecc4ad7..2a0c3bbca 100644 149 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-helper.h 150 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-helper.h 151 | @@ -36,7 +36,9 @@ 152 | */ 153 | static inline void nv_drm_dev_free(struct drm_device *dev) 154 | { 155 | -#if defined(NV_DRM_DEV_UNREF_PRESENT) 156 | +#if defined(NV_DRM_DEV_PUT_PRESENT) 157 | + drm_dev_put(dev); 158 | +#elif defined(NV_DRM_DEV_UNREF_PRESENT) 159 | drm_dev_unref(dev); 160 | #else 161 | drm_dev_free(dev); 162 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-linux.c b/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 163 | index 5a2bbc18c..133d8fe64 100644 164 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 165 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 166 | @@ -151,11 +153,19 @@ void nv_drm_vunmap(void *address) 167 | 168 | uint64_t nv_drm_get_time_usec(void) 169 | { 170 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) 171 | struct timeval tv; 172 | 173 | do_gettimeofday(&tv); 174 | 175 | return (((uint64_t)tv.tv_sec) * 1000000) + tv.tv_usec; 176 | +#else 177 | + struct timespec64 ts; 178 | + 179 | + ktime_get_real_ts64(&ts); 180 | + 181 | + return (((uint64_t)ts.tv_sec) * USEC_PER_SEC) + (((uint64_t)ts.tv_nsec) / NSEC_PER_USEC); 182 | +#endif 183 | } 184 | 185 | #endif /* NV_DRM_AVAILABLE */ 186 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm.Kbuild b/kernel-dkms/nvidia-drm/nvidia-drm.Kbuild 187 | index 466b51528..bcf8aff10 100644 188 | --- a/kernel-dkms/nvidia-drm/nvidia-drm.Kbuild 189 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm.Kbuild 190 | @@ -53,6 +53,7 @@ NV_CONFTEST_GENERIC_COMPILE_TESTS += drm_atomic_modeset_nonblocking_commit_avail 191 | NV_CONFTEST_GENERIC_COMPILE_TESTS += is_export_symbol_gpl_refcount_inc 192 | NV_CONFTEST_GENERIC_COMPILE_TESTS += is_export_symbol_gpl_refcount_dec_and_test 193 | 194 | +NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_dev_put 195 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_dev_unref 196 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_reinit_primary_mode_group 197 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_atomic_set_mode_for_crtc 198 | diff --git a/kernel-dkms/nvidia-modeset/nvidia-modeset-linux.c b/kernel-dkms/nvidia-modeset/nvidia-modeset-linux.c 199 | index 1b9148ee7..4c1bd3617 100644 200 | --- a/kernel-dkms/nvidia-modeset/nvidia-modeset-linux.c 201 | +++ b/kernel-dkms/nvidia-modeset/nvidia-modeset-linux.c 202 | @@ -210,11 +212,19 @@ void NVKMS_API_CALL nvkms_usleep(NvU64 usec) 203 | 204 | NvU64 NVKMS_API_CALL nvkms_get_usec(void) 205 | { 206 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) 207 | struct timeval tv; 208 | 209 | do_gettimeofday(&tv); 210 | 211 | return (((NvU64)tv.tv_sec) * 1000000) + tv.tv_usec; 212 | +#else 213 | + struct timespec64 ts; 214 | + 215 | + ktime_get_real_ts64(&ts); 216 | + 217 | + return (((NvU64)ts.tv_sec) * 1000000) + ts.tv_nsec/NSEC_PER_USEC; 218 | +#endif 219 | } 220 | 221 | int NVKMS_API_CALL nvkms_copyin(void *kptr, NvU64 uaddr, size_t n) 222 | diff --git a/kernel-dkms/nvidia-uvm/uvm_linux.h b/kernel-dkms/nvidia-uvm/uvm_linux.h 223 | index 8707ac070..990cefbd4 100644 224 | --- a/kernel-dkms/nvidia-uvm/uvm_linux.h 225 | +++ b/kernel-dkms/nvidia-uvm/uvm_linux.h 226 | @@ -320,12 +322,21 @@ static inline uint64_t NV_DIV64(uint64_t dividend, uint64_t divisor, uint64_t *r 227 | /* Return a nanosecond-precise value */ 228 | static inline NvU64 NV_GETTIME(void) 229 | { 230 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) 231 | struct timespec ts = {0}; 232 | 233 | getrawmonotonic(&ts); 234 | 235 | /* Wraps around every 583 years */ 236 | return (ts.tv_sec * 1000000000ULL + ts.tv_nsec); 237 | +#else 238 | + struct timespec64 ts = {0}; 239 | + 240 | + ktime_get_raw_ts64(&ts); 241 | + 242 | + /* Wraps around every 583 years */ 243 | + return (ts.tv_sec * NSEC_PER_SEC + ts.tv_nsec); 244 | +#endif 245 | } 246 | #else 247 | /* We can only return a microsecond-precise value with the 248 | @@ -334,9 +345,15 @@ static inline NvU64 NV_GETTIME(void) 249 | { 250 | struct timeval tv = {0}; 251 | 252 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) 253 | do_gettimeofday(&tv); 254 | 255 | return (tv.tv_sec * 1000000000ULL + tv.tv_usec * 1000ULL); 256 | +#else 257 | + ktime_get_real_ts64(&tv); 258 | + 259 | + return (tv.tv_sec * 1000000000ULL + (tv.tv_nsec/NSEC_PER_USEC) * 1000ULL); 260 | +#endif 261 | } 262 | #endif 263 | 264 | diff --git a/kernel-dkms/nvidia/nvlink_linux.c b/kernel-dkms/nvidia/nvlink_linux.c 265 | index c13b72515..db691679c 100644 266 | --- a/kernel-dkms/nvidia/nvlink_linux.c 267 | +++ b/kernel-dkms/nvidia/nvlink_linux.c 268 | @@ -500,6 +502,7 @@ void * NVLINK_API_CALL nvlink_memcpy(void *dest, void *src, NvLength size) 269 | return memcpy(dest, src, size); 270 | } 271 | 272 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5,0,0) 273 | static NvBool nv_timer_less_than 274 | ( 275 | const struct timeval *a, 276 | @@ -610,6 +613,118 @@ void NVLINK_API_CALL nvlink_sleep(unsigned int ms) 277 | udelay(us); 278 | } 279 | } 280 | +#else 281 | +static NvBool nv_timer_less_than 282 | +( 283 | + const struct timespec64 *a, 284 | + const struct timespec64 *b 285 | +) 286 | +{ 287 | + return (a->tv_sec == b->tv_sec) ? (a->tv_nsec < b->tv_nsec) 288 | + : (a->tv_sec < b->tv_sec); 289 | +} 290 | + 291 | +static void nv_timeradd 292 | +( 293 | + const struct timespec64 *a, 294 | + const struct timespec64 *b, 295 | + struct timespec64 *result 296 | +) 297 | +{ 298 | + result->tv_sec = a->tv_sec + b->tv_sec; 299 | + result->tv_nsec = a->tv_nsec + b->tv_nsec; 300 | + while (result->tv_nsec >= NSEC_PER_SEC) 301 | + { 302 | + ++result->tv_sec; 303 | + result->tv_nsec -= NSEC_PER_SEC; 304 | + } 305 | +} 306 | + 307 | +static void nv_timersub 308 | +( 309 | + const struct timespec64 *a, 310 | + const struct timespec64 *b, 311 | + struct timespec64 *result 312 | +) 313 | +{ 314 | + result->tv_sec = a->tv_sec - b->tv_sec; 315 | + result->tv_nsec = a->tv_nsec - b->tv_nsec; 316 | + while (result->tv_nsec < 0) 317 | + { 318 | + --(result->tv_sec); 319 | + result->tv_nsec += NSEC_PER_SEC; 320 | + } 321 | +} 322 | + 323 | +/* 324 | + * Sleep for specified milliseconds. Yields the CPU to scheduler. 325 | + */ 326 | +void NVLINK_API_CALL nvlink_sleep(unsigned int ms) 327 | +{ 328 | + unsigned long us; 329 | + unsigned long jiffies; 330 | + unsigned long mdelay_safe_msec; 331 | + struct timespec64 ts_end, ts_aux; 332 | + 333 | + ktime_get_real_ts64(&ts_aux); 334 | + 335 | + if (in_irq() && (ms > NV_MAX_ISR_DELAY_MS)) 336 | + { 337 | + return; 338 | + } 339 | + 340 | + if (irqs_disabled() || in_interrupt() || in_atomic()) 341 | + { 342 | + mdelay(ms); 343 | + return; 344 | + } 345 | + 346 | + us = ms * 1000; 347 | + ts_end.tv_nsec = us*NSEC_PER_USEC; 348 | + ts_end.tv_sec = 0; 349 | + nv_timeradd(&ts_aux, &ts_end, &ts_end); 350 | + 351 | + /* do we have a full jiffie to wait? */ 352 | + jiffies = NV_USECS_TO_JIFFIES(us); 353 | + 354 | + if (jiffies) 355 | + { 356 | + // 357 | + // If we have at least one full jiffy to wait, give up 358 | + // up the CPU; since we may be rescheduled before 359 | + // the requested timeout has expired, loop until less 360 | + // than a jiffie of the desired delay remains. 361 | + // 362 | + current->state = TASK_INTERRUPTIBLE; 363 | + do 364 | + { 365 | + schedule_timeout(jiffies); 366 | + ktime_get_real_ts64(&ts_aux); 367 | + if (nv_timer_less_than(&ts_aux, &ts_end)) 368 | + { 369 | + nv_timersub(&ts_end, &ts_aux, &ts_aux); 370 | + us = ts_aux.tv_nsec/NSEC_PER_USEC + ts_aux.tv_sec * USEC_PER_SEC; 371 | + } 372 | + else 373 | + { 374 | + us = 0; 375 | + } 376 | + } 377 | + while ((jiffies = NV_USECS_TO_JIFFIES(us)) != 0); 378 | + } 379 | + 380 | + if (us > 1000) 381 | + { 382 | + mdelay_safe_msec = us / USEC_PER_MSEC; 383 | + mdelay(mdelay_safe_msec); 384 | + us %= 1000; 385 | + } 386 | + if (us) 387 | + { 388 | + udelay(us); 389 | + } 390 | +} 391 | +#endif 392 | 393 | void NVLINK_API_CALL nvlink_assert(int cond) 394 | { 395 | diff --git a/kernel-dkms/nvidia/os-interface.c b/kernel-dkms/nvidia/os-interface.c 396 | index d1c889f69..88c57b2da 100644 397 | --- a/kernel-dkms/nvidia/os-interface.c 398 | +++ b/kernel-dkms/nvidia/os-interface.c 399 | @@ -426,6 +428,7 @@ NV_STATUS NV_API_CALL os_get_current_time( 400 | NvU32 *seconds, 401 | NvU32 *useconds 402 | ) 403 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) 404 | { 405 | struct timeval tm; 406 | 407 | @@ -608,6 +611,190 @@ NV_STATUS NV_API_CALL os_delay(NvU32 MilliSeconds) 408 | 409 | return NV_OK; 410 | } 411 | +#else 412 | +{ 413 | + struct timespec64 ts; 414 | + 415 | + ktime_get_real_ts64(&ts); 416 | + 417 | + *seconds = ts.tv_sec; 418 | + *useconds = ((uint64_t)(ts.tv_nsec / NSEC_PER_USEC)); 419 | + 420 | + return NV_OK; 421 | +} 422 | + 423 | +#if BITS_PER_LONG >= 64 424 | + 425 | +void NV_API_CALL os_get_current_tick(NvU64 *nseconds) 426 | +{ 427 | + struct timespec64 ts; 428 | + 429 | + jiffies_to_timespec64(jiffies, &ts); 430 | + 431 | + *nseconds = ((NvU64)ts.tv_sec * NSEC_PER_SEC + (NvU64)ts.tv_nsec); 432 | +} 433 | + 434 | +#else 435 | + 436 | +void NV_API_CALL os_get_current_tick(NvU64 *nseconds) 437 | +{ 438 | + /* 439 | + * 'jiffies' overflows regularly on 32-bit builds (unsigned long is 4 bytes 440 | + * instead of 8 bytes), so it's unwise to build a tick counter on it, since 441 | + * the rest of the Resman assumes the 'tick' returned from this function is 442 | + * monotonically increasing and never overflows. 443 | + * 444 | + * Instead, use the previous implementation that we've lived with since the 445 | + * beginning, which uses system clock time to calculate the tick. This is 446 | + * subject to problems if the system clock time changes dramatically 447 | + * (more than a second or so) while the Resman is actively tracking a 448 | + * timeout. 449 | + */ 450 | + NvU32 seconds, useconds; 451 | + 452 | + (void) os_get_current_time(&seconds, &useconds); 453 | + 454 | + *nseconds = ((NvU64)seconds * NSEC_PER_SEC + 455 | + (NvU64)useconds * NSEC_PER_USEC); 456 | +} 457 | + 458 | +#endif 459 | + 460 | +//--------------------------------------------------------------------------- 461 | +// 462 | +// Misc services. 463 | +// 464 | +//--------------------------------------------------------------------------- 465 | + 466 | +#define NV_MSECS_PER_JIFFIE (1000 / HZ) 467 | +#define NV_MSECS_TO_JIFFIES(msec) ((msec) * HZ / 1000) 468 | +#define NV_USECS_PER_JIFFIE (1000000 / HZ) 469 | +#define NV_USECS_TO_JIFFIES(usec) ((usec) * HZ / 1000000) 470 | + 471 | +// #define NV_CHECK_DELAY_ACCURACY 1 472 | + 473 | +/* 474 | + * It is generally a bad idea to use udelay() to wait for more than 475 | + * a few milliseconds. Since the caller is most likely not aware of 476 | + * this, we use mdelay() for any full millisecond to be safe. 477 | + */ 478 | + 479 | +NV_STATUS NV_API_CALL os_delay_us(NvU32 MicroSeconds) 480 | +{ 481 | + unsigned long mdelay_safe_msec; 482 | + unsigned long usec; 483 | + 484 | +#ifdef NV_CHECK_DELAY_ACCURACY 485 | + struct timespec64 ts1, ts2; 486 | + 487 | + ktime_get_real_ts64(&ts1); 488 | +#endif 489 | + 490 | + if (in_irq() && (MicroSeconds > NV_MAX_ISR_DELAY_US)) 491 | + return NV_ERR_GENERIC; 492 | + 493 | + mdelay_safe_msec = MicroSeconds / 1000; 494 | + if (mdelay_safe_msec) 495 | + mdelay(mdelay_safe_msec); 496 | + 497 | + usec = MicroSeconds % 1000; 498 | + if (usec) 499 | + udelay(usec); 500 | + 501 | +#ifdef NV_CHECK_DELAY_ACCURACY 502 | + ktime_get_real_ts64(&ts2); 503 | + nv_printf(NV_DBG_ERRORS, "NVRM: osDelayUs %d: 0x%x 0x%x\n", 504 | + MicroSeconds, ts2.tv_sec - ts1.tv_sec, (ts2.tv_nsec - ts1.tv_nsec) / NSEC_PER_USEC); 505 | +#endif 506 | + 507 | + return NV_OK; 508 | +} 509 | + 510 | +/* 511 | + * On Linux, a jiffie represents the time passed in between two timer 512 | + * interrupts. The number of jiffies per second (HZ) varies across the 513 | + * supported platforms. On i386, where HZ is 100, a timer interrupt is 514 | + * generated every 10ms; the resolution is a lot better on ia64, where 515 | + * HZ is 1024. NV_MSECS_TO_JIFFIES should be accurate independent of 516 | + * the actual value of HZ; any partial jiffies will be 'floor'ed, the 517 | + * remainder will be accounted for with mdelay(). 518 | + */ 519 | + 520 | +NV_STATUS NV_API_CALL os_delay(NvU32 MilliSeconds) 521 | +{ 522 | + unsigned long MicroSeconds; 523 | + unsigned long jiffies; 524 | + unsigned long mdelay_safe_msec; 525 | + struct timespec64 ts_end, ts_aux; 526 | +#ifdef NV_CHECK_DELAY_ACCURACY 527 | + struct timespec64 ts_start; 528 | +#endif 529 | + 530 | + ktime_get_real_ts64(&ts_aux); 531 | +#ifdef NV_CHECK_DELAY_ACCURACY 532 | + ts_start = ts_aux; 533 | +#endif 534 | + 535 | + if (in_irq() && (MilliSeconds > NV_MAX_ISR_DELAY_MS)) 536 | + return NV_ERR_GENERIC; 537 | + 538 | + if (!NV_MAY_SLEEP()) 539 | + { 540 | + mdelay(MilliSeconds); 541 | + return NV_OK; 542 | + } 543 | + 544 | + MicroSeconds = MilliSeconds * USEC_PER_MSEC; 545 | + ts_end.tv_nsec = MicroSeconds * NSEC_PER_USEC; 546 | + ts_end.tv_sec = 0; 547 | + NV_TIMERADD(&ts_aux, &ts_end, &ts_end); 548 | + 549 | + /* do we have a full jiffie to wait? */ 550 | + jiffies = NV_USECS_TO_JIFFIES(MicroSeconds); 551 | + 552 | + if (jiffies) 553 | + { 554 | + // 555 | + // If we have at least one full jiffy to wait, give up 556 | + // up the CPU; since we may be rescheduled before 557 | + // the requested timeout has expired, loop until less 558 | + // than a jiffie of the desired delay remains. 559 | + // 560 | + current->state = TASK_INTERRUPTIBLE; 561 | + do 562 | + { 563 | + schedule_timeout(jiffies); 564 | + ktime_get_real_ts64(&ts_aux); 565 | + if (NV_TIMERCMP(&ts_aux, &ts_end, <)) 566 | + { 567 | + NV_TIMERSUB(&ts_end, &ts_aux, &ts_aux); 568 | + MicroSeconds = ts_aux.tv_nsec/NSEC_PER_USEC + ts_aux.tv_sec * USEC_PER_SEC; 569 | + } 570 | + else 571 | + MicroSeconds = 0; 572 | + } while ((jiffies = NV_USECS_TO_JIFFIES(MicroSeconds)) != 0); 573 | + } 574 | + 575 | + if (MicroSeconds > 1000) 576 | + { 577 | + mdelay_safe_msec = MicroSeconds / 1000; 578 | + mdelay(mdelay_safe_msec); 579 | + MicroSeconds %= 1000; 580 | + } 581 | + if (MicroSeconds) 582 | + { 583 | + udelay(MicroSeconds); 584 | + } 585 | +#ifdef NV_CHECK_DELAY_ACCURACY 586 | + ktime_get_real_ts64(&ts_aux); 587 | + timersub(&ts_aux, &ts_start, &ts_aux); 588 | + nv_printf(NV_DBG_ERRORS, "NVRM: osDelay %dmsec: %d.%06dsec\n", 589 | + MilliSeconds, ts_aux.tv_sec, ts_aux.tv_nsec/NSEC_PER_USEC); 590 | +#endif 591 | + 592 | + return NV_OK; 593 | +} 594 | +#endif 595 | 596 | NvU64 NV_API_CALL os_get_cpu_frequency(void) 597 | { 598 | @@ -1896,6 +2083,7 @@ static NV_STATUS NV_API_CALL _os_ipmi_receive_resp 599 | nvipmi_resp_t *p_resp 600 | ) 601 | { 602 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) 603 | struct ipmi_recv_msg *rx_msg; 604 | int err_no; 605 | struct timeval tv; 606 | @@ -1928,6 +2116,40 @@ static NV_STATUS NV_API_CALL _os_ipmi_receive_resp 607 | os_delay(NV_IPMI_SLEEP_MS); 608 | do_gettimeofday(&tv); 609 | } while (NV_TIMEVAL_TO_US(tv) < (start_time + NV_IPMI_READ_TIMEOUT_US)); 610 | +#else 611 | + struct ipmi_recv_msg *rx_msg; 612 | + int err_no; 613 | + struct timespec64 ts; 614 | + NvU64 start_time; 615 | + 616 | + ktime_get_real_ts64(&ts); 617 | + start_time = NV_TIMEVAL_TO_US(ts); 618 | + 619 | + err_no = -EAGAIN; 620 | + do 621 | + { 622 | + unsigned long flags; 623 | + struct list_head *ent; 624 | + 625 | + rx_msg = NULL; 626 | + 627 | + spin_lock_irqsave(&p_priv->msg_lock, flags); 628 | + if (!list_empty(&p_priv->msgs)) 629 | + { 630 | + ent = p_priv->msgs.next; 631 | + rx_msg = list_entry(ent, struct ipmi_recv_msg, link); 632 | + list_del(ent); 633 | + spin_unlock_irqrestore(&p_priv->msg_lock, flags); 634 | + 635 | + err_no = 0; 636 | + break; 637 | + } 638 | + 639 | + spin_unlock_irqrestore(&p_priv->msg_lock, flags); 640 | + os_delay(NV_IPMI_SLEEP_MS); 641 | + ktime_get_real_ts64(&ts); 642 | + } while (NV_TIMEVAL_TO_US(ts) < (start_time + NV_IPMI_READ_TIMEOUT_US)); 643 | +#endif 644 | 645 | if (rx_msg != NULL) 646 | { 647 | -------------------------------------------------------------------------------- /patches/kernel-5.1.patch: -------------------------------------------------------------------------------- 1 | From c2c16eef00915cbe7a7bc58b1f3308705ef2bfc4 Mon Sep 17 00:00:00 2001 2 | From: Tk-Glitch 3 | Date: Wed, 3 Apr 2019 18:02:22 +0200 4 | Subject: nvidia kernel 5.1 patch (exploded into parts). 5 | Thanks to Robert Gadsdon's findings @ http://rglinuxtech.com 6 | 7 | 8 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-connector.c b/kernel-dkms/nvidia-drm/nvidia-drm-connector.c 9 | index 4dd12d112..44c9d8ed3 100644 10 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-connector.c 11 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-connector.c 12 | @@ -201,6 +203,12 @@ nv_drm_connector_detect(struct drm_connector *connector, bool force) 13 | return __nv_drm_connector_detect_internal(connector); 14 | } 15 | 16 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0) 17 | +int drm_helper_probe_single_connector_modes(struct drm_connector 18 | + *connector, uint32_t maxX, 19 | + uint32_t maxY); 20 | +#endif 21 | + 22 | static struct drm_connector_funcs nv_connector_funcs = { 23 | #if defined NV_DRM_ATOMIC_HELPER_CONNECTOR_DPMS_PRESENT 24 | .dpms = drm_atomic_helper_connector_dpms, 25 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 26 | index 58fd2724a..fc9169a96 100644 27 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 28 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 29 | @@ -35,6 +37,13 @@ 30 | #include "nvidia-drm-gem-nvkms-memory.h" 31 | #include "nvidia-drm-gem-user-memory.h" 32 | 33 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0) 34 | +void drm_kms_helper_poll_init(struct drm_device *dev); 35 | +void drm_kms_helper_poll_fini(struct drm_device *dev); 36 | +bool drm_helper_hpd_irq_event(struct drm_device *dev); 37 | +void drm_kms_helper_poll_disable(struct drm_device *dev); 38 | +#endif 39 | + 40 | #if defined(NV_DRM_AVAILABLE) 41 | 42 | #include "nvidia-drm-ioctl.h" 43 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-encoder.c b/kernel-dkms/nvidia-drm/nvidia-drm-encoder.c 44 | index f66bbd7c9..4de87a271 100644 45 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-encoder.c 46 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-encoder.c 47 | @@ -36,6 +38,10 @@ 48 | #include 49 | #include 50 | 51 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0) 52 | +void drm_kms_helper_hotplug_event(struct drm_device *dev); 53 | +#endif 54 | + 55 | static void nv_drm_encoder_destroy(struct drm_encoder *encoder) 56 | { 57 | struct nv_drm_encoder *nv_encoder = to_nv_encoder(encoder); 58 | @@ -152,6 +158,12 @@ nv_drm_encoder_new(struct drm_device *dev, 59 | return &nv_encoder->base; 60 | } 61 | 62 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0) 63 | +int drm_helper_probe_single_connector_modes(struct drm_connector 64 | + *connector, uint32_t maxX, 65 | + uint32_t maxY); 66 | +#endif 67 | + 68 | /* 69 | * Add encoder for given NvKmsKapiDisplay 70 | */ 71 | diff --git a/kernel-dkms/nvidia-uvm/uvm8.c b/kernel-dkms/nvidia-uvm/uvm8.c 72 | index 44467988e..4cba5dc33 100644 73 | --- a/kernel-dkms/nvidia-uvm/uvm8.c 74 | +++ b/kernel-dkms/nvidia-uvm/uvm8.c 75 | @@ -172,7 +172,11 @@ static int uvm_vm_fault_sigbus(struct vm_area_struct *vma, struct vm_fault *vmf) 76 | return VM_FAULT_SIGBUS; 77 | } 78 | 79 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0) 80 | static int uvm_vm_fault_sigbus_wrapper(struct vm_fault *vmf) 81 | +#else 82 | +static vm_fault_t uvm_vm_fault_sigbus_wrapper(struct vm_fault *vmf) 83 | +#endif 84 | { 85 | #if defined(NV_VM_OPS_FAULT_REMOVED_VMA_ARG) 86 | return uvm_vm_fault_sigbus(vmf->vma, vmf); 87 | @@ -507,7 +511,11 @@ convert_error: 88 | } 89 | } 90 | 91 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0) 92 | static int uvm_vm_fault_wrapper(struct vm_fault *vmf) 93 | +#else 94 | +static vm_fault_t uvm_vm_fault_wrapper(struct vm_fault *vmf) 95 | +#endif 96 | { 97 | #if defined(NV_VM_OPS_FAULT_REMOVED_VMA_ARG) 98 | return uvm_vm_fault(vmf->vma, vmf); 99 | -------------------------------------------------------------------------------- /patches/kernel-5.10.patch: -------------------------------------------------------------------------------- 1 | From 0c3e4c40305e78fd6d9899e43af6f0544a02fa6e Mon Sep 17 00:00:00 2001 2 | From: Joan Bruguera 3 | Date: Mon, 26 Oct 2020 04:44:33 +0100 4 | Subject: [PATCH] Tentative fix for NVIDIA 455.28 driver for Linux 5.10-rc1 5 | 6 | NOTE: This does not fix the licensing problem with nvidia-uvm which also affects Linux 5.9 7 | --- 8 | common/inc/nv-linux.h | 6 ++++++ 9 | nvidia-drm/nvidia-drm-gem-user-memory.c | 7 +++++++ 10 | 2 files changed, 13 insertions(+) 11 | 12 | diff --git a/kernel-dkms/common/inc/nv-linux.h b/kernel-dkms/common/inc/nv-linux.h 13 | index 09d1e50..630f80b 100644 14 | --- a/kernel-dkms/common/inc/nv-linux.h 15 | +++ b/kernel-dkms/common/inc/nv-linux.h 16 | @@ -11,6 +11,7 @@ 17 | #ifndef _NV_LINUX_H_ 18 | #define _NV_LINUX_H_ 19 | 20 | +#include 21 | #include "nvstatus.h" 22 | #include "nv-misc.h" 23 | #include "nv.h" 24 | @@ -169,6 +170,11 @@ static inline uid_t __kuid_val(uid_t uid) 25 | 26 | #include 27 | #include 28 | +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) 29 | +// dma-mapping.h has been split on commit 0a0f0d8be76dcd4390ff538e7060fda34db79717,, 30 | +// so this needs to be incldued now for the build to work 31 | +#include 32 | +#endif 33 | 34 | #if defined(CONFIG_SWIOTLB) && defined(NVCPU_AARCH64) 35 | #include 36 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c b/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c 37 | index 737d84c..082fc11 100644 38 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c 39 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c 40 | @@ -20,6 +20,7 @@ 41 | * DEALINGS IN THE SOFTWARE. 42 | */ 43 | 44 | +#include 45 | #include "nvidia-drm-conftest.h" 46 | 47 | #if defined(NV_DRM_AVAILABLE) 48 | @@ -60,8 +61,14 @@ static struct sg_table *__nv_drm_gem_user_memory_prime_get_sg_table( 49 | { 50 | struct nv_drm_gem_user_memory *nv_user_memory = to_nv_user_memory(nv_gem); 51 | 52 | +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) 53 | + // New parameter to drm_prime_pages_to_sg (commit 707d561f77b5e2a6f90c9786bee44ee7a8dedc7e) 54 | + return drm_prime_pages_to_sg(nv_gem->nv_dev->dev, nv_user_memory->pages, 55 | + nv_user_memory->pages_count); 56 | +#else 57 | return drm_prime_pages_to_sg(nv_user_memory->pages, 58 | nv_user_memory->pages_count); 59 | +#endif 60 | } 61 | 62 | static void *__nv_drm_gem_user_memory_prime_vmap( 63 | -- 64 | 2.29.1 65 | -------------------------------------------------------------------------------- /patches/kernel-5.11.patch: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh 2 | index 282a911..c2d0fc3 100755 3 | --- a/kernel-dkms/conftest.sh 4 | +++ b/kernel-dkms/conftest.sh 5 | @@ -159,6 +159,7 @@ test_headers() { 6 | FILES="$FILES asm/pgtable_types.h" 7 | FILES="$FILES linux/stringhash.h" 8 | FILES="$FILES linux/dma-map-ops.h" 9 | + FILES="$FILES asm/kmap_types.h" 10 | 11 | translate_and_preprocess_header_files $FILES 12 | } 13 | @@ -1265,6 +1266,8 @@ compile_test() { 14 | drm_available) 15 | # Determine if the DRM subsystem is usable 16 | CODE=" 17 | + #include 18 | + 19 | #if defined(NV_DRM_DRMP_H_PRESENT) 20 | #include 21 | #endif 22 | @@ -1273,6 +1276,10 @@ compile_test() { 23 | #include 24 | #endif 25 | 26 | + #if defined(NV_DRM_DRM_GEM_H_PRESENT) 27 | + #include 28 | + #endif 29 | + 30 | #if defined(NV_DRM_DRM_PRIME_H_PRESENT) 31 | #include 32 | #endif 33 | @@ -1282,6 +1289,7 @@ compile_test() { 34 | #endif 35 | 36 | void conftest_drm_available(void) { 37 | +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) 38 | struct drm_driver drv; 39 | 40 | /* 2013-01-15 89177644a7b6306e6084a89eab7e290f4bfef397 */ 41 | @@ -1291,6 +1299,13 @@ compile_test() { 42 | drv.gem_prime_vunmap = 0; 43 | (void)drm_gem_prime_import; 44 | (void)drm_gem_prime_export; 45 | +#else 46 | + struct drm_gem_object_funcs gem; 47 | + gem.pin = 0; 48 | + gem.get_sg_table = 0; 49 | + gem.vmap = 0; 50 | + gem.vunmap = 0; 51 | +#endif 52 | 53 | /* 2013-10-02 1bb72532ac260a2d3982b40bdd4c936d779d0d16 */ 54 | (void)drm_dev_alloc; 55 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-crtc.c b/kernel-dkms/nvidia-drm/nvidia-drm-crtc.c 56 | index b966bb2..b104d13 100644 57 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-crtc.c 58 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-crtc.c 59 | @@ -42,6 +42,8 @@ 60 | #include 61 | #include 62 | 63 | +#include 64 | + 65 | static void nv_drm_plane_destroy(struct drm_plane *plane) 66 | { 67 | /* plane->state gets freed here */ 68 | @@ -460,8 +462,14 @@ static int head_modeset_config_attach_connector( 69 | * will be discarded if ->atomic_check() fails. 70 | */ 71 | static int nv_drm_crtc_atomic_check(struct drm_crtc *crtc, 72 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0) 73 | struct drm_crtc_state *crtc_state) 74 | { 75 | +#else 76 | + struct drm_atomic_state *state) 77 | +{ 78 | + struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,crtc); 79 | +#endif 80 | struct nv_drm_crtc_state *nv_crtc_state = to_nv_crtc_state(crtc_state); 81 | struct NvKmsKapiHeadRequestedConfig *req_config = 82 | &nv_crtc_state->req_config; 83 | @@ -532,7 +540,11 @@ static void nv_drm_crtc_disable(struct drm_crtc *crtc) 84 | 85 | #ifdef NV_DRM_CRTC_HELPER_FUNCS_HAS_ATOMIC_ENABLE 86 | static void nv_drm_crtc_atomic_enable(struct drm_crtc *crtc, 87 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0) 88 | struct drm_crtc_state *old_crtc_state) 89 | +#else 90 | + struct drm_atomic_state *state) 91 | +#endif 92 | { 93 | 94 | } 95 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 96 | index ebfb5cd..e816f26 100644 97 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 98 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 99 | @@ -20,6 +20,7 @@ 100 | * DEALINGS IN THE SOFTWARE. 101 | */ 102 | 103 | +#include 104 | #include "nvidia-drm-conftest.h" /* NV_DRM_AVAILABLE and NV_DRM_DRM_GEM_H_PRESENT */ 105 | 106 | #include "nvidia-drm-priv.h" 107 | @@ -755,12 +756,21 @@ static struct drm_driver nv_drm_driver = { 108 | 109 | .prime_handle_to_fd = drm_gem_prime_handle_to_fd, 110 | .prime_fd_to_handle = drm_gem_prime_fd_to_handle, 111 | +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) 112 | + // Deprecated in favour of equivalent in drm_get_object in torvalds/linux commit d693def4fd1c23f1ca5aed1afb9993b3a2069ad2 113 | .gem_prime_export = drm_gem_prime_export, 114 | +#endif 115 | .gem_prime_import = nv_drm_gem_prime_import, 116 | +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) 117 | + // Deprecated in favour of equivalent in drm_get_object in torvalds/linux commit d693def4fd1c23f1ca5aed1afb9993b3a2069ad2 118 | .gem_prime_get_sg_table = nv_drm_gem_prime_get_sg_table, 119 | +#endif 120 | .gem_prime_import_sg_table = nv_drm_gem_prime_import_sg_table, 121 | +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) 122 | + // Deprecated in favour of equivalent in drm_get_object in torvalds/linux commit d693def4fd1c23f1ca5aed1afb9993b3a2069ad2 123 | .gem_prime_vmap = nv_drm_gem_prime_vmap, 124 | .gem_prime_vunmap = nv_drm_gem_prime_vunmap, 125 | +#endif 126 | 127 | #if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_RES_OBJ) 128 | .gem_prime_res_obj = nv_drm_gem_prime_res_obj, 129 | @@ -784,12 +794,16 @@ static struct drm_driver nv_drm_driver = { 130 | .desc = "NVIDIA DRM driver", 131 | .date = "20160202", 132 | 133 | +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) 134 | + // This is now behind a CONFIG_DRM_LEGACY Kconfig flag.(torvalds/linux commit 57bb1ee6034046be70aed33fd6d447bb2b7261fa) 135 | + // (Was this used anyway? Just remove it entirely for now) 136 | #if defined(NV_DRM_DRIVER_HAS_LEGACY_DEV_LIST) 137 | .legacy_dev_list = LIST_HEAD_INIT(nv_drm_driver.legacy_dev_list), 138 | #else 139 | .device_list = LIST_HEAD_INIT(nv_drm_driver.device_list), 140 | #endif 141 | .gem_vm_ops = &nv_drm_gem_vma_ops, 142 | +#endif 143 | }; 144 | 145 | 146 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c b/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c 147 | index e554adc..4aa082b 100644 148 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c 149 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c 150 | @@ -20,6 +20,7 @@ 151 | * DEALINGS IN THE SOFTWARE. 152 | */ 153 | 154 | +#include 155 | #include "nvidia-drm-conftest.h" 156 | 157 | #if defined(NV_DRM_AVAILABLE) 158 | @@ -58,6 +59,7 @@ static struct sg_table *__nv_drm_gem_user_memory_prime_get_sg_table( 159 | nv_user_memory->pages_count); 160 | } 161 | 162 | +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) 163 | static void *__nv_drm_gem_user_memory_prime_vmap( 164 | struct nv_drm_gem_object *nv_gem) 165 | { 166 | @@ -73,6 +75,28 @@ static void __nv_drm_gem_user_memory_prime_vunmap( 167 | { 168 | nv_drm_vunmap(address); 169 | } 170 | +#else 171 | +// Updated vmap/vunmap operations to use struct dma_buf_map instead of raw pointers 172 | +// See torvalds/linux commits ccc22d41bd9acec58cdc7c3b012e1887aba40af4, 6619ccf1bb1d0ebb071f758111efa83918b216fc 173 | +static int __nv_drm_gem_user_memory_prime_vmap( 174 | + struct nv_drm_gem_object *nv_gem, 175 | + struct dma_buf_map *map) 176 | +{ 177 | + struct nv_drm_gem_user_memory *nv_user_memory = to_nv_user_memory(nv_gem); 178 | + 179 | + map->vaddr = nv_drm_vmap(nv_user_memory->pages, 180 | + nv_user_memory->pages_count); 181 | + map->is_iomem = false; 182 | + return 0; 183 | +} 184 | + 185 | +static void __nv_drm_gem_user_memory_prime_vunmap( 186 | + struct nv_drm_gem_object *gem, 187 | + struct dma_buf_map *map) 188 | +{ 189 | + nv_drm_vunmap(map->vaddr); 190 | +} 191 | +#endif 192 | 193 | static int __nv_drm_gem_user_memory_mmap(struct nv_drm_gem_object *nv_gem, 194 | struct vm_area_struct *vma) 195 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-gem.c b/kernel-dkms/nvidia-drm/nvidia-drm-gem.c 196 | index a6b54f0..ca45362 100644 197 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-gem.c 198 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-gem.c 199 | @@ -20,6 +20,7 @@ 200 | * DEALINGS IN THE SOFTWARE. 201 | */ 202 | 203 | +#include 204 | #include "nvidia-drm-conftest.h" 205 | 206 | #if defined(NV_DRM_AVAILABLE) 207 | @@ -67,6 +68,13 @@ void nv_drm_gem_free(struct drm_gem_object *gem) 208 | static struct drm_gem_object_funcs nv_drm_gem_funcs = { 209 | .free = nv_drm_gem_free, 210 | .get_sg_table = nv_drm_gem_prime_get_sg_table, 211 | +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0)) 212 | + // New functions moved from drm_driver because of torvalds/linux commit d693def4fd1c23f1ca5aed1afb9993b3a2069ad2 213 | + .export = drm_gem_prime_export, 214 | + .vmap = nv_drm_gem_prime_vmap, 215 | + .vunmap = nv_drm_gem_prime_vunmap, 216 | + .vm_ops = &nv_drm_gem_vma_ops, 217 | +#endif 218 | }; 219 | #endif 220 | 221 | @@ -141,6 +149,7 @@ struct sg_table *nv_drm_gem_prime_get_sg_table(struct drm_gem_object *gem) 222 | return ERR_PTR(-ENOTSUPP); 223 | } 224 | 225 | +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) 226 | void *nv_drm_gem_prime_vmap(struct drm_gem_object *gem) 227 | { 228 | struct nv_drm_gem_object *nv_gem = to_nv_gem_object(gem); 229 | @@ -160,6 +169,29 @@ void nv_drm_gem_prime_vunmap(struct drm_gem_object *gem, void *address) 230 | nv_gem->ops->prime_vunmap(nv_gem, address); 231 | } 232 | } 233 | +#else 234 | +// Updated vmap/vunmap operations to use struct dma_buf_map instead of raw pointers 235 | +// See torvalds/linux commits ccc22d41bd9acec58cdc7c3b012e1887aba40af4, 6619ccf1bb1d0ebb071f758111efa83918b216fc 236 | +int nv_drm_gem_prime_vmap(struct drm_gem_object *gem, struct dma_buf_map *map) 237 | +{ 238 | + struct nv_drm_gem_object *nv_gem = to_nv_gem_object(gem); 239 | + 240 | + if (nv_gem->ops->prime_vmap != NULL) { 241 | + return nv_gem->ops->prime_vmap(nv_gem, map); 242 | + } 243 | + 244 | + return -ENOTSUPP; 245 | +} 246 | + 247 | +void nv_drm_gem_prime_vunmap(struct drm_gem_object *gem, struct dma_buf_map *map) 248 | +{ 249 | + struct nv_drm_gem_object *nv_gem = to_nv_gem_object(gem); 250 | + 251 | + if (nv_gem->ops->prime_vunmap != NULL) { 252 | + nv_gem->ops->prime_vunmap(nv_gem, map); 253 | + } 254 | +} 255 | +#endif 256 | 257 | #if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_RES_OBJ) 258 | nv_dma_resv_t* nv_drm_gem_prime_res_obj(struct drm_gem_object *obj) 259 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-gem.h b/kernel-dkms/nvidia-drm/nvidia-drm-gem.h 260 | index 5c9f33d..24576e2 100644 261 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-gem.h 262 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-gem.h 263 | @@ -23,6 +23,7 @@ 264 | #ifndef __NVIDIA_DRM_GEM_H__ 265 | #define __NVIDIA_DRM_GEM_H__ 266 | 267 | +#include 268 | #include "nvidia-drm-conftest.h" 269 | 270 | #if defined(NV_DRM_AVAILABLE) 271 | @@ -50,8 +51,15 @@ struct nv_drm_gem_object; 272 | struct nv_drm_gem_object_funcs { 273 | void (*free)(struct nv_drm_gem_object *nv_gem); 274 | struct sg_table *(*prime_get_sg_table)(struct nv_drm_gem_object *nv_gem); 275 | +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) 276 | void *(*prime_vmap)(struct nv_drm_gem_object *nv_gem); 277 | void (*prime_vunmap)(struct nv_drm_gem_object *nv_gem, void *address); 278 | +#else 279 | + // Updated vmap/vunmap operations to use struct dma_buf_map instead of raw pointers 280 | + // See torvalds/linux commits ccc22d41bd9acec58cdc7c3b012e1887aba40af4, 6619ccf1bb1d0ebb071f758111efa83918b216fc 281 | + int (*prime_vmap)(struct nv_drm_gem_object *nv_gem, struct dma_buf_map *map); 282 | + void (*prime_vunmap)(struct nv_drm_gem_object *nv_gem, struct dma_buf_map *map); 283 | +#endif 284 | struct drm_gem_object *(*prime_dup)(struct drm_device *dev, 285 | const struct nv_drm_gem_object *nv_gem_src); 286 | int (*mmap)(struct nv_drm_gem_object *nv_gem, struct vm_area_struct *vma); 287 | @@ -188,9 +196,17 @@ struct drm_gem_object *nv_drm_gem_prime_import(struct drm_device *dev, 288 | 289 | struct sg_table *nv_drm_gem_prime_get_sg_table(struct drm_gem_object *gem); 290 | 291 | +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) 292 | void *nv_drm_gem_prime_vmap(struct drm_gem_object *gem); 293 | 294 | void nv_drm_gem_prime_vunmap(struct drm_gem_object *gem, void *address); 295 | +#else 296 | +// Updated vmap/vunmap operations to use struct dma_buf_map instead of raw pointers 297 | +// See torvalds/linux commits ccc22d41bd9acec58cdc7c3b012e1887aba40af4, 6619ccf1bb1d0ebb071f758111efa83918b216fc 298 | +int nv_drm_gem_prime_vmap(struct drm_gem_object *gem, struct dma_buf_map *map); 299 | + 300 | +void nv_drm_gem_prime_vunmap(struct drm_gem_object *gem, struct dma_buf_map *map); 301 | +#endif 302 | 303 | #if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_RES_OBJ) 304 | nv_dma_resv_t* nv_drm_gem_prime_res_obj(struct drm_gem_object *obj); 305 | diff --git a/kernel-dkms/nvidia/nv-caps.c b/kernel-dkms/nvidia/nv-caps.c 306 | index 90e866f..5cde194 100644 307 | --- a/kernel-dkms/nvidia/nv-caps.c 308 | +++ b/kernel-dkms/nvidia/nv-caps.c 309 | @@ -37,8 +37,12 @@ MODULE_PARM_DESC(nv_cap_enable_devfs, "Enable (1) or disable (0) nv-caps " \ 310 | 311 | extern int NVreg_ModifyDeviceFiles; 312 | 313 | +#if NV_IS_EXPORT_SYMBOL_PRESENT_close_fd 314 | +#include 315 | +#else 316 | /* sys_close() or __close_fd() */ 317 | #include 318 | +#endif 319 | 320 | #define NV_CAP_DRV_MINOR_COUNT 8192 321 | 322 | @@ -586,7 +590,9 @@ void NV_API_CALL nv_cap_close_fd(int fd) 323 | * 2018-04-02 2ca2a09d6215 ("fs: add ksys_close() wrapper; remove in-kernel 324 | * calls to sys_close()") 325 | */ 326 | -#if NV_IS_EXPORT_SYMBOL_PRESENT___close_fd 327 | +#if NV_IS_EXPORT_SYMBOL_PRESENT_close_fd 328 | + close_fd(fd); 329 | +#elif NV_IS_EXPORT_SYMBOL_PRESENT___close_fd 330 | __close_fd(current->files, fd); 331 | #else 332 | sys_close(fd); 333 | diff --git a/kernel-dkms/nvidia/nvidia.Kbuild b/kernel-dkms/nvidia/nvidia.Kbuild 334 | index 90579de..c6f3614 100644 335 | --- a/kernel-dkms/nvidia/nvidia.Kbuild 336 | +++ b/kernel-dkms/nvidia/nvidia.Kbuild 337 | @@ -172,3 +172,4 @@ 338 | +NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_close_fd 339 | 340 | NV_CONFTEST_TYPE_COMPILE_TESTS += acpi_op_remove 341 | NV_CONFTEST_TYPE_COMPILE_TESTS += outer_flush_all 342 | -------------------------------------------------------------------------------- /patches/kernel-5.12.patch: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 2 | index ef89513..7f0707d 100644 3 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 4 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 5 | @@ -855,7 +855,9 @@ static void nv_drm_update_drm_driver_features(void) 6 | 7 | nv_drm_driver.dumb_create = nv_drm_dumb_create; 8 | nv_drm_driver.dumb_map_offset = nv_drm_dumb_map_offset; 9 | +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 12, 0)) 10 | nv_drm_driver.dumb_destroy = drm_gem_dumb_destroy; 11 | +#endif 12 | #endif /* NV_DRM_ATOMIC_MODESET_AVAILABLE */ 13 | } 14 | 15 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c b/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c 16 | index 89ab321..f29b644 100644 17 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c 18 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c 19 | @@ -208,7 +208,11 @@ struct nv_drm_gem_user_memory *nv_drm_gem_user_memory_import_sg_table( 20 | return NULL; 21 | } 22 | 23 | +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 12, 0)) 24 | if (drm_prime_sg_to_page_addr_arrays(sgt, pages, NULL, pages_count) < 0) { 25 | +#else 26 | + if (drm_prime_sg_to_page_array(sgt, pages, pages_count) < 0) { 27 | +#endif 28 | nv_drm_free(nv_user_memory); 29 | nv_drm_free(pages); 30 | return NULL; 31 | -------------------------------------------------------------------------------- /patches/kernel-5.14.patch: -------------------------------------------------------------------------------- 1 | From f18c541edc5e122b06b0c1e65d0a422f0b8109e7 Mon Sep 17 00:00:00 2001 2 | From: Joan Bruguera 3 | Date: Fri, 2 Jul 2021 02:09:58 +0200 4 | Subject: [PATCH] Tentative fix for NVIDIA 465.31 driver for Linux 5.14-rc1 5 | 6 | --- 7 | common/inc/nv-time.h | 6 ++++++ 8 | nvidia-drm/nvidia-drm-drv.c | 4 ++++ 9 | 2 files changed, 10 insertions(+) 10 | 11 | diff --git a/kernel-dkms/common/inc/nv-time.h b/kernel-dkms/common/inc/nv-time.h 12 | index dc80806..cc343a5 100644 13 | --- a/kernel-dkms/common/inc/nv-time.h 14 | +++ b/kernel-dkms/common/inc/nv-time.h 15 | @@ -23,6 +23,7 @@ 16 | #ifndef __NV_TIME_H__ 17 | #define __NV_TIME_H__ 18 | 19 | +#include 20 | #include "conftest.h" 21 | #include 22 | #include 23 | @@ -205,7 +206,12 @@ static inline NV_STATUS nv_sleep_ms(unsigned int ms) 24 | // the requested timeout has expired, loop until less 25 | // than a jiffie of the desired delay remains. 26 | // 27 | +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0)) 28 | current->state = TASK_INTERRUPTIBLE; 29 | +#else 30 | + // Rel. commit "sched: Change task_struct::state" (Peter Zijlstra, Jun 11 2021) 31 | + WRITE_ONCE(current->__state, TASK_INTERRUPTIBLE); 32 | +#endif 33 | do 34 | { 35 | schedule_timeout(jiffies); 36 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 37 | index 84d4479..99ea552 100644 38 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 39 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 40 | @@ -20,6 +20,7 @@ 41 | * DEALINGS IN THE SOFTWARE. 42 | */ 43 | 44 | +#include 45 | #include "nvidia-drm-conftest.h" /* NV_DRM_AVAILABLE and NV_DRM_DRM_GEM_H_PRESENT */ 46 | 47 | #include "nvidia-drm-priv.h" 48 | @@ -903,9 +904,12 @@ static void nv_drm_register_drm_device(const nv_gpu_info_t *gpu_info) 49 | 50 | dev->dev_private = nv_dev; 51 | nv_dev->dev = dev; 52 | +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0)) 53 | + // Rel. commit "drm: Remove pdev field from struct drm_device" (Thomas Zimmermann, 3 May 2021) 54 | if (device->bus == &pci_bus_type) { 55 | dev->pdev = to_pci_dev(device); 56 | } 57 | +#endif 58 | 59 | /* Register DRM device to DRM sub-system */ 60 | 61 | -- 62 | 2.32.0 63 | 64 | -------------------------------------------------------------------------------- /patches/kernel-5.16-std.diff: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/common/inc/nv.h a/kernel-dkms/common/inc/nv.h 2 | index 2ddaa25..40a3fd5 100644 3 | --- a/kernel-dkms/common/inc/nv.h 4 | +++ a/kernel-dkms/common/inc/nv.h 5 | @@ -17,13 +17,15 @@ 6 | #include 7 | 8 | #if defined(NV_KERNEL_INTERFACE_LAYER) && defined(__FreeBSD__) 9 | - #include // NULL 10 | + #include // NULL 11 | +#elif defined(NV_KERNEL_INTERFACE_LAYER) && defined(NV_LINUX) 12 | + #include // NULL 13 | #else 14 | - #include // NULL 15 | + #include // NULL 16 | #endif 17 | 18 | #include 19 | -#include 20 | +#include "nv_stdarg.h" 21 | #include 22 | #include 23 | #include 24 | diff --git a/kernel-dkms/common/inc/nv_stdarg.h a/kernel-dkms/common/inc/nv_stdarg.h 25 | new file mode 100644 26 | index 0000000..4b63340 27 | --- /dev/null 28 | +++ a/kernel-dkms/common/inc/nv_stdarg.h 29 | @@ -0,0 +1,39 @@ 30 | +/* 31 | + * SPDX-FileCopyrightText: Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 32 | + * SPDX-License-Identifier: MIT 33 | + * 34 | + * Permission is hereby granted, free of charge, to any person obtaining a 35 | + * copy of this software and associated documentation files (the "Software"), 36 | + * to deal in the Software without restriction, including without limitation 37 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 38 | + * and/or sell copies of the Software, and to permit persons to whom the 39 | + * Software is furnished to do so, subject to the following conditions: 40 | + * 41 | + * The above copyright notice and this permission notice shall be included in 42 | + * all copies or substantial portions of the Software. 43 | + * 44 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 45 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 46 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 47 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 48 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 49 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 50 | + * DEALINGS IN THE SOFTWARE. 51 | + */ 52 | + 53 | + 54 | +#ifndef _NV_STDARG_H_ 55 | +#define _NV_STDARG_H_ 56 | + 57 | +#if defined(NV_KERNEL_INTERFACE_LAYER) && defined(NV_LINUX) 58 | + #include "conftest.h" 59 | + #if defined(NV_LINUX_STDARG_H_PRESENT) 60 | + #include 61 | + #else 62 | + #include 63 | + #endif 64 | +#else 65 | + #include 66 | +#endif 67 | + 68 | +#endif // _NV_STDARG_H_ 69 | diff --git a/kernel-dkms/common/inc/os-interface.h a/kernel-dkms/common/inc/os-interface.h 70 | index b615773..dd3e7a8 100644 71 | --- a/kernel-dkms/common/inc/os-interface.h 72 | +++ a/kernel-dkms/common/inc/os-interface.h 73 | @@ -24,7 +24,7 @@ 74 | 75 | #include 76 | #include 77 | -#include 78 | +#include "nv_stdarg.h" 79 | #include 80 | #include 81 | 82 | diff --git a/kernel-dkms/common/inc/rm-gpu-ops.h a/kernel-dkms/common/inc/rm-gpu-ops.h 83 | index 67b252e..3302e72 100644 84 | --- a/kernel-dkms/common/inc/rm-gpu-ops.h 85 | +++ a/kernel-dkms/common/inc/rm-gpu-ops.h 86 | @@ -16,7 +16,7 @@ 87 | 88 | #include 89 | #include 90 | -#include 91 | +#include "nv_stdarg.h" 92 | #include 93 | #include 94 | #include 95 | diff --git a/kernel-dkms/conftest.sh a/kernel-dkms/conftest.sh 96 | index 1a1f89c..4ae52c7 100755 97 | --- a/kernel-dkms/conftest.sh 98 | +++ a/kernel-dkms/conftest.sh 99 | @@ -163,6 +163,7 @@ test_headers() { 100 | FILES="$FILES sound/hda_codec.h" 101 | FILES="$FILES linux/dma-buf.h" 102 | FILES="$FILES linux/time.h" 103 | + FILES="$FILES linux/stdarg.h" 104 | 105 | translate_and_preprocess_header_files $FILES 106 | } 107 | diff --git a/kernel-dkms/nvidia-modeset/nvidia-modeset-os-interface.h a/kernel-dkms/nvidia-modeset/nvidia-modeset-os-interface.h 108 | index 65130fd..720e0d2 100644 109 | --- a/kernel-dkms/nvidia-modeset/nvidia-modeset-os-interface.h 110 | +++ a/kernel-dkms/nvidia-modeset/nvidia-modeset-os-interface.h 111 | @@ -16,8 +16,14 @@ 112 | #if !defined(_NVIDIA_MODESET_OS_INTERFACE_H_) 113 | #define _NVIDIA_MODESET_OS_INTERFACE_H_ 114 | 115 | -#include /* size_t */ 116 | -#include /* va_list */ 117 | +#if defined(NV_KERNEL_INTERFACE_LAYER) && defined(__FreeBSD__) 118 | + #include // NULL 119 | +#elif defined(NV_KERNEL_INTERFACE_LAYER) && defined(NV_LINUX) 120 | + #include // NULL 121 | +#else 122 | + #include // NULL 123 | +#endif 124 | +#include "nv_stdarg.h" /* va_list */ 125 | 126 | #include "nvtypes.h" /* NvU8 */ 127 | 128 | diff --git a/kernel-dkms/nvidia-modeset/nvkms.h a/kernel-dkms/nvidia-modeset/nvkms.h 129 | index d46f97d..4180ed6 100644 130 | --- a/kernel-dkms/nvidia-modeset/nvkms.h 131 | +++ a/kernel-dkms/nvidia-modeset/nvkms.h 132 | @@ -9,7 +9,13 @@ 133 | #define __NV_KMS_H__ 134 | 135 | #include "nvtypes.h" 136 | -#include /* size_t */ 137 | +#if defined(NV_KERNEL_INTERFACE_LAYER) && defined(__FreeBSD__) 138 | + #include // NULL 139 | +#elif defined(NV_KERNEL_INTERFACE_LAYER) && defined(NV_LINUX) 140 | + #include // NULL 141 | +#else 142 | + #include // NULL 143 | +#endif 144 | 145 | #include "nvkms-kapi.h" 146 | 147 | diff --git a/kernel-dkms/nvidia-uvm/uvm_mmu.c a/kernel-dkms/nvidia-uvm/uvm_mmu.c 148 | index 68c77be..333da8b 100644 149 | --- a/kernel-dkms/nvidia-uvm/uvm_mmu.c 150 | +++ a/kernel-dkms/nvidia-uvm/uvm_mmu.c 151 | @@ -32,7 +32,7 @@ 152 | #include "uvm_push.h" 153 | #include "uvm_mem.h" 154 | #include "uvm_va_space.h" 155 | -#include 156 | +#include "nv_stdarg.h" 157 | 158 | 159 | 160 | diff --git a/kernel-dkms/nvidia/export_nvswitch.h a/kernel-dkms/nvidia/export_nvswitch.h 161 | index e45666c..618a3e7 100644 162 | --- a/kernel-dkms/nvidia/export_nvswitch.h 163 | +++ a/kernel-dkms/nvidia/export_nvswitch.h 164 | @@ -28,7 +28,7 @@ 165 | extern "C" { 166 | #endif 167 | 168 | -#include 169 | +#include "nv_stdarg.h" 170 | #include "nvlink_common.h" 171 | #include "ioctl_common_nvswitch.h" 172 | 173 | -------------------------------------------------------------------------------- /patches/kernel-5.16.patch: -------------------------------------------------------------------------------- 1 | --- a/kernel-dkms/nvidia-uvm/uvm_migrate_pageable.c 2021-10-22 08:48:04.000000000 +0200 2 | +++ b/kernel-dkms/nvidia-uvm/uvm_migrate_pageable_b.c 2021-11-29 17:50:22.467621809 +0100 3 | @@ -336,6 +336,10 @@ 4 | return dst_page; 5 | } 6 | 7 | +#ifndef MIGRATE_PFN_LOCKED 8 | +#define MIGRATE_PFN_LOCKED 0 9 | +#endif 10 | + 11 | static NV_STATUS migrate_vma_populate_anon_pages(struct vm_area_struct *vma, 12 | unsigned long *dst, 13 | unsigned long start, 14 | -------------------------------------------------------------------------------- /patches/kernel-5.17.patch: -------------------------------------------------------------------------------- 1 | From 026a2a54a234cdb7bf78c17be7ea29d8dcf9f390 Mon Sep 17 00:00:00 2001 2 | From: Joan Bruguera 3 | Date: Sun, 23 Jan 2022 16:28:18 +0100 4 | Subject: [PATCH] Tentative fix for NVIDIA 470.94 driver for Linux 5.17-rc1 5 | 6 | See also: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=359745d78351c6f5442435f81549f0207ece28aa 7 | 8 | --- 9 | common/inc/nv-procfs-utils.h | 3 +++ 10 | 1 file changed, 3 insertions(+) 11 | 12 | diff --git a/common/inc/nv-procfs-utils.h b/common/inc/nv-procfs-utils.h 13 | index 7c3e1a3..462eac1 100644 14 | --- a/kernel-dkms/common/inc/nv-procfs-utils.h 15 | +++ b/kernel-dkms/common/inc/nv-procfs-utils.h 16 | @@ -10,6 +10,7 @@ 17 | #ifndef _NV_PROCFS_UTILS_H 18 | #define _NV_PROCFS_UTILS_H 19 | 20 | +#include 21 | #include "conftest.h" 22 | 23 | #ifdef CONFIG_PROC_FS 24 | @@ -87,6 +88,8 @@ typedef struct file_operations nv_proc_ops_t; 25 | 26 | #if defined(NV_PDE_DATA_PRESENT) 27 | # define NV_PDE_DATA(inode) PDE_DATA(inode) 28 | +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0)) 29 | +# define NV_PDE_DATA(inode) pde_data(inode) 30 | #else 31 | # define NV_PDE_DATA(inode) PDE(inode)->data 32 | #endif 33 | -- 34 | 2.34.1 35 | 36 | -------------------------------------------------------------------------------- /patches/kernel-5.2.patch: -------------------------------------------------------------------------------- 1 | From 9b34e3b6b42a826fac66c8ff44e6260a09758c53 Mon Sep 17 00:00:00 2001 2 | From: Tk-Glitch 3 | Date: Mon, 8 Jul 2019 10:19:45 +0200 4 | Subject: nvidia kernel 5.2 patch 5 | 6 | 7 | diff --git a/kernel-dkms/nvidia-uvm/uvm8_tools.c b/kernel-dkms/nvidia-uvm/uvm8_tools.c 8 | index 82c890587..cea2eb54c 100644 9 | --- a/kernel-dkms/nvidia-uvm/uvm8_tools.c 10 | +++ b/kernel-dkms/nvidia-uvm/uvm8_tools.c 11 | @@ -206,18 +206,34 @@ static bool tracker_is_counter(uvm_tools_event_tracker_t *event_tracker) 12 | return event_tracker != NULL && !event_tracker->is_queue; 13 | } 14 | 15 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0) 16 | +static void uvm_put_user_pages_dirty(struct page **pages, NvU64 page_count) 17 | +{ 18 | + NvU64 i; 19 | + 20 | + for (i = 0; i < page_count; i++) { 21 | + set_page_dirty(pages[i]); 22 | + put_page(pages[i]); 23 | + } 24 | +} 25 | +#else 26 | static void put_user_pages(struct page **pages, NvU64 page_count) 27 | { 28 | NvU64 i; 29 | for (i = 0; i < page_count; i++) 30 | put_page(pages[i]); 31 | } 32 | +#endif 33 | 34 | static void unmap_user_pages(struct page **pages, void *addr, NvU64 size) 35 | { 36 | size = DIV_ROUND_UP(size, PAGE_SIZE); 37 | vunmap((NvU8 *)addr); 38 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0) 39 | + uvm_put_user_pages_dirty(pages, size); 40 | +#else 41 | put_user_pages(pages, size); 42 | +#endif 43 | uvm_kvfree(pages); 44 | } 45 | 46 | @@ -281,7 +297,11 @@ fail: 47 | uvm_kvfree(vmas); 48 | 49 | if (ret > 0) 50 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0) 51 | + uvm_put_user_pages_dirty(*pages, ret); 52 | +#else 53 | put_user_pages(*pages, ret); 54 | +#endif 55 | else if (ret < 0) 56 | status = errno_to_nv_status(ret); 57 | 58 | -------------------------------------------------------------------------------- /patches/kernel-5.3.patch: -------------------------------------------------------------------------------- 1 | From 635b901ffad338c398a0e2570e990b0df66dd12f Mon Sep 17 00:00:00 2001 2 | From: Tk-Glitch 3 | Date: Mon, 22 Jul 2019 13:29:48 +0200 4 | Subject: nvidia kernel 5.3 patch 5 | 6 | 7 | diff --git a/kernel-dkms/common/inc/nv-linux.h b/kernel-dkms/common/inc/nv-linux.h 8 | index 9341e676b..41289217e 100644 9 | --- a/kernel-dkms/common/inc/nv-linux.h 10 | +++ b/kernel-dkms/common/inc/nv-linux.h 11 | @@ -475,7 +475,11 @@ extern int nv_pat_mode; 12 | __cpuc_flush_kern_all(); 13 | } 14 | #define CACHE_FLUSH() nv_flush_cache_cpu(NULL) 15 | -#define CACHE_FLUSH_ALL() NV_ON_EACH_CPU(nv_flush_cache_cpu, NULL) 16 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0) 17 | +#define CACHE_FLUSH_ALL() on_each_cpu(nv_flush_cache_cpu, NULL, 1) 18 | +#else 19 | +#define CACHE_FLUSH_ALL() NV_ON_EACH_CPU(nv_flush_cache_cpu, NULL) 20 | +#endif 21 | #if defined(NV_OUTER_FLUSH_ALL_PRESENT) 22 | #define OUTER_FLUSH_ALL() outer_flush_all() 23 | #endif 24 | @@ -489,7 +493,11 @@ extern int nv_pat_mode; 25 | flush_cache_all(); 26 | } 27 | #define CACHE_FLUSH() nv_flush_cache_cpu(NULL) 28 | -#define CACHE_FLUSH_ALL() NV_ON_EACH_CPU(nv_flush_cache_cpu, NULL) 29 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0) 30 | +#define CACHE_FLUSH_ALL() on_each_cpu(nv_flush_cache_cpu, NULL, 1) 31 | +#else 32 | +#define CACHE_FLUSH_ALL() NV_ON_EACH_CPU(nv_flush_cache_cpu, NULL) 33 | +#endif 34 | #define WRITE_COMBINE_FLUSH() mb() 35 | #endif 36 | #elif defined(NVCPU_PPC64LE) 37 | 38 | diff --git a/kernel-dkms/nvidia/nv_uvm_interface.c b/kernel-dkms/nvidia/nv_uvm_interface.c 39 | index e96b04e0c..18d80b09f 100644 40 | --- a/kernel-dkms/nvidia/nv_uvm_interface.c 41 | +++ b/kernel-dkms/nvidia/nv_uvm_interface.c 42 | @@ -988,7 +988,11 @@ void nvUvmInterfaceDeRegisterUvmOps(void) 43 | // Note that since we dropped the lock, another set of callbacks could have 44 | // already been registered. That's ok, since we just need to wait for old 45 | // ones to finish. 46 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0) 47 | + on_each_cpu(flush_top_half, NULL, 1); 48 | +#else 49 | NV_ON_EACH_CPU(flush_top_half, NULL); 50 | +#endif 51 | } 52 | EXPORT_SYMBOL(nvUvmInterfaceDeRegisterUvmOps); 53 | 54 | -------------------------------------------------------------------------------- /patches/kernel-5.4-prime.diff: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh 2 | index c9c2db3..a10463d 100755 3 | --- a/kernel-dkms/conftest.sh 4 | +++ b/kernel-dkms/conftest.sh 5 | @@ -130,6 +130,7 @@ test_headers() { 6 | FILES="$FILES linux/sched/signal.h" 7 | FILES="$FILES linux/sched/task.h" 8 | FILES="$FILES linux/sched/task_stack.h" 9 | + FILES="$FILES linux/reservation.h" 10 | FILES="$FILES xen/ioemu.h" 11 | FILES="$FILES linux/fence.h" 12 | FILES="$FILES soc/tegra/chip-id.h" 13 | @@ -2063,7 +2064,7 @@ compile_test() { 14 | CODE=" 15 | #include 16 | int conftest_drm_driver_has_gem_prime_res_obj(void) { 17 | - return offsetof(struct drm_driver, gem_prime_res_obj); 18 | + //return offsetof(struct drm_driver, gem_prime_res_obj); 19 | }" 20 | 21 | compile_check_conftest "$CODE" "NV_DRM_DRIVER_HAS_GEM_PRIME_RES_OBJ" "" "types" 22 | diff --git a/kernel-dkms/nvidia-drm/nvidia-dma-fence-helper.h b/kernel-dkms/nvidia-drm/nvidia-dma-fence-helper.h 23 | index 0aa5a4f..f289636 100644 24 | --- a/kernel-dkms/nvidia-drm/nvidia-dma-fence-helper.h 25 | +++ b/kernel-dkms/nvidia-drm/nvidia-dma-fence-helper.h 26 | @@ -40,7 +40,9 @@ 27 | #include 28 | #endif 29 | 30 | +#if defined(NV_LINUX_RESERVATION_H_PRESENT) 31 | #include 32 | +#endif 33 | 34 | #if defined(NV_LINUX_FENCE_H_PRESENT) 35 | typedef struct fence nv_dma_fence_t; 36 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 37 | index a66d3cc..b79330a 100644 38 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 39 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 40 | @@ -681,7 +681,7 @@ static struct drm_driver nv_drm_driver = { 41 | .gem_prime_vunmap = nv_drm_gem_prime_vunmap, 42 | 43 | #if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_RES_OBJ) 44 | - .gem_prime_res_obj = nv_drm_gem_prime_res_obj, 45 | + //.gem_prime_res_obj = nv_drm_gem_prime_res_obj, 46 | #endif 47 | 48 | #if defined(NV_DRM_DRIVER_HAS_SET_BUSID) 49 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-gem.c b/kernel-dkms/nvidia-drm/nvidia-drm-gem.c 50 | index 7201ade..d58f4f0 100644 51 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-gem.c 52 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-gem.c 53 | @@ -46,7 +46,7 @@ void nv_drm_gem_free(struct drm_gem_object *gem) 54 | drm_gem_object_release(&nv_gem->base); 55 | 56 | #if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_RES_OBJ) 57 | - reservation_object_fini(&nv_gem->resv); 58 | + dma_resv_fini(&nv_gem->resv); 59 | #endif 60 | 61 | nv_gem->ops->free(nv_gem); 62 | @@ -113,12 +113,14 @@ void nv_drm_gem_prime_vunmap(struct drm_gem_object *gem, void *address) 63 | } 64 | 65 | #if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_RES_OBJ) 66 | +/* 67 | struct reservation_object* nv_drm_gem_prime_res_obj(struct drm_gem_object *obj) 68 | { 69 | struct nv_drm_gem_object *nv_gem = to_nv_gem_object(obj); 70 | 71 | return &nv_gem->resv; 72 | } 73 | +*/ 74 | #endif 75 | 76 | #endif /* NV_DRM_AVAILABLE */ 77 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-gem.h b/kernel-dkms/nvidia-drm/nvidia-drm-gem.h 78 | index b621969..e671795 100644 79 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-gem.h 80 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-gem.h 81 | @@ -56,7 +56,7 @@ struct nv_drm_gem_object { 82 | const struct nv_drm_gem_object_funcs *ops; 83 | 84 | #if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_RES_OBJ) 85 | - struct reservation_object resv; 86 | + struct dma_resv resv; 87 | #endif 88 | }; 89 | 90 | @@ -127,7 +127,7 @@ void nv_drm_gem_object_init(struct nv_drm_device *nv_dev, 91 | drm_gem_private_object_init(dev, &nv_gem->base, size); 92 | 93 | #if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_RES_OBJ) 94 | - reservation_object_init(&nv_gem->resv); 95 | + dma_resv_init(&nv_gem->resv); 96 | #endif 97 | } 98 | 99 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-prime-fence.c b/kernel-dkms/nvidia-drm/nvidia-drm-prime-fence.c 100 | index 1f10940..5114965 100644 101 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-prime-fence.c 102 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-prime-fence.c 103 | @@ -518,7 +518,7 @@ int nv_drm_gem_fence_attach_ioctl(struct drm_device *dev, 104 | goto fence_context_create_fence_failed; 105 | } 106 | 107 | - reservation_object_add_excl_fence(&nv_gem->resv, fence); 108 | + dma_resv_add_excl_fence(&nv_gem->resv, fence); 109 | 110 | ret = 0; 111 | -------------------------------------------------------------------------------- /patches/kernel-5.4-symver.diff: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh 2 | index c00c826..40c54f6 100755 3 | --- a/kernel-dkms/conftest.sh 4 | +++ b/kernel-dkms/conftest.sh 5 | @@ -3585,7 +3585,7 @@ case "$5" in 6 | TAB=' ' 7 | 8 | if [ -f "$OUTPUT/Module.symvers" ] && \ 9 | - grep -e "^[^${TAB}]*${TAB}[^${TAB}]*${TAB}vmlinux" \ 10 | + grep -e "^[^${TAB}]*${TAB}[^${TAB}]*.*${TAB}vmlinux" \ 11 | "$OUTPUT/Module.symvers" >/dev/null 2>&1; then 12 | exit 0 13 | fi 14 | -------------------------------------------------------------------------------- /patches/kernel-5.4.patch: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/Kbuild b/kernel-dkms/Kbuild 2 | index 1e79d0b..c587f7e 100644 3 | --- a/kernel-dkms/Kbuild 4 | +++ b/kernel-dkms/Kbuild 5 | @@ -27,10 +27,17 @@ 6 | # $(2): The CFLAGS to add for those object files. 7 | # 8 | 9 | +ifeq ($(shell [ $(VERSION) -gt 5 ] || [ $(VERSION) -eq 5 -a $(PATCHLEVEL) -gt 3 ]; echo $$? ),0) 10 | +ASSIGN_PER_OBJ_CFLAGS = \ 11 | + $(foreach _cflags_variable, \ 12 | + $(addprefix CFLAGS_,$(1)), \ 13 | + $(eval $(_cflags_variable) += $(2))) 14 | +else 15 | ASSIGN_PER_OBJ_CFLAGS = \ 16 | $(foreach _cflags_variable, \ 17 | $(addprefix CFLAGS_,$(notdir $(1))), \ 18 | $(eval $(_cflags_variable) += $(2))) 19 | +endif 20 | 21 | 22 | # 23 | diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh 24 | index c00c826..40c54f6 100755 25 | --- a/kernel-dkms/conftest.sh 26 | +++ b/kernel-dkms/conftest.sh 27 | @@ -3585,7 +3585,7 @@ case "$5" in 28 | TAB=' ' 29 | 30 | if [ -f "$OUTPUT/Module.symvers" ] && \ 31 | - grep -e "^[^${TAB}]*${TAB}[^${TAB}]*${TAB}vmlinux" \ 32 | + grep -e "^[^${TAB}]*${TAB}[^${TAB}]*.*${TAB}vmlinux" \ 33 | "$OUTPUT/Module.symvers" >/dev/null 2>&1; then 34 | exit 0 35 | fi 36 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 37 | index bc31de7..7eefe95 100644 38 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 39 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 40 | @@ -659,7 +660,11 @@ static const struct drm_ioctl_desc nv_drm_ioctls[] = { 41 | 42 | static struct drm_driver nv_drm_driver = { 43 | 44 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0) 45 | .driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_RENDER, 46 | +#else 47 | + .driver_features = DRIVER_GEM | DRIVER_RENDER, 48 | +#endif 49 | 50 | .gem_free_object = nv_drm_gem_free, 51 | 52 | -------------------------------------------------------------------------------- /patches/kernel-5.5.patch: -------------------------------------------------------------------------------- 1 | From 18e69d251b7fd3e19adc8a1dabd883641c585455 Mon Sep 17 00:00:00 2001 2 | From: Tk-Glitch 3 | Date: Mon, 18 Dec 2019 14:11:36 +0100 4 | Subject: Updated 5.5 patch, from Isaak I. Aleksandrov - https://gitlab.com/snippets/1923197 5 | 6 | 7 | diff --git a/kernel-dkms/common/inc/nv-drm.h b/kernel-dkms/common/inc/nv-drm.h 8 | new file mode 100644 9 | index 0000000..07e9f3c 10 | --- /dev/null 11 | +++ b/kernel-dkms/common/inc/nv-drm.h 12 | @@ -0,0 +1,36 @@ 13 | +#ifndef _NV_DRM_H_ 14 | +#define _NV_DRM_H_ 15 | + 16 | +#include "conftest.h" 17 | + 18 | +#if defined(NV_DRM_DRMP_H_PRESENT) 19 | +#include 20 | +#else 21 | +#include 22 | +#include 23 | +#include 24 | +#include 25 | +#include 26 | +#include 27 | +#include 28 | +#include 29 | +#include 30 | +#include 31 | + 32 | +#include 33 | +#include 34 | + 35 | +#include 36 | +#include 37 | +#include 38 | +#include 39 | +#include 40 | +#include 41 | +#include 42 | +#include 43 | +#include 44 | + 45 | +#include 46 | +#endif 47 | + 48 | +#endif 49 | diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh 50 | index c9c2db3..dd22bb0 100755 51 | --- a/kernel-dkms/conftest.sh 52 | +++ b/kernel-dkms/conftest.sh 53 | @@ -1150,6 +1150,9 @@ compile_test() { 54 | CODE=" 55 | #if defined(NV_DRM_DRMP_H_PRESENT) 56 | #include 57 | + #else 58 | + #include 59 | + #include 60 | #endif 61 | #if !defined(CONFIG_DRM) && !defined(CONFIG_DRM_MODULE) 62 | #error DRM not enabled 63 | @@ -1781,6 +1784,8 @@ compile_test() { 64 | echo "$CONFTEST_PREAMBLE 65 | #if defined(NV_DRM_DRMP_H_PRESENT) 66 | #include 67 | + #else 68 | + #include 69 | #endif 70 | #include 71 | #if !defined(CONFIG_DRM) && !defined(CONFIG_DRM_MODULE) 72 | @@ -1909,7 +1914,11 @@ compile_test() { 73 | # attached drivers") in v3.14 (2013-12-11) 74 | # 75 | CODE=" 76 | + #if defined(NV_DRM_DRMP_H_PRESENT) 77 | #include 78 | + #else 79 | + #include 80 | + #endif 81 | int conftest_drm_driver_has_legacy_dev_list(void) { 82 | return offsetof(struct drm_driver, legacy_dev_list); 83 | }" 84 | @@ -1933,7 +1942,11 @@ compile_test() { 85 | # 2017-07-23 e6fc3b68558e4c6d8d160b5daf2511b99afa8814 86 | # 87 | CODE=" 88 | + #if defined(NV_DRM_DRMP_H_PRESENT) 89 | #include 90 | + #else 91 | + #include 92 | + #endif 93 | 94 | int conftest_drm_crtc_init_with_planes_has_name_arg(void) { 95 | return 96 | @@ -1949,7 +1962,11 @@ compile_test() { 97 | compile_check_conftest "$CODE" "NV_DRM_CRTC_INIT_WITH_PLANES_HAS_NAME_ARG" "" "types" 98 | 99 | CODE=" 100 | + #if defined(NV_DRM_DRMP_H_PRESENT) 101 | #include 102 | + #else 103 | + #include 104 | + #endif 105 | 106 | int conftest_drm_encoder_init_has_name_arg(void) { 107 | return 108 | @@ -1964,7 +1981,11 @@ compile_test() { 109 | compile_check_conftest "$CODE" "NV_DRM_ENCODER_INIT_HAS_NAME_ARG" "" "types" 110 | 111 | echo "$CONFTEST_PREAMBLE 112 | + #if defined(NV_DRM_DRMP_H_PRESENT) 113 | #include 114 | + #else 115 | + #include 116 | + #endif 117 | 118 | int conftest_drm_universal_plane_init_has_format_modifiers_arg(void) { 119 | return 120 | @@ -1991,7 +2012,11 @@ compile_test() { 121 | echo "#undef NV_DRM_UNIVERSAL_PLANE_INIT_HAS_FORMAT_MODIFIERS_ARG" | append_conftest "types" 122 | 123 | echo "$CONFTEST_PREAMBLE 124 | + #if defined(NV_DRM_DRMP_H_PRESENT) 125 | #include 126 | + #else 127 | + #include 128 | + #endif 129 | 130 | int conftest_drm_universal_plane_init_has_name_arg(void) { 131 | return 132 | @@ -3084,7 +3109,9 @@ compile_test() { 133 | # drm_framebuffer_{get,put}()") in v4.12 (2017-02-28). 134 | # 135 | CODE=" 136 | + #if defined(NV_DRM_DRMP_H_PRESENT) 137 | #include 138 | + #endif 139 | #if defined(NV_DRM_DRM_FRAMEBUFFER_H_PRESENT) 140 | #include 141 | #endif 142 | @@ -3103,7 +3130,9 @@ compile_test() { 143 | # drm_gem_object_{get,put}()") in v4.12 (2017-02-28). 144 | # 145 | CODE=" 146 | + #if defined(NV_DRM_DRMP_H_PRESENT) 147 | #include 148 | + #endif 149 | #if defined(NV_DRM_DRM_GEM_H_PRESENT) 150 | #include 151 | #endif 152 | @@ -3122,7 +3151,9 @@ compile_test() { 153 | # functions") in v4.15 (2017-09-26). 154 | # 155 | CODE=" 156 | + #if defined(NV_DRM_DRMP_H_PRESENT) 157 | #include 158 | + #endif 159 | #if defined(NV_DRM_DRM_DRV_H_PRESENT) 160 | #include 161 | #endif 162 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-connector.c b/kernel-dkms/nvidia-drm/nvidia-drm-connector.c 163 | index 1553ebc..f851561 100644 164 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-connector.c 165 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-connector.c 166 | @@ -71,7 +73,11 @@ static enum drm_connector_status __nv_drm_connector_detect_internal( 167 | struct nv_drm_encoder *nv_detected_encoder = NULL; 168 | 169 | struct NvKmsKapiDynamicDisplayParams *pDetectParams = NULL; 170 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 5, 0) 171 | unsigned int i; 172 | +#else 173 | + struct drm_encoder *encoder = NULL; 174 | +#endif 175 | 176 | BUG_ON(!mutex_is_locked(&dev->mode_config.mutex)); 177 | 178 | @@ -87,11 +93,16 @@ static enum drm_connector_status __nv_drm_connector_detect_internal( 179 | goto done; 180 | } 181 | 182 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 5, 0) 183 | for (i = 0; 184 | i < DRM_CONNECTOR_MAX_ENCODER && detected_encoder == NULL; i++) { 185 | struct drm_encoder *encoder; 186 | +#else 187 | + drm_connector_for_each_possible_encoder(connector, encoder) { 188 | +#endif 189 | struct nv_drm_encoder *nv_encoder; 190 | 191 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 5, 0) 192 | if (connector->encoder_ids[i] == 0) { 193 | break; 194 | } 195 | @@ -102,6 +113,7 @@ static enum drm_connector_status __nv_drm_connector_detect_internal( 196 | BUG_ON(encoder != NULL); 197 | continue; 198 | } 199 | +#endif 200 | 201 | /* 202 | * DVI-I connectors can drive both digital and analog 203 | @@ -169,6 +181,8 @@ static enum drm_connector_status __nv_drm_connector_detect_internal( 204 | } 205 | 206 | detected_encoder = encoder; 207 | + 208 | + break; 209 | } 210 | } 211 | 212 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-connector.h b/kernel-dkms/nvidia-drm/nvidia-drm-connector.h 213 | index f74e22c..099390d 100644 214 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-connector.h 215 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-connector.h 216 | @@ -27,7 +27,7 @@ 217 | 218 | #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) 219 | 220 | -#include 221 | +#include "nv-drm.h" 222 | 223 | #include "nvtypes.h" 224 | #include "nvkms-api-types.h" 225 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-crtc.h b/kernel-dkms/nvidia-drm/nvidia-drm-crtc.h 226 | index 31ef3b5..5de3a51 100644 227 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-crtc.h 228 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-crtc.h 229 | @@ -29,7 +29,7 @@ 230 | 231 | #include "nvidia-drm-helper.h" 232 | 233 | -#include 234 | +#include "nv-drm.h" 235 | #include "nvtypes.h" 236 | #include "nvkms-kapi.h" 237 | 238 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 239 | index a66d3cc..06bf859 100644 240 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 241 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 242 | @@ -39,7 +39,7 @@ 243 | 244 | #include "nvidia-drm-ioctl.h" 245 | 246 | -#include 247 | +#include "nv-drm.h" 248 | 249 | /* 250 | * Commit fcd70cd36b9b ("drm: Split out drm_probe_helper.h") 251 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-encoder.h b/kernel-dkms/nvidia-drm/nvidia-drm-encoder.h 252 | index bbaf986..af341a8 100644 253 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-encoder.h 254 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-encoder.h 255 | @@ -32,7 +32,7 @@ 256 | #if defined(NV_DRM_DRM_ENCODER_H_PRESENT) 257 | #include 258 | #else 259 | -#include 260 | +#include "nv-drm.h" 261 | #endif 262 | 263 | #include "nvkms-kapi.h" 264 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-fb.h b/kernel-dkms/nvidia-drm/nvidia-drm-fb.h 265 | index 7f292ce..d13bc4c 100644 266 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-fb.h 267 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-fb.h 268 | @@ -27,7 +27,7 @@ 269 | 270 | #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) 271 | 272 | -#include 273 | +#include "nv-drm.h" 274 | #include "nvidia-drm-gem-nvkms-memory.h" 275 | #include "nvkms-kapi.h" 276 | 277 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-gem.h b/kernel-dkms/nvidia-drm/nvidia-drm-gem.h 278 | index b621969..326f810 100644 279 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-gem.h 280 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-gem.h 281 | @@ -29,7 +29,7 @@ 282 | 283 | #include "nvidia-drm-priv.h" 284 | 285 | -#include 286 | +#include "nv-drm.h" 287 | #include "nvkms-kapi.h" 288 | 289 | #if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_RES_OBJ) 290 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-helper.c b/kernel-dkms/nvidia-drm/nvidia-drm-helper.c 291 | index da602ac..e5d6daa 100644 292 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-helper.c 293 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-helper.c 294 | @@ -31,7 +31,7 @@ 295 | 296 | #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) 297 | 298 | -#include 299 | +#include "nv-drm.h" 300 | #if defined(NV_DRM_DRM_ATOMIC_UAPI_H_PRESENT) 301 | #include 302 | #endif 303 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-helper.h b/kernel-dkms/nvidia-drm/nvidia-drm-helper.h 304 | index 8f050d8..71c4b90 100644 305 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-helper.h 306 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-helper.h 307 | @@ -27,7 +27,7 @@ 308 | 309 | #if defined(NV_DRM_AVAILABLE) 310 | 311 | -#include 312 | +#include "nv-drm.h" 313 | 314 | /* 315 | * drm_dev_put() is added by commit 9a96f55034e41b4e002b767e9218d55f03bdff7d 316 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-modeset.h b/kernel-dkms/nvidia-drm/nvidia-drm-modeset.h 317 | index 06659c5..e9d7b70 100644 318 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-modeset.h 319 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-modeset.h 320 | @@ -27,7 +27,7 @@ 321 | 322 | #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) 323 | 324 | -#include 325 | +#include "nv-drm.h" 326 | 327 | struct drm_atomic_state *nv_drm_atomic_state_alloc(struct drm_device *dev); 328 | void nv_drm_atomic_state_clear(struct drm_atomic_state *state); 329 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-os-interface.h b/kernel-dkms/nvidia-drm/nvidia-drm-os-interface.h 330 | index f43f851..7f4ff8b 100644 331 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-os-interface.h 332 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-os-interface.h 333 | @@ -29,7 +29,7 @@ 334 | 335 | #if defined(NV_DRM_AVAILABLE) 336 | 337 | -#include 338 | +#include "nv-drm.h" 339 | 340 | /* Set to true when the atomic modeset feature is enabled. */ 341 | extern bool nv_drm_modeset_module_param; 342 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-prime-fence.h b/kernel-dkms/nvidia-drm/nvidia-drm-prime-fence.h 343 | index 20da923..f3cc2b4 100644 344 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-prime-fence.h 345 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-prime-fence.h 346 | @@ -27,7 +27,7 @@ 347 | 348 | #if defined(NV_DRM_AVAILABLE) 349 | 350 | -#include 351 | +#include "nv-drm.h" 352 | 353 | #if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_RES_OBJ) 354 | 355 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-priv.h b/kernel-dkms/nvidia-drm/nvidia-drm-priv.h 356 | index 9076835..77a95f3 100644 357 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-priv.h 358 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-priv.h 359 | @@ -27,7 +27,7 @@ 360 | 361 | #if defined(NV_DRM_AVAILABLE) 362 | 363 | -#include 364 | +#include "nv-drm.h" 365 | 366 | #if defined(NV_DRM_DRM_GEM_H_PRESENT) 367 | #include 368 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-utils.h b/kernel-dkms/nvidia-drm/nvidia-drm-utils.h 369 | index 6d24120..95190c4 100644 370 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-utils.h 371 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-utils.h 372 | @@ -27,7 +27,7 @@ 373 | 374 | #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) 375 | 376 | -#include 377 | +#include "nv-drm.h" 378 | #include "nvkms-kapi.h" 379 | 380 | struct NvKmsKapiConnectorInfo* 381 | -------------------------------------------------------------------------------- /patches/kernel-5.6.patch: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/nvidia/nvidia.Kbuild b/kernel-dkms/nvidia/nvidia.Kbuild 2 | index 5ec3e65..2897e31 100644 3 | --- a/kernel-dkms/nvidia/nvidia.Kbuild 4 | +++ b/kernel-dkms/nvidia/nvidia.Kbuild 5 | @@ -150,6 +151,7 @@ NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_swiotlb_dma_ops 6 | NV_CONFTEST_TYPE_COMPILE_TESTS += acpi_op_remove 7 | NV_CONFTEST_TYPE_COMPILE_TESTS += outer_flush_all 8 | NV_CONFTEST_TYPE_COMPILE_TESTS += file_operations 9 | +NV_CONFTEST_TYPE_COMPILE_TESTS += proc_ops 10 | NV_CONFTEST_TYPE_COMPILE_TESTS += file_inode 11 | NV_CONFTEST_TYPE_COMPILE_TESTS += kuid_t 12 | NV_CONFTEST_TYPE_COMPILE_TESTS += dma_ops 13 | 14 | diff --git a/kernel-dkms/common/inc/nv-procfs.h b/kernel-dkms/common/inc/nv-procfs.h 15 | index 8b53f86..4c5aceb 100644 16 | --- a/kernel-dkms/common/inc/nv-procfs.h 17 | +++ b/kernel-dkms/common/inc/nv-procfs.h 18 | @@ -28,6 +28,18 @@ 19 | 20 | #define IS_EXERCISE_ERROR_FORWARDING_ENABLED() (EXERCISE_ERROR_FORWARDING) 21 | 22 | +#if defined(NV_HAVE_PROC_OPS) 23 | +#define NV_CREATE_PROC_FILE(filename,parent,__name,__data) \ 24 | + ({ \ 25 | + struct proc_dir_entry *__entry; \ 26 | + int mode = (S_IFREG | S_IRUGO); \ 27 | + const struct proc_ops *fops = &nv_procfs_##__name##_fops; \ 28 | + if (fops->proc_write != 0) \ 29 | + mode |= S_IWUSR; \ 30 | + __entry = proc_create_data(filename, mode, parent, fops, __data);\ 31 | + __entry; \ 32 | + }) 33 | +#else 34 | #define NV_CREATE_PROC_FILE(filename,parent,__name,__data) \ 35 | ({ \ 36 | struct proc_dir_entry *__entry; \ 37 | @@ -38,6 +50,7 @@ 38 | __entry = proc_create_data(filename, mode, parent, fops, __data);\ 39 | __entry; \ 40 | }) 41 | +#endif 42 | 43 | /* 44 | * proc_mkdir_mode exists in Linux 2.6.9, but isn't exported until Linux 3.0. 45 | @@ -77,6 +90,44 @@ 46 | remove_proc_entry(entry->name, entry->parent); 47 | #endif 48 | 49 | +#if defined(NV_HAVE_PROC_OPS) 50 | +#define NV_DEFINE_SINGLE_PROCFS_FILE(name, open_callback, close_callback) \ 51 | + static int nv_procfs_open_##name( \ 52 | + struct inode *inode, \ 53 | + struct file *filep \ 54 | + ) \ 55 | + { \ 56 | + int ret; \ 57 | + ret = single_open(filep, nv_procfs_read_##name, \ 58 | + NV_PDE_DATA(inode)); \ 59 | + if (ret < 0) \ 60 | + { \ 61 | + return ret; \ 62 | + } \ 63 | + ret = open_callback(); \ 64 | + if (ret < 0) \ 65 | + { \ 66 | + single_release(inode, filep); \ 67 | + } \ 68 | + return ret; \ 69 | + } \ 70 | + \ 71 | + static int nv_procfs_release_##name( \ 72 | + struct inode *inode, \ 73 | + struct file *filep \ 74 | + ) \ 75 | + { \ 76 | + close_callback(); \ 77 | + return single_release(inode, filep); \ 78 | + } \ 79 | + \ 80 | + static const struct proc_ops nv_procfs_##name##_fops = { \ 81 | + .proc_open = nv_procfs_open_##name, \ 82 | + .proc_read = seq_read, \ 83 | + .proc_lseek = seq_lseek, \ 84 | + .proc_release = nv_procfs_release_##name, \ 85 | + }; 86 | +#else 87 | #define NV_DEFINE_SINGLE_PROCFS_FILE(name, open_callback, close_callback) \ 88 | static int nv_procfs_open_##name( \ 89 | struct inode *inode, \ 90 | @@ -114,6 +165,7 @@ 91 | .llseek = seq_lseek, \ 92 | .release = nv_procfs_release_##name, \ 93 | }; 94 | +#endif 95 | 96 | #endif /* CONFIG_PROC_FS */ 97 | 98 | diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh 99 | index 57d85a4..4902248 100755 100 | --- a/kernel-dkms/conftest.sh 101 | +++ b/kernel-dkms/conftest.sh 102 | @@ -806,6 +822,16 @@ compile_test() { 103 | compile_check_conftest "$CODE" "NV_FILE_OPERATIONS_HAS_IOCTL" "" "types" 104 | ;; 105 | 106 | + proc_ops) 107 | + CODE=" 108 | + #include 109 | + int conftest_proc_ops(void) { 110 | + return offsetof(struct proc_ops, proc_open); 111 | + }" 112 | + 113 | + compile_check_conftest "$CODE" "NV_HAVE_PROC_OPS" "" "types" 114 | + ;; 115 | + 116 | sg_alloc_table) 117 | # 118 | # sg_alloc_table_from_pages added by commit efc42bc98058 119 | diff --git a/kernel-dkms/nvidia/nv-procfs.c b/kernel-dkms/nvidia/nv-procfs.c 120 | index 064d727..a7308d3 100644 121 | --- a/kernel-dkms/nvidia/nv-procfs.c 122 | +++ b/kernel-dkms/nvidia/nv-procfs.c 123 | @@ -452,6 +452,15 @@ done: 124 | return ((status < 0) ? status : (int)count); 125 | } 126 | 127 | +#if defined(NV_HAVE_PROC_OPS) 128 | +static struct proc_ops nv_procfs_registry_fops = { 129 | + .proc_open = nv_procfs_open_registry, 130 | + .proc_read = seq_read, 131 | + .proc_write = nv_procfs_write_file, 132 | + .proc_lseek = seq_lseek, 133 | + .proc_release = nv_procfs_close_registry, 134 | +}; 135 | +#else 136 | static struct file_operations nv_procfs_registry_fops = { 137 | .owner = THIS_MODULE, 138 | .open = nv_procfs_open_registry, 139 | @@ -460,6 +469,7 @@ static struct file_operations nv_procfs_registry_fops = { 140 | .llseek = seq_lseek, 141 | .release = nv_procfs_close_registry, 142 | }; 143 | +#endif 144 | 145 | #if defined(CONFIG_PM) 146 | static int 147 | @@ -531,6 +541,15 @@ nv_procfs_open_suspend_depth( 148 | return single_open(file, nv_procfs_show_suspend_depth, NULL); 149 | } 150 | 151 | +#if defined(NV_HAVE_PROC_OPS) 152 | +static struct proc_ops nv_procfs_suspend_depth_fops = { 153 | + .proc_open = nv_procfs_open_suspend_depth, 154 | + .proc_read = seq_read, 155 | + .proc_write = nv_procfs_write_suspend_depth, 156 | + .proc_lseek = seq_lseek, 157 | + .proc_release = single_release 158 | +}; 159 | +#else 160 | static struct file_operations nv_procfs_suspend_depth_fops = { 161 | .owner = THIS_MODULE, 162 | .open = nv_procfs_open_suspend_depth, 163 | @@ -539,6 +558,7 @@ static struct file_operations nv_procfs_suspend_depth_fops = { 164 | .llseek = seq_lseek, 165 | .release = single_release 166 | }; 167 | +#endif 168 | 169 | static int 170 | nv_procfs_show_suspend( 171 | @@ -613,6 +633,15 @@ nv_procfs_open_suspend( 172 | return single_open(file, nv_procfs_show_suspend, NULL); 173 | } 174 | 175 | +#if defined(NV_HAVE_PROC_OPS) 176 | +static struct proc_ops nv_procfs_suspend_fops = { 177 | + .proc_open = nv_procfs_open_suspend, 178 | + .proc_read = seq_read, 179 | + .proc_write = nv_procfs_write_suspend, 180 | + .proc_lseek = seq_lseek, 181 | + .proc_release = single_release 182 | +}; 183 | +#else 184 | static struct file_operations nv_procfs_suspend_fops = { 185 | .owner = THIS_MODULE, 186 | .open = nv_procfs_open_suspend, 187 | @@ -622,6 +651,7 @@ static struct file_operations nv_procfs_suspend_fops = { 188 | .release = single_release 189 | }; 190 | #endif 191 | +#endif 192 | 193 | /* 194 | * Forwards error to nv_log_error which exposes data to vendor callback 195 | @@ -724,12 +754,20 @@ done: 196 | return status; 197 | } 198 | 199 | +#if defined(NV_HAVE_PROC_OPS) 200 | +static struct proc_ops nv_procfs_exercise_error_forwarding_fops = { 201 | + .proc_open = nv_procfs_open_exercise_error_forwarding, 202 | + .proc_write = nv_procfs_write_file, 203 | + .proc_release = nv_procfs_close_exercise_error_forwarding, 204 | +}; 205 | +#else 206 | static struct file_operations nv_procfs_exercise_error_forwarding_fops = { 207 | .owner = THIS_MODULE, 208 | .open = nv_procfs_open_exercise_error_forwarding, 209 | .write = nv_procfs_write_file, 210 | .release = nv_procfs_close_exercise_error_forwarding, 211 | }; 212 | +#endif 213 | 214 | static int 215 | nv_procfs_read_unbind_lock( 216 | @@ -851,6 +889,15 @@ done: 217 | return rc; 218 | } 219 | 220 | +#if defined(NV_HAVE_PROC_OPS) 221 | +static struct proc_ops nv_procfs_unbind_lock_fops = { 222 | + .proc_open = nv_procfs_open_unbind_lock, 223 | + .proc_read = seq_read, 224 | + .proc_write = nv_procfs_write_file, 225 | + .proc_lseek = seq_lseek, 226 | + .proc_release = nv_procfs_close_unbind_lock, 227 | +}; 228 | +#else 229 | static struct file_operations nv_procfs_unbind_lock_fops = { 230 | .owner = THIS_MODULE, 231 | .open = nv_procfs_open_unbind_lock, 232 | @@ -859,6 +906,7 @@ static struct file_operations nv_procfs_unbind_lock_fops = { 233 | .llseek = seq_lseek, 234 | .release = nv_procfs_close_unbind_lock, 235 | }; 236 | +#endif 237 | 238 | static const char* 239 | numa_status_describe(nv_numa_status_t state) 240 | @@ -1187,6 +1235,22 @@ done: 241 | return retval; 242 | } 243 | 244 | +#if defined(NV_HAVE_PROC_OPS) 245 | +static const struct proc_ops nv_procfs_numa_status_fops = { 246 | + .proc_open = nv_procfs_open_numa_status, 247 | + .proc_read = seq_read, 248 | + .proc_write = nv_procfs_write_file, 249 | + .proc_lseek = seq_lseek, 250 | + .proc_release = nv_procfs_close_numa_status, 251 | +}; 252 | + 253 | +static const struct proc_ops nv_procfs_offline_pages_fops = { 254 | + .proc_open = nv_procfs_open_offline_pages, 255 | + .proc_read = seq_read, 256 | + .proc_lseek = seq_lseek, 257 | + .proc_release = nv_procfs_close_offline_pages, 258 | +}; 259 | +#else 260 | static const struct file_operations nv_procfs_numa_status_fops = { 261 | .owner = THIS_MODULE, 262 | .open = nv_procfs_open_numa_status, 263 | @@ -1203,6 +1267,7 @@ static const struct file_operations nv_procfs_offline_pages_fops = { 264 | .llseek = seq_lseek, 265 | .release = nv_procfs_close_offline_pages, 266 | }; 267 | +#endif 268 | 269 | static int 270 | nv_procfs_read_text_file( 271 | diff --git a/kernel-dkms/nvidia/os-interface.c b/kernel-dkms/nvidia/os-interface.c 272 | index 07f1b77..a8f1d85 100644 273 | --- a/kernel-dkms/nvidia/os-interface.c 274 | +++ b/kernel-dkms/nvidia/os-interface.c 275 | @@ -477,9 +477,15 @@ NV_STATUS NV_API_CALL os_get_current_time( 276 | 277 | void NV_API_CALL os_get_current_tick(NvU64 *nseconds) 278 | { 279 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) 280 | + struct timespec64 ts; 281 | + 282 | + jiffies_to_timespec64(jiffies, &ts); 283 | +#else 284 | struct timespec ts; 285 | 286 | jiffies_to_timespec(jiffies, &ts); 287 | +#endif 288 | 289 | *nseconds = ((NvU64)ts.tv_sec * NSEC_PER_SEC + (NvU64)ts.tv_nsec); 290 | } 291 | diff --git a/kernel-dkms/common/inc/56rc3uglyhack.h b/kernel-dkms/common/inc/56rc3uglyhack.h 292 | new file mode 100644 293 | index 0000000..389d02f 294 | --- /dev/null 295 | +++ b/kernel-dkms/common/inc/56rc3uglyhack.h 296 | @@ -0,0 +1,80 @@ 297 | + 298 | +typedef __kernel_long_t __kernel_time_t; 299 | + 300 | +#ifndef _STRUCT_TIMESPEC 301 | +#define _STRUCT_TIMESPEC 302 | +struct timespec { 303 | + __kernel_old_time_t tv_sec; /* seconds */ 304 | + long tv_nsec; /* nanoseconds */ 305 | +}; 306 | +#endif 307 | + 308 | +struct timeval { 309 | + __kernel_old_time_t tv_sec; /* seconds */ 310 | + __kernel_suseconds_t tv_usec; /* microseconds */ 311 | +}; 312 | + 313 | +struct itimerspec { 314 | + struct timespec it_interval;/* timer period */ 315 | + struct timespec it_value; /* timer expiration */ 316 | +}; 317 | + 318 | +struct itimerval { 319 | + struct timeval it_interval;/* timer interval */ 320 | + struct timeval it_value; /* current value */ 321 | +}; 322 | + 323 | +#if __BITS_PER_LONG == 64 324 | + 325 | +/* timespec64 is defined as timespec here */ 326 | +static inline struct timespec timespec64_to_timespec(const struct timespec64 ts64) 327 | +{ 328 | + return *(const struct timespec *)&ts64; 329 | +} 330 | + 331 | +static inline struct timespec64 timespec_to_timespec64(const struct timespec ts) 332 | +{ 333 | + return *(const struct timespec64 *)&ts; 334 | +} 335 | + 336 | +#else 337 | +static inline struct timespec timespec64_to_timespec(const struct timespec64 ts64) 338 | +{ 339 | + struct timespec ret; 340 | + 341 | + ret.tv_sec = (time_t)ts64.tv_sec; 342 | + ret.tv_nsec = ts64.tv_nsec; 343 | + return ret; 344 | +} 345 | + 346 | +static inline struct timespec64 timespec_to_timespec64(const struct timespec ts) 347 | +{ 348 | + struct timespec64 ret; 349 | + 350 | + ret.tv_sec = ts.tv_sec; 351 | + ret.tv_nsec = ts.tv_nsec; 352 | + return ret; 353 | +} 354 | +#endif 355 | + 356 | +static inline void getnstimeofday(struct timespec *ts) 357 | +{ 358 | + struct timespec64 ts64; 359 | + 360 | + ktime_get_real_ts64(&ts64); 361 | + *ts = timespec64_to_timespec(ts64); 362 | +} 363 | + 364 | +static inline s64 timespec_to_ns(const struct timespec *ts) 365 | +{ 366 | + return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec; 367 | +} 368 | + 369 | +static inline void getrawmonotonic(struct timespec *ts) 370 | +{ 371 | + struct timespec64 ts64; 372 | + 373 | + ktime_get_raw_ts64(&ts64); 374 | + *ts = timespec64_to_timespec(ts64); 375 | +} 376 | + 377 | diff --git a/kernel-dkms/common/inc/nv-time.h b/kernel-dkms/common/inc/nv-time.h 378 | index 968b873..165f18b 100644 379 | --- a/kernel-dkms/common/inc/nv-time.h 380 | +++ b/kernel-dkms/common/inc/nv-time.h 381 | @@ -27,6 +27,10 @@ 382 | 383 | #include 384 | 385 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) 386 | +#include "56rc3uglyhack.h" 387 | +#endif 388 | + 389 | static inline void nv_gettimeofday(struct timeval *tv) 390 | { 391 | #ifdef NV_DO_GETTIMEOFDAY_PRESENT 392 | diff --git a/kernel-dkms/nvidia/linux_nvswitch.c b/kernel-dkms/nvidia/linux_nvswitch.c 393 | index 1d2c1bc..388d64f 100644 394 | --- a/kernel-dkms/nvidia/linux_nvswitch.c 395 | +++ b/kernel-dkms/nvidia/linux_nvswitch.c 396 | @@ -26,6 +26,9 @@ 397 | #include "conftest.h" 398 | #include "nvmisc.h" 399 | #include "nv-linux.h" 400 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) 401 | +#include "nv-time.h" 402 | +#endif 403 | #include "nv-procfs.h" 404 | #include "nvlink_common.h" 405 | #include "nvlink_errors.h" 406 | -------------------------------------------------------------------------------- /patches/kernel-5.7.patch: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh 2 | index 8f807a1..af29636 100755 3 | --- a/kernel-dkms/conftest.sh 4 | +++ b/kernel-dkms/conftest.sh 5 | @@ -143,6 +143,7 @@ test_headers() { 6 | FILES="$FILES video/nv_internal.h" 7 | FILES="$FILES asm/book3s/64/hash-64k.h" 8 | FILES="$FILES asm/set_memory.h" 9 | + FILES="$FILES asm/pgtable.h" 10 | FILES="$FILES asm/prom.h" 11 | FILES="$FILES asm/powernv.h" 12 | FILES="$FILES asm/tlbflush.h" 13 | @@ -466,6 +467,9 @@ compile_test() { 14 | # It does not exist on all architectures. 15 | # 16 | CODE=" 17 | + #if defined(NV_ASM_PGTABLE_H_PRESENT) 18 | + #include 19 | + #endif 20 | #if defined(NV_ASM_SET_MEMORY_H_PRESENT) 21 | #include 22 | #else 23 | -------------------------------------------------------------------------------- /patches/kernel-5.8.patch: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/common/inc/nv-mm.h b/kernel-dkms/common/inc/nv-mm.h 2 | index 4d75de0..0174626 100644 3 | --- a/kernel-dkms/common/inc/nv-mm.h 4 | +++ b/kernel-dkms/common/inc/nv-mm.h 5 | @@ -25,6 +25,10 @@ 6 | 7 | #include "conftest.h" 8 | 9 | +#if defined(NV_MM_STRUCT_HAS_MMAP_LOCK) 10 | +#define mmap_sem mmap_lock 11 | +#endif 12 | + 13 | #if !defined(NV_VM_FAULT_T_IS_PRESENT) 14 | typedef int vm_fault_t; 15 | #endif 16 | diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh 17 | index af29636..1dfbca5 100755 18 | --- a/kernel-dkms/conftest.sh 19 | +++ b/kernel-dkms/conftest.sh 20 | @@ -2116,6 +2116,49 @@ compile_test() { 21 | compile_check_conftest "$CODE" "NV_VZALLOC_PRESENT" "" "functions" 22 | ;; 23 | 24 | + vmalloc_argument_count) 25 | + # 26 | + # Determine how many arguments __vmalloc takes. 27 | + # 28 | + # Changed by commit fc3af83c4fca ("mm: remove the pgprot argument 29 | + # to __vmalloc") 30 | + # 31 | + echo "$CONFTEST_PREAMBLE 32 | + #include 33 | + #include 34 | + void conftest_vmalloc_argument_count(void) { 35 | + __vmalloc(0, GFP_KERNEL, PAGE_KERNEL); 36 | + }" > conftest$$.c 37 | + 38 | + $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1 39 | + rm -f conftest$$.c 40 | + 41 | + if [ -f conftest$$.o ]; then 42 | + echo "#define NV_VMALLOC_ARGUMENT_COUNT_ARGUMENT_COUNT 3" | append_conftest "functions" 43 | + else 44 | + echo "#define NV_VMALLOC_ARGUMENT_COUNT_ARGUMENT_COUNT 2" | append_conftest "functions" 45 | + fi 46 | + 47 | + rm -f conftest$$.o 48 | + ;; 49 | + 50 | + mm_struct_has_mmap_lock) 51 | + # 52 | + # Determine if the mm_struct structure has 'mmap_lock'. 53 | + # 54 | + # Changed by commit ea7b54944ef9 ("mmap locking API: rename mmap_sem 55 | + # to mmap_lock") 56 | + # 57 | + CODE=" 58 | + #include 59 | + 60 | + int conftest_mm_struct_has_mmap_lock(void) { 61 | + return offsetof(struct mm_struct, mmap_lock); 62 | + }" 63 | + 64 | + compile_check_conftest "$CODE" "NV_MM_STRUCT_HAS_MMAP_LOCK" "" "types" 65 | + ;; 66 | + 67 | drm_driver_has_set_busid) 68 | # 69 | # Determine if the drm_driver structure has a 'set_busid' callback 70 | diff --git a/kernel-dkms/nvidia/nvidia.Kbuild b/kernel-dkms/nvidia/nvidia.Kbuild 71 | index ddc548d..863775d 100644 72 | --- a/kernel-dkms/nvidia/nvidia.Kbuild 73 | +++ b/kernel-dkms/nvidia/nvidia.Kbuild 74 | @@ -96,6 +96,7 @@ 75 | 76 | NV_OBJECTS_DEPEND_ON_CONFTEST += $(NVIDIA_OBJECTS) 77 | 78 | +NV_CONFTEST_FUNCTION_COMPILE_TESTS += vmalloc_argument_count 79 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += hash__remap_4k_pfn 80 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += set_pages_uc 81 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += list_is_first 82 | @@ -172,6 +173,7 @@ NV_CONFTEST_TYPE_COMPILE_TESTS += kmem_cache_has_kobj_remove_work 83 | NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_swiotlb_map_sg_attrs 84 | NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_swiotlb_dma_ops 85 | 86 | +NV_CONFTEST_TYPE_COMPILE_TESTS += mm_struct_has_mmap_lock 87 | NV_CONFTEST_TYPE_COMPILE_TESTS += acpi_op_remove 88 | NV_CONFTEST_TYPE_COMPILE_TESTS += outer_flush_all 89 | NV_CONFTEST_TYPE_COMPILE_TESTS += file_operations 90 | 91 | -------------------------------------------------------------------------------- /patches/kernel-5.9.patch: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/common/inc/nv-mm.h b/kernel-dkms/common/inc/nv-mm.h 2 | index b04ff67..2df20a3 100644 3 | --- a/kernel-dkms/common/inc/nv-mm.h 4 | +++ b/kernel-dkms/common/inc/nv-mm.h 5 | @@ -142,10 +142,15 @@ typedef int vm_fault_t; 6 | #if defined(NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG) 7 | 8 | return get_user_pages_remote(tsk, mm, start, nr_pages, flags, 9 | pages, vmas, NULL); 10 | 11 | + #elif defined(NV_GET_USER_PAGES_REMOTE_REMOVED_TSK_ARG) 12 | + 13 | + return get_user_pages_remote(mm, start, nr_pages, flags, 14 | + pages, vmas, NULL); 15 | + 16 | #else 17 | 18 | return get_user_pages_remote(tsk, mm, start, nr_pages, flags, 19 | pages, vmas); 20 | 21 | diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh 22 | index a4ebf81..dd383ba 100755 23 | --- a/kernel-dkms/conftest.sh 24 | +++ b/kernel-dkms/conftest.sh 25 | @@ -2032,10 +2032,69 @@ compile_test() { 26 | }" 27 | 28 | compile_check_conftest "$CODE" "NV_DRM_DRIVER_HAS_LEGACY_DEV_LIST" "" "types" 29 | ;; 30 | 31 | + drm_driver_has_gem_free_object) 32 | + CODE=" 33 | + #if defined(NV_DRM_DRMP_H_PRESENT) 34 | + #include 35 | + #endif 36 | + 37 | + #if defined(NV_DRM_DRM_DRV_H_PRESENT) 38 | + #include 39 | + #endif 40 | + 41 | + int conftest_drm_driver_has_gem_free_object(void) { 42 | + return offsetof(struct drm_driver, gem_free_object); 43 | + }" 44 | + 45 | + compile_check_conftest "$CODE" "NV_DRM_DRIVER_HAS_GEM_FREE_OBJECT" "" "types" 46 | + ;; 47 | + 48 | + drm_display_mode_has_vrefresh) 49 | + CODE=" 50 | + #if defined(NV_DRM_DRMP_H_PRESENT) 51 | + #include 52 | + #endif 53 | + 54 | + #if defined(NV_DRM_DRM_DRV_H_PRESENT) 55 | + #include 56 | + #endif 57 | + 58 | + int conftest_drm_display_mode_has_vrefresh(void) { 59 | + return offsetof(struct drm_display_mode, vrefresh); 60 | + }" 61 | + 62 | + compile_check_conftest "$CODE" "NV_DRM_DISPLAY_MODE_HAS_VREFRESH" "" "types" 63 | + ;; 64 | + 65 | + drm_master_set_returns_int) 66 | + CODE=" 67 | + #if defined(NV_DRM_DRMP_H_PRESENT) 68 | + #include 69 | + #endif 70 | + 71 | + #if defined(NV_DRM_DRM_DRV_H_PRESENT) 72 | + #include 73 | + #endif 74 | + 75 | + static int nv_master_set(struct drm_device *x, struct drm_file *y, bool z) 76 | + { 77 | + return 1; 78 | + } 79 | + 80 | + int conftest_drm_master_set_returns_int(void) { 81 | + struct drm_driver nv_drm_driver; 82 | + nv_drm_driver.master_set = nv_master_set; 83 | + 84 | + return nv_drm_driver.master_set(NULL, NULL, false); 85 | + }" 86 | + 87 | + compile_check_conftest "$CODE" "NV_DRM_MASTER_SET_RETURNS_INT" "" "generic" 88 | + ;; 89 | + 90 | jiffies_to_timespec) 91 | # 92 | # Determine if jiffies_to_timespec() is present 93 | # 94 | # removed by commit 751addac78b6 95 | @@ -2643,10 +2702,33 @@ compile_test() { 96 | else 97 | echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions" 98 | fi 99 | echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions" 100 | 101 | + # conftest #4: check if get_user_pages_remote() has removed tsk argument 102 | + 103 | + echo "$CONFTEST_PREAMBLE 104 | + #include 105 | + long get_user_pages_remote(struct mm_struct *mm, 106 | + unsigned long start, 107 | + unsigned long nr_pages, 108 | + unsigned int gup_flags, 109 | + struct page **pages, 110 | + struct vm_area_struct **vmas, 111 | + int *locked) { 112 | + return 0; 113 | + }" > conftest$$.c 114 | + 115 | + $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1 116 | + rm -f conftest$$.c 117 | + 118 | + if [ -f conftest$$.o ]; then 119 | + echo "#define NV_GET_USER_PAGES_REMOTE_REMOVED_TSK_ARG" | append_conftest "functions" 120 | + rm -f conftest$$.o 121 | + else 122 | + echo "#undef NV_GET_USER_PAGES_REMOTE_REMOVED_TSK_ARG" | append_conftest "functions" 123 | + fi 124 | ;; 125 | 126 | usleep_range) 127 | # 128 | # Determine if the function usleep_range() is present. 129 | @@ -2708,10 +2790,25 @@ compile_test() { 130 | else 131 | echo "#define NV_DRM_GEM_OBJECT_LOOKUP_ARGUMENT_COUNT 2" | append_conftest "functions" 132 | fi 133 | ;; 134 | 135 | + drm_gem_object_put_unlocked) 136 | + CODE=" 137 | + #if defined(NV_DRM_DRMP_H_PRESENT) 138 | + #include 139 | + #endif 140 | + #if defined(NV_DRM_DRM_GEM_H_PRESENT) 141 | + #include 142 | + #endif 143 | + int conftest_drm_gem_object_put_unlocked(void) { 144 | + drm_gem_object_put_unlocked(); 145 | + }" 146 | + 147 | + compile_check_conftest "$CODE" "NV_DRM_GEM_OBJECT_PUT_UNLOCKED_PRESENT" "" "functions" 148 | + ;; 149 | + 150 | drm_master_drop_has_from_release_arg) 151 | # 152 | # Determine if drm_driver::master_drop() has 'from_release' argument. 153 | # 154 | # Last argument 'bool from_release' has been removed by commit 155 | @@ -3799,10 +3896,30 @@ compile_test() { 156 | 157 | compile_check_conftest "$CODE" "NV_MM_HAS_MMAP_LOCK" "" "types" 158 | 159 | ;; 160 | 161 | + smp_read_barrier_depends) 162 | + CODE=" 163 | + #include 164 | + void conftest_smp_read_barrier_depends(void) { 165 | + smp_read_barrier_depends(0); 166 | + }" 167 | + 168 | + compile_check_conftest "$CODE" "NV_SMP_READ_BARRIER_DEPENDS_PRESENT" "" "functions" 169 | + ;; 170 | + 171 | + vga_tryget) 172 | + CODE=" 173 | + #include 174 | + void conftest_vga_tryget(void) { 175 | + vga_tryget(); 176 | + }" 177 | + 178 | + compile_check_conftest "$CODE" "NV_VGA_TRYGET_PRESENT" "" "functions" 179 | + ;; 180 | + 181 | # When adding a new conftest entry, please use the correct format for 182 | # specifying the relevant upstream Linux kernel commit. 183 | # 184 | # was added|removed|etc by commit (" (). 186 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 187 | index c6ba478..9ac664a 100644 188 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 189 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 190 | @@ -471,20 +471,29 @@ static void nv_drm_unload(struct drm_device *dev) 191 | } 192 | #endif 193 | 194 | #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) 195 | 196 | +#if defined(NV_DRM_MASTER_SET_RETURNS_INT) 197 | static int nv_drm_master_set(struct drm_device *dev, 198 | struct drm_file *file_priv, bool from_open) 199 | +#else 200 | +static void nv_drm_master_set(struct drm_device *dev, 201 | + struct drm_file *file_priv, bool from_open) 202 | +#endif 203 | { 204 | struct nv_drm_device *nv_dev = to_nv_device(dev); 205 | 206 | +#if defined(NV_DRM_MASTER_SET_RETURNS_INT) 207 | if (!nvKms->grabOwnership(nv_dev->pDevice)) { 208 | return -EINVAL; 209 | } 210 | 211 | return 0; 212 | +#else 213 | + nvKms->grabOwnership(nv_dev->pDevice); 214 | +#endif 215 | } 216 | 217 | #if defined(NV_DRM_MASTER_DROP_HAS_FROM_RELEASE_ARG) 218 | static 219 | void nv_drm_master_drop(struct drm_device *dev, 220 | @@ -717,11 +726,15 @@ static struct drm_driver nv_drm_driver = { 221 | #if defined(NV_DRM_DRIVER_PRIME_FLAG_PRESENT) 222 | DRIVER_PRIME | 223 | #endif 224 | DRIVER_GEM | DRIVER_RENDER, 225 | 226 | +#if defined(NV_DRM_DRIVER_HAS_GEM_FREE_OBJECT) 227 | .gem_free_object = nv_drm_gem_free, 228 | +#else 229 | + .gem_free_object_unlocked = nv_drm_gem_free, 230 | +#endif 231 | 232 | .ioctls = nv_drm_ioctls, 233 | .num_ioctls = ARRAY_SIZE(nv_drm_ioctls), 234 | 235 | .prime_handle_to_fd = drm_gem_prime_handle_to_fd, 236 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-gem.h b/kernel-dkms/nvidia-drm/nvidia-drm-gem.h 237 | index 4e7ffd3..6185085 100644 238 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-gem.h 239 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-gem.h 240 | @@ -94,11 +94,15 @@ static inline struct nv_drm_gem_object *to_nv_gem_object( 241 | 242 | static inline void 243 | nv_drm_gem_object_unreference_unlocked(struct nv_drm_gem_object *nv_gem) 244 | { 245 | #if defined(NV_DRM_GEM_OBJECT_GET_PRESENT) 246 | +#if defined(NV_DRM_GEM_OBJECT_PUT_UNLOCKED_PRESENT) 247 | drm_gem_object_put_unlocked(&nv_gem->base); 248 | +#else 249 | + drm_gem_object_put(&nv_gem->base); 250 | +#endif 251 | #else 252 | drm_gem_object_unreference_unlocked(&nv_gem->base); 253 | #endif 254 | } 255 | 256 | @@ -143,11 +147,10 @@ void nv_drm_gem_object_init(struct nv_drm_device *nv_dev, 257 | nv_dma_resv_init(&nv_gem->resv); 258 | 259 | #if defined(NV_DRM_GEM_OBJECT_HAS_RESV) 260 | nv_gem->base.resv = &nv_gem->resv; 261 | #endif 262 | - 263 | #endif 264 | 265 | drm_gem_private_object_init(dev, &nv_gem->base, size); 266 | } 267 | 268 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-utils.c b/kernel-dkms/nvidia-drm/nvidia-drm-utils.c 269 | index da485c6..600ca63 100644 270 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-utils.c 271 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-utils.c 272 | @@ -101,11 +101,13 @@ int nvkms_connector_type_to_drm_connector_type(NvKmsConnectorType type, 273 | 274 | void 275 | nvkms_display_mode_to_drm_mode(const struct NvKmsKapiDisplayMode *displayMode, 276 | struct drm_display_mode *mode) 277 | { 278 | +#if defined(NV_DRM_DISPLAY_MODE_HAS_VREFRESH) 279 | mode->vrefresh = (displayMode->timings.refreshRate + 500) / 1000; /* In Hz */ 280 | +#endif 281 | 282 | mode->clock = (displayMode->timings.pixelClockHz + 500) / 1000; /* In Hz */ 283 | 284 | mode->hdisplay = displayMode->timings.hVisible; 285 | mode->hsync_start = displayMode->timings.hSyncStart; 286 | @@ -157,11 +159,13 @@ nvkms_display_mode_to_drm_mode(const struct NvKmsKapiDisplayMode *displayMode, 287 | } 288 | 289 | void drm_mode_to_nvkms_display_mode(const struct drm_display_mode *src, 290 | struct NvKmsKapiDisplayMode *dst) 291 | { 292 | +#if defined(NV_DRM_DISPLAY_MODE_HAS_VREFRESH) 293 | dst->timings.refreshRate = src->vrefresh * 1000; 294 | +#endif 295 | 296 | dst->timings.pixelClockHz = src->clock * 1000; /* In Hz */ 297 | 298 | dst->timings.hVisible = src->hdisplay; 299 | dst->timings.hSyncStart = src->hsync_start; 300 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm.Kbuild b/kernel-dkms/nvidia-drm/nvidia-drm.Kbuild 301 | index fd17ea1..1fc565b 100644 302 | --- a/kernel-dkms/nvidia-drm/nvidia-drm.Kbuild 303 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm.Kbuild 304 | @@ -48,19 +48,21 @@ $(call ASSIGN_PER_OBJ_CFLAGS, $(NVIDIA_DRM_OBJECTS), $(NVIDIA_DRM_CFLAGS)) 305 | 306 | NV_OBJECTS_DEPEND_ON_CONFTEST += $(NVIDIA_DRM_OBJECTS) 307 | 308 | NV_CONFTEST_GENERIC_COMPILE_TESTS += drm_available 309 | NV_CONFTEST_GENERIC_COMPILE_TESTS += drm_atomic_available 310 | +NV_CONFTEST_GENERIC_COMPILE_TESTS += drm_master_set_returns_int 311 | NV_CONFTEST_GENERIC_COMPILE_TESTS += is_export_symbol_gpl_refcount_inc 312 | NV_CONFTEST_GENERIC_COMPILE_TESTS += is_export_symbol_gpl_refcount_dec_and_test 313 | NV_CONFTEST_GENERIC_COMPILE_TESTS += drm_alpha_blending_available 314 | 315 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_dev_unref 316 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_reinit_primary_mode_group 317 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += get_user_pages_remote 318 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += get_user_pages 319 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_gem_object_lookup 320 | +NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_gem_object_put_unlocked 321 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_atomic_state_ref_counting 322 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_driver_has_gem_prime_res_obj 323 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_atomic_helper_connector_dpms 324 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_connector_funcs_have_mode_in_name 325 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += vmf_insert_pfn 326 | @@ -73,10 +75,12 @@ NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_connector_for_each_possible_encoder 327 | NV_CONFTEST_TYPE_COMPILE_TESTS += drm_bus_present 328 | NV_CONFTEST_TYPE_COMPILE_TESTS += drm_bus_has_bus_type 329 | NV_CONFTEST_TYPE_COMPILE_TESTS += drm_bus_has_get_irq 330 | NV_CONFTEST_TYPE_COMPILE_TESTS += drm_bus_has_get_name 331 | NV_CONFTEST_TYPE_COMPILE_TESTS += drm_driver_has_legacy_dev_list 332 | +NV_CONFTEST_TYPE_COMPILE_TESTS += drm_driver_has_gem_free_object 333 | +NV_CONFTEST_TYPE_COMPILE_TESTS += drm_display_mode_has_vrefresh 334 | NV_CONFTEST_TYPE_COMPILE_TESTS += drm_driver_has_set_busid 335 | NV_CONFTEST_TYPE_COMPILE_TESTS += drm_crtc_state_has_connectors_changed 336 | NV_CONFTEST_TYPE_COMPILE_TESTS += drm_init_function_args 337 | NV_CONFTEST_TYPE_COMPILE_TESTS += drm_helper_mode_fill_fb_struct 338 | NV_CONFTEST_TYPE_COMPILE_TESTS += drm_master_drop_has_from_release_arg 339 | diff --git a/kernel-dkms/nvidia-uvm/nvidia-uvm.Kbuild b/kernel-dkms/nvidia-uvm/nvidia-uvm.Kbuild 340 | index 0a1a4e9..8e86b51 100644 341 | --- a/kernel-dkms/nvidia-uvm/nvidia-uvm.Kbuild 342 | +++ b/kernel-dkms/nvidia-uvm/nvidia-uvm.Kbuild 343 | @@ -97,10 +97,11 @@ NV_CONFTEST_FUNCTION_COMPILE_TESTS += console_lock 344 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += pci_bus_address 345 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += set_memory_uc 346 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += set_pages_uc 347 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += acpi_walk_namespace 348 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += ktime_get_raw_ts64 349 | +NV_CONFTEST_FUNCTION_COMPILE_TESTS += smp_read_barrier_depends 350 | 351 | NV_CONFTEST_TYPE_COMPILE_TESTS += outer_flush_all 352 | NV_CONFTEST_TYPE_COMPILE_TESTS += file_operations 353 | NV_CONFTEST_TYPE_COMPILE_TESTS += kuid_t 354 | NV_CONFTEST_TYPE_COMPILE_TESTS += address_space 355 | diff --git a/kernel-dkms/nvidia-uvm/uvm8_tools.c b/kernel-dkms/nvidia-uvm/uvm8_tools.c 356 | index 620e1cc..e4d822f 100644 357 | --- a/kernel-dkms/nvidia-uvm/uvm8_tools.c 358 | +++ b/kernel-dkms/nvidia-uvm/uvm8_tools.c 359 | @@ -190,11 +190,15 @@ static NV_STATUS tools_update_status(uvm_va_space_t *va_space); 360 | 361 | static uvm_tools_event_tracker_t *tools_event_tracker(struct file *filp) 362 | { 363 | long event_tracker = atomic_long_read((atomic_long_t *)&filp->private_data); 364 | 365 | +#if defined(NV_SMP_READ_BARRIER_DEPENDS_PRESENT) 366 | smp_read_barrier_depends(); 367 | +#else 368 | + smp_rmb(); 369 | +#endif 370 | return (uvm_tools_event_tracker_t *)event_tracker; 371 | } 372 | 373 | static bool tracker_is_queue(uvm_tools_event_tracker_t *event_tracker) 374 | { 375 | diff --git a/kernel-dkms/nvidia-uvm/uvm8_va_range.h b/kernel-dkms/nvidia-uvm/uvm8_va_range.h 376 | index 69cb0a0..f6c820a 100644 377 | --- a/kernel-dkms/nvidia-uvm/uvm8_va_range.h 378 | +++ b/kernel-dkms/nvidia-uvm/uvm8_va_range.h 379 | @@ -753,11 +753,15 @@ static uvm_va_block_t *uvm_va_range_block(uvm_va_range_t *va_range, size_t index 380 | // Later accesses in this thread will read state out of block, potentially 381 | // as soon as the block pointer is updated by another thread. We have to 382 | // make sure that any initialization of this block by the creating thread is 383 | // visible to later accesses in this thread, which requires a data 384 | // dependency barrier. 385 | +#if defined(NV_SMP_READ_BARRIER_DEPENDS_PRESENT) 386 | smp_read_barrier_depends(); 387 | +#else 388 | + smp_mb(); 389 | +#endif 390 | return block; 391 | } 392 | 393 | // Same as uvm_va_range_block except that the block is created if not already 394 | // present in the array. If NV_OK is returned, the block has been allocated 395 | diff --git a/kernel-dkms/nvidia/nv-pci.c b/kernel-dkms/nvidia/nv-pci.c 396 | index 9a8a715..a308c7d 100644 397 | --- a/kernel-dkms/nvidia/nv-pci.c 398 | +++ b/kernel-dkms/nvidia/nv-pci.c 399 | @@ -421,11 +421,11 @@ nv_pci_probe 400 | #endif 401 | 402 | pci_set_master(pci_dev); 403 | 404 | #if defined(CONFIG_VGA_ARB) && !defined(NVCPU_PPC64LE) 405 | -#if defined(VGA_DEFAULT_DEVICE) 406 | +#if defined(NV_VGA_TRYGET_PRESENT) && defined(VGA_DEFAULT_DEVICE) 407 | vga_tryget(VGA_DEFAULT_DEVICE, VGA_RSRC_LEGACY_MASK); 408 | #endif 409 | vga_set_legacy_decoding(pci_dev, VGA_RSRC_NONE); 410 | #endif 411 | 412 | diff --git a/kernel-dkms/nvidia/nvidia.Kbuild b/kernel-dkms/nvidia/nvidia.Kbuild 413 | index 424f6e6..ce8114a 100644 414 | --- a/kernel-dkms/nvidia/nvidia.Kbuild 415 | +++ b/kernel-dkms/nvidia/nvidia.Kbuild 416 | @@ -144,6 +144,7 @@ NV_CONFTEST_FUNCTION_COMPILE_TESTS += tegra_get_platform 417 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += flush_cache_all 418 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += vmf_insert_pfn 419 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += jiffies_to_timespec 420 | +NV_CONFTEST_FUNCTION_COMPILE_TESTS += vga_tryget 421 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += ktime_get_raw_ts64 422 | NV_CONFTEST_FUNCTION_COMPILE_TESTS += ktime_get_real_ts64 423 | 424 | -------------------------------------------------------------------------------- /patches/kernel-6.0.patch: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-helper.c b/kernel-dkms/nvidia-drm/nvidia-drm-helper.c 2 | index b04ff67..2df20a3 100644 3 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-helper.c 4 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-helper.c 5 | @@ -30,6 +30,7 @@ typedef int vm_fault_t; 6 | * present simplifies nvidia-drm.ko source. 7 | */ 8 | 9 | +#include 10 | #include "nvidia-drm-helper.h" 11 | 12 | #include "nvmisc.h" 13 | -------------------------------------------------------------------------------- /patches/kernel-6.12.patch: -------------------------------------------------------------------------------- 1 | From b03fe816d7b2675afdb4c1d10fe7658a5f2b2f82 Mon Sep 17 00:00:00 2001 2 | From: Rahul Rameshbabu 3 | Date: Tue, 12 Nov 2024 15:01:16 -0800 4 | Subject: [PATCH 6/6] nvidia-drm: Set FOP_UNSIGNED_OFFSET for 5 | nv_drm_fops.fop_flags if present 6 | 7 | Linux kernel commit 641bb4394f40 ("fs: move FMODE_UNSIGNED_OFFSET to 8 | fop_flags") introduced a new .fop_flags define, FOP_UNSIGNED_OFFSET, for 9 | struct file_operations. A check in drm_open_helper was added to ensure DRM 10 | device drivers mark that all file offsets passed for working with DRM fs 11 | nodes are unsigned values. If a DRM device driver fails to set this static 12 | member, opening DRM device nodes (/dev/dri/card*) will fail. This commit 13 | will land in Linux kernel v6.12. 14 | 15 | To ensure DRM clients will continue to function with kernel v6.12 and 16 | above, set FOP_UNSIGNED_OFFSET for nv_drm_fops.fop_flags if 17 | FOP_UNSIGNED_OFFSET is present in the linux kernel headers being built 18 | against. Without doing so, userspace DRM clients will fail to function. An 19 | example is being unable to launch Wayland compositors. 20 | 21 | KWin logs without this change: 22 | kwin_core: Failed to open /dev/dri/card1 device (Invalid argument) 23 | kwin_wayland_drm: failed to open drm device at "/dev/dri/card1" 24 | kwin_core: Failed to open /dev/dri/card0 device (Invalid argument) 25 | kwin_wayland_drm: failed to open drm device at "/dev/dri/card0" 26 | kwin_wayland_drm: No suitable DRM devices have been found 27 | 28 | Linux kernel warning generated without this change: 29 | [Oct 2 02:15] ------------[ cut here ]------------ 30 | [ +0.000009] WARNING: CPU: 2 PID: 464 at drivers/gpu/drm/drm_file.c:312 drm_open_helper+0x134/0x150 31 | 32 | [ +0.000108] Unloaded tainted modules: nvidia(OE):1 nvidia_modeset(OE):1 nvidia_drm(OE):1 [last unloaded: ttm] 33 | [ +0.000024] CPU: 2 UID: 0 PID: 464 Comm: systemd-logind Tainted: G OE 6.12.0-rc1-next-20241001-sound+ #10 c8090f98b0209abebde89ba1e4c08c75331eef4d 34 | [ +0.000016] Tainted: [O]=OOT_MODULE, [E]=UNSIGNED_MODULE 35 | [ +0.000004] Hardware name: System manufacturer PRIME Z390-A/PRIME Z390-A, BIOS 0224 08/14/2018 36 | [ +0.000005] RIP: 0010:drm_open_helper+0x134/0x150 37 | 38 | [ +0.000005] Call Trace: 39 | [ +0.000006] 40 | [ +0.000004] ? drm_open_helper+0x134/0x150 41 | [ +0.000008] ? __warn.cold+0x93/0xf6 42 | [ +0.000011] ? drm_open_helper+0x134/0x150 43 | [ +0.000009] ? report_bug+0xff/0x140 44 | [ +0.000009] ? handle_bug+0x58/0x90 45 | [ +0.000010] ? exc_invalid_op+0x17/0x70 46 | [ +0.000010] ? asm_exc_invalid_op+0x1a/0x20 47 | [ +0.000018] ? drm_open_helper+0x134/0x150 48 | [ +0.000008] drm_open+0x73/0x110 49 | [ +0.000007] drm_stub_open+0x9b/0xd0 50 | [ +0.000009] chrdev_open+0xb0/0x230 51 | [ +0.000014] ? __pfx_chrdev_open+0x10/0x10 52 | [ +0.000011] do_dentry_open+0x14c/0x4a0 53 | [ +0.000013] vfs_open+0x2e/0xe0 54 | [ +0.000009] path_openat+0x82f/0x13f0 55 | [ +0.000016] do_filp_open+0xc4/0x170 56 | [ +0.000020] do_sys_openat2+0xae/0xe0 57 | [ +0.000010] __x64_sys_openat+0x55/0xa0 58 | [ +0.000009] do_syscall_64+0x82/0x190 59 | [ +0.000008] ? do_readlinkat+0xc5/0x180 60 | [ +0.000008] ? syscall_exit_to_user_mode+0x37/0x1c0 61 | [ +0.000010] ? do_syscall_64+0x8e/0x190 62 | [ +0.000007] ? do_sys_openat2+0x9c/0xe0 63 | [ +0.000009] ? syscall_exit_to_user_mode+0x37/0x1c0 64 | [ +0.000008] ? do_syscall_64+0x8e/0x190 65 | [ +0.000007] ? syscall_exit_to_user_mode+0x37/0x1c0 66 | [ +0.000007] ? do_syscall_64+0x8e/0x190 67 | [ +0.000006] ? do_syscall_64+0x8e/0x190 68 | [ +0.000007] entry_SYSCALL_64_after_hwframe+0x76/0x7e 69 | [ +0.000012] RIP: 0033:0x7f90c1cec2e3 70 | 71 | [ +0.000004] ---[ end trace 0000000000000000 ]--- 72 | 73 | Signed-off-by: Rahul Rameshbabu 74 | --- 75 | nvidia-drm/nvidia-drm-drv.c | 4 ++++ 76 | 1 file changed, 4 insertions(+) 77 | 78 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 79 | index 8cb94219..16f0d13e 100644 80 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 81 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 82 | @@ -1711,6 +1711,10 @@ static const struct file_operations nv_drm_fops = { 83 | .read = drm_read, 84 | 85 | .llseek = noop_llseek, 86 | + 87 | +#if defined(FOP_UNSIGNED_OFFSET) 88 | + .fop_flags = FOP_UNSIGNED_OFFSET, 89 | +#endif 90 | }; 91 | 92 | static const struct drm_ioctl_desc nv_drm_ioctls[] = { 93 | -- 94 | 2.47.0 95 | 96 | -------------------------------------------------------------------------------- /patches/kernel-6.2.patch: -------------------------------------------------------------------------------- 1 | From ac78402fe504591eeb98a4212e695731755d6b25 Mon Sep 17 00:00:00 2001 2 | From: Peter Jung 3 | Date: Tue, 27 Dec 2022 18:08:48 +0100 4 | Subject: [PATCH] Tentative fix for NVIDIA 525 driver for Linux 6.2-rc1 5 | 6 | Signed-off-by: Peter Jung 7 | --- 8 | kernel-dkms/nvidia-drm/nvidia-drm-connector.c | 22 +++++++++++++++++++ 9 | kernel-dkms/nvidia-drm/nvidia-drm-drv.c | 4 ++++ 10 | 2 files changed, 26 insertions(+) 11 | 12 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-connector.c b/kernel-dkms/nvidia-drm/nvidia-drm-connector.c 13 | index 77a6120..cd92bb2 100644 14 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-connector.c 15 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-connector.c 16 | @@ -20,6 +20,8 @@ 17 | * DEALINGS IN THE SOFTWARE. 18 | */ 19 | 20 | +#include 21 | +#include 22 | #include "nvidia-drm-conftest.h" /* NV_DRM_ATOMIC_MODESET_AVAILABLE */ 23 | 24 | #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) 25 | @@ -98,6 +100,7 @@ __nv_drm_detect_encoder(struct NvKmsKapiDynamicDisplayParams *pDetectParams, 26 | break; 27 | } 28 | 29 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 2, 0) 30 | if (connector->override_edid) { 31 | const struct drm_property_blob *edid = connector->edid_blob_ptr; 32 | 33 | @@ -110,6 +113,25 @@ __nv_drm_detect_encoder(struct NvKmsKapiDynamicDisplayParams *pDetectParams, 34 | sizeof(pDetectParams->edid.buffer)); 35 | } 36 | } 37 | +#else 38 | + // Rel. commit "drm/edid: detach debugfs EDID override from EDID property update" (Jani Nikula, 24 Oct 2022) 39 | + // NOTE: HUGE HACK! 40 | + mutex_lock(&connector->edid_override_mutex); 41 | + if (connector->edid_override) { 42 | + const struct edid *edid = drm_edid_raw(connector->edid_override); 43 | + size_t edid_length = EDID_LENGTH * (edid->extensions + 1); 44 | + if (edid_length <= sizeof(pDetectParams->edid.buffer)) { 45 | + memcpy(pDetectParams->edid.buffer, edid, edid_length); 46 | + pDetectParams->edid.bufferSize = edid_length; 47 | + pDetectParams->overrideEdid = NV_TRUE; 48 | + } else { 49 | + WARN_ON(edid_length > 50 | + sizeof(pDetectParams->edid.buffer)); 51 | + } 52 | + } 53 | + mutex_unlock(&connector->edid_override_mutex); 54 | + 55 | +#endif 56 | 57 | if (!nvKms->getDynamicDisplayInfo(nv_dev->pDevice, pDetectParams)) { 58 | NV_DRM_DEV_LOG_ERR( 59 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 60 | index ac504ec..75ef54d 100644 61 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 62 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 63 | @@ -20,6 +20,7 @@ 64 | * DEALINGS IN THE SOFTWARE. 65 | */ 66 | 67 | +#include 68 | #include "nvidia-drm-conftest.h" /* NV_DRM_AVAILABLE and NV_DRM_DRM_GEM_H_PRESENT */ 69 | 70 | #include "nvidia-drm-priv.h" 71 | @@ -257,9 +258,12 @@ nv_drm_init_mode_config(struct nv_drm_device *nv_dev, 72 | dev->mode_config.preferred_depth = 24; 73 | dev->mode_config.prefer_shadow = 1; 74 | 75 | +// Rel. commit "drm: Remove drm_mode_config::fb_base" (Zack Rusin, 18 Oct 2022) 76 | +#if defined(CONFIG_FB) && LINUX_VERSION_CODE < KERNEL_VERSION(6, 2, 0) 77 | /* Currently unused. Update when needed. */ 78 | 79 | dev->mode_config.fb_base = 0; 80 | +#endif 81 | 82 | #if defined(NV_DRM_CRTC_STATE_HAS_ASYNC_FLIP) || \ 83 | defined(NV_DRM_CRTC_STATE_HAS_PAGEFLIP_FLAGS) 84 | -- 85 | 2.39.0 86 | 87 | -------------------------------------------------------------------------------- /patches/kernel-6.3.patch: -------------------------------------------------------------------------------- 1 | From a77f2da778f4a62695a6c7d26bba674d59ad9170 Mon Sep 17 00:00:00 2001 2 | From: Joan Bruguera 3 | Date: Sat, 25 Feb 2023 10:57:09 +0000 4 | Subject: [PATCH] Tentative fix for NVIDIA 470.161.03 driver for Linux 6.3-rc1 5 | 6 | --- 7 | common/inc/nv-linux.h | 13 +++++++++++++ 8 | nvidia-drm/nvidia-drm-gem-user-memory.c | 7 ++++--- 9 | nvidia-uvm/uvm.c | 2 +- 10 | nvidia/nv-mmap.c | 12 ++++++------ 11 | 4 files changed, 24 insertions(+), 10 deletions(-) 12 | 13 | diff --git a/kernel-dkms/common/inc/nv-linux.h b/kernel-dkms/common/inc/nv-linux.h 14 | index f8df9e3..5b22cf1 100644 15 | --- a/kernel-dkms/common/inc/nv-linux.h 16 | +++ b/kernel-dkms/common/inc/nv-linux.h 17 | @@ -1988,4 +1988,17 @@ static inline void nv_mutex_destroy(struct mutex *lock) 18 | 19 | } 20 | 21 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 3, 0) 22 | +// Rel. commit "mm: introduce vma->vm_flags wrapper functions" (Suren Baghdasaryan, 26 Jan 2023) 23 | +static inline void vm_flags_set(struct vm_area_struct *vma, vm_flags_t flags) 24 | +{ 25 | + vma->vm_flags |= flags; 26 | +} 27 | + 28 | +static inline void vm_flags_clear(struct vm_area_struct *vma, vm_flags_t flags) 29 | +{ 30 | + vma->vm_flags &= ~flags; 31 | +} 32 | +#endif 33 | + 34 | #endif /* _NV_LINUX_H_ */ 35 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c b/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c 36 | index 8824daa..3ea9099 100644 37 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c 38 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c 39 | @@ -35,6 +35,7 @@ 40 | #include "linux/dma-buf.h" 41 | #include "linux/mm.h" 42 | #include "nv-mm.h" 43 | +#include "nv-linux.h" 44 | 45 | static inline 46 | void __nv_drm_gem_user_memory_free(struct nv_drm_gem_object *nv_gem) 47 | @@ -92,9 +93,9 @@ static int __nv_drm_gem_user_memory_mmap(struct nv_drm_gem_object *nv_gem, 48 | return -EINVAL; 49 | } 50 | 51 | - vma->vm_flags &= ~VM_PFNMAP; 52 | - vma->vm_flags &= ~VM_IO; 53 | - vma->vm_flags |= VM_MIXEDMAP; 54 | + vm_flags_clear(vma, VM_PFNMAP); 55 | + vm_flags_clear(vma, VM_IO); 56 | + vm_flags_set(vma, VM_MIXEDMAP); 57 | 58 | return 0; 59 | } 60 | diff --git a/kernel-dkms/nvidia-uvm/uvm.c b/kernel-dkms/nvidia-uvm/uvm.c 61 | index 3e7318d..7eddff7 100644 62 | --- a/kernel-dkms/nvidia-uvm/uvm.c 63 | +++ b/kernel-dkms/nvidia-uvm/uvm.c 64 | @@ -812,7 +812,7 @@ static int uvm_mmap(struct file *filp, struct vm_area_struct *vma) 65 | // Using VM_DONTCOPY would be nice, but madvise(MADV_DOFORK) can reset that 66 | // so we have to handle vm_open on fork anyway. We could disable MADV_DOFORK 67 | // with VM_IO, but that causes other mapping issues. 68 | - vma->vm_flags |= VM_MIXEDMAP | VM_DONTEXPAND; 69 | + vm_flags_set(vma, VM_MIXEDMAP | VM_DONTEXPAND); 70 | 71 | vma->vm_ops = &uvm_vm_ops_managed; 72 | 73 | diff --git a/kernel-dkms/nvidia/nv-mmap.c b/kernel-dkms/nvidia/nv-mmap.c 74 | index df514c9..8f85ff6 100644 75 | --- a/kernel-dkms/nvidia/nv-mmap.c 76 | +++ b/kernel-dkms/nvidia/nv-mmap.c 77 | @@ -447,7 +447,7 @@ static int nvidia_mmap_numa( 78 | } 79 | 80 | // Needed for the linux kernel for mapping compound pages 81 | - vma->vm_flags |= VM_MIXEDMAP; 82 | + vm_flags_set(vma, VM_MIXEDMAP); 83 | 84 | for (i = 0, addr = mmap_context->page_array[0]; i < pages; 85 | addr = mmap_context->page_array[++i], start += PAGE_SIZE) 86 | @@ -596,7 +596,7 @@ int nvidia_mmap_helper( 87 | } 88 | up(&nvl->mmap_lock); 89 | 90 | - vma->vm_flags |= VM_IO | VM_PFNMAP | VM_DONTEXPAND; 91 | + vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND); 92 | } 93 | else 94 | { 95 | @@ -663,15 +663,15 @@ int nvidia_mmap_helper( 96 | 97 | NV_PRINT_AT(NV_DBG_MEMINFO, at); 98 | 99 | - vma->vm_flags |= (VM_IO | VM_LOCKED | VM_RESERVED); 100 | - vma->vm_flags |= (VM_DONTEXPAND | VM_DONTDUMP); 101 | + vm_flags_set(vma, VM_IO | VM_LOCKED | VM_RESERVED); 102 | + vm_flags_set(vma, VM_DONTEXPAND | VM_DONTDUMP); 103 | } 104 | 105 | if ((prot & NV_PROTECT_WRITEABLE) == 0) 106 | { 107 | vma->vm_page_prot = NV_PGPROT_READ_ONLY(vma->vm_page_prot); 108 | - vma->vm_flags &= ~VM_WRITE; 109 | - vma->vm_flags &= ~VM_MAYWRITE; 110 | + vm_flags_clear(vma, VM_WRITE); 111 | + vm_flags_clear(vma, VM_MAYWRITE); 112 | } 113 | 114 | vma->vm_ops = &nv_vm_ops; 115 | -- 116 | 2.39.2 117 | 118 | 119 | -------------------------------------------------------------------------------- /patches/kernel-6.4.patch: -------------------------------------------------------------------------------- 1 | Works around dumb_destroy error when compiling for kernel 6.4.0 or newer 2 | Copied/edited from Joan Bruguera's 470.xx patch 3 | See: https://gist.github.com/joanbm/77f0650d45747b9a4dc8e330ade2bf5c 4 | 5 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 6 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 7 | @@ -35,6 +35,7 @@ 8 | #include "nvidia-drm-gem-nvkms-memory.h" 9 | #include "nvidia-drm-gem-user-memory.h" 10 | #include "nvidia-drm-gem-dma-buf.h" 11 | +#include 12 | 13 | #if defined(NV_DRM_AVAILABLE) 14 | 15 | @@ -1436,7 +1437,11 @@ static void nv_drm_update_drm_driver_features(void) 16 | 17 | nv_drm_driver.dumb_create = nv_drm_dumb_create; 18 | nv_drm_driver.dumb_map_offset = nv_drm_dumb_map_offset; 19 | - nv_drm_driver.dumb_destroy = nv_drm_dumb_destroy; 20 | + // Rel. commit "drm: remove dumb_destroy callback" (Christian König, 26 Jan 2023) 21 | + // NB: No resources are leaked, the kernel releases the same resources by default 22 | + #if LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0) 23 | + nv_drm_driver.dumb_destroy = nv_drm_dumb_destroy; 24 | + #endif 25 | #endif /* NV_DRM_ATOMIC_MODESET_AVAILABLE */ 26 | } 27 | -------------------------------------------------------------------------------- /patches/kernel-6.5.patch: -------------------------------------------------------------------------------- 1 | Works around get_user_pages argument error when compiling for kernel 6.5 or newer 2 | Should work with 525xx, 530xx 535xx prior to 535.86(?), potentially some older versions? 3 | Original patch by Fjodor42 - this just changes some driver-specific lines 4 | See: https://gist.github.com/Fjodor42/cfd29b3ffd1d1957894469f2def8f4f6 5 | Original original patch for 470xx by Joan Bruguera at https://gist.github.com/joanbm/dfe8dc59af1c83e2530a1376b77be8ba 6 | 7 | --- a/kernel-dkms/common/inc/nv-mm.h 8 | +++ b/kernel-dkms/common/inc/nv-mm.h 9 | 10 | @@ -23,6 +23,7 @@ 11 | #ifndef __NV_MM_H__ 12 | #define __NV_MM_H__ 13 | 14 | +#include 15 | #include "conftest.h" 16 | 17 | #if !defined(NV_VM_FAULT_T_IS_PRESENT) 18 | @@ -41,7 +42,16 @@ typedef int vm_fault_t; 19 | #include 20 | #include 21 | #if defined(NV_PIN_USER_PAGES_PRESENT) 22 | - #define NV_PIN_USER_PAGES pin_user_pages 23 | + #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 5, 0) 24 | + static inline long NV_PIN_USER_PAGES(unsigned long start, unsigned long nr_pages, 25 | + unsigned int gup_flags, struct page **pages, 26 | + struct vm_area_struct **vmas) { 27 | + return pin_user_pages(start, nr_pages, gup_flags, pages); 28 | + } 29 | + #else 30 | + #define NV_PIN_USER_PAGES pin_user_pages 31 | + #endif 32 | + 33 | #define NV_UNPIN_USER_PAGE unpin_user_page 34 | #else 35 | #define NV_PIN_USER_PAGES NV_GET_USER_PAGES 36 | @@ -66,7 +76,25 @@ typedef int vm_fault_t; 37 | * 38 | */ 39 | 40 | -#if defined(NV_GET_USER_PAGES_HAS_ARGS_FLAGS) 41 | +// Rel. commit. "mm/gup: remove unused vmas parameter from get_user_pages()" (Lorenzo Stoakes, 14 May 2023) 42 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 5, 0) 43 | +static inline long NV_GET_USER_PAGES(unsigned long start, 44 | + unsigned long nr_pages, 45 | + int write, 46 | + int force, 47 | + struct page **pages, 48 | + struct vm_area_struct **vmas) 49 | +{ 50 | + unsigned int flags = 0; 51 | + 52 | + if (write) 53 | + flags |= FOLL_WRITE; 54 | + if (force) 55 | + flags |= FOLL_FORCE; 56 | + 57 | + return get_user_pages(start, nr_pages, flags, pages); 58 | +} 59 | +#elif defined(NV_GET_USER_PAGES_HAS_ARGS_FLAGS) 60 | #define NV_GET_USER_PAGES get_user_pages 61 | #elif defined(NV_GET_USER_PAGES_HAS_ARGS_TSK_FLAGS) 62 | #define NV_GET_USER_PAGES(start, nr_pages, flags, pages, vmas) \ 63 | @@ -103,7 +131,14 @@ typedef int vm_fault_t; 64 | */ 65 | 66 | #if defined(NV_PIN_USER_PAGES_REMOTE_PRESENT) 67 | - #if defined (NV_PIN_USER_PAGES_REMOTE_HAS_ARGS_TSK) 68 | + #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 5, 0) 69 | + static inline long NV_PIN_USER_PAGES_REMOTE(struct mm_struct *mm, 70 | + unsigned long start, unsigned long nr_pages, 71 | + unsigned int gup_flags, struct page **pages, 72 | + struct vm_area_struct **vmas, int *locked) { 73 | + return pin_user_pages_remote(mm, start, nr_pages, gup_flags, pages, locked); 74 | + } 75 | + #elif defined (NV_PIN_USER_PAGES_REMOTE_HAS_ARGS_TSK) 76 | #define NV_PIN_USER_PAGES_REMOTE(mm, start, nr_pages, flags, pages, vmas, locked) \ 77 | pin_user_pages_remote(NULL, mm, start, nr_pages, flags, pages, vmas, locked) 78 | #else 79 | @@ -137,7 +172,20 @@ typedef int vm_fault_t; 80 | * 81 | */ 82 | 83 | -#if defined(NV_GET_USER_PAGES_REMOTE_PRESENT) 84 | +//#if defined(NV_GET_USER_PAGES_REMOTE_PRESENT) 85 | +// Rel. commit. "mm/gup: remove unused vmas parameter from get_user_pages_remote()" (Lorenzo Stoakes, 14 May 2023) 86 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 5, 0) 87 | +static inline long NV_GET_USER_PAGES_REMOTE( struct mm_struct *mm, 88 | + unsigned long start, 89 | + unsigned long nr_pages, 90 | + unsigned int gup_flags, 91 | + struct page **pages, 92 | + struct vm_area_struct **vmas, 93 | + int *locked) 94 | +{ 95 | + return get_user_pages_remote(mm, start, nr_pages, gup_flags, pages, locked); 96 | +} 97 | +#elif defined(NV_GET_USER_PAGES_REMOTE_PRESENT) 98 | #if defined(NV_GET_USER_PAGES_REMOTE_HAS_ARGS_FLAGS_LOCKED) 99 | #define NV_GET_USER_PAGES_REMOTE get_user_pages_remote 100 | -------------------------------------------------------------------------------- /patches/kernel-6.8.patch: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 2 | index 74f8583..6563e9f 100644 3 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 4 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 5 | @@ -790,29 +790,29 @@ static const struct drm_ioctl_desc nv_drm_ioctls[] = { 6 | #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) 7 | DRM_IOCTL_DEF_DRV(NVIDIA_GEM_IMPORT_NVKMS_MEMORY, 8 | nv_drm_gem_import_nvkms_memory_ioctl, 9 | - DRM_RENDER_ALLOW|DRM_UNLOCKED), 10 | + DRM_RENDER_ALLOW), 11 | #endif /* NV_DRM_ATOMIC_MODESET_AVAILABLE */ 12 | 13 | DRM_IOCTL_DEF_DRV(NVIDIA_GEM_IMPORT_USERSPACE_MEMORY, 14 | nv_drm_gem_import_userspace_memory_ioctl, 15 | - DRM_RENDER_ALLOW|DRM_UNLOCKED), 16 | + DRM_RENDER_ALLOW), 17 | DRM_IOCTL_DEF_DRV(NVIDIA_GEM_MAP_OFFSET, 18 | nv_drm_gem_map_offset_ioctl, 19 | - DRM_RENDER_ALLOW|DRM_UNLOCKED), 20 | + DRM_RENDER_ALLOW), 21 | DRM_IOCTL_DEF_DRV(NVIDIA_GET_DEV_INFO, 22 | nv_drm_get_dev_info_ioctl, 23 | - DRM_RENDER_ALLOW|DRM_UNLOCKED), 24 | + DRM_RENDER_ALLOW), 25 | 26 | #if defined(NV_DRM_FENCE_AVAILABLE) 27 | DRM_IOCTL_DEF_DRV(NVIDIA_FENCE_SUPPORTED, 28 | nv_drm_fence_supported_ioctl, 29 | - DRM_RENDER_ALLOW|DRM_UNLOCKED), 30 | + DRM_RENDER_ALLOW), 31 | DRM_IOCTL_DEF_DRV(NVIDIA_FENCE_CONTEXT_CREATE, 32 | nv_drm_fence_context_create_ioctl, 33 | - DRM_RENDER_ALLOW|DRM_UNLOCKED), 34 | + DRM_RENDER_ALLOW), 35 | DRM_IOCTL_DEF_DRV(NVIDIA_GEM_FENCE_ATTACH, 36 | nv_drm_gem_fence_attach_ioctl, 37 | - DRM_RENDER_ALLOW|DRM_UNLOCKED), 38 | + DRM_RENDER_ALLOW), 39 | #endif 40 | 41 | DRM_IOCTL_DEF_DRV(NVIDIA_GET_CLIENT_CAPABILITY, 42 | @@ -821,22 +821,22 @@ static const struct drm_ioctl_desc nv_drm_ioctls[] = { 43 | #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) 44 | DRM_IOCTL_DEF_DRV(NVIDIA_GET_CRTC_CRC32, 45 | nv_drm_get_crtc_crc32_ioctl, 46 | - DRM_RENDER_ALLOW|DRM_UNLOCKED), 47 | + DRM_RENDER_ALLOW), 48 | DRM_IOCTL_DEF_DRV(NVIDIA_GET_CRTC_CRC32_V2, 49 | nv_drm_get_crtc_crc32_v2_ioctl, 50 | - DRM_RENDER_ALLOW|DRM_UNLOCKED), 51 | + DRM_RENDER_ALLOW), 52 | DRM_IOCTL_DEF_DRV(NVIDIA_GEM_EXPORT_NVKMS_MEMORY, 53 | nv_drm_gem_export_nvkms_memory_ioctl, 54 | - DRM_RENDER_ALLOW|DRM_UNLOCKED), 55 | + DRM_RENDER_ALLOW), 56 | DRM_IOCTL_DEF_DRV(NVIDIA_GEM_ALLOC_NVKMS_MEMORY, 57 | nv_drm_gem_alloc_nvkms_memory_ioctl, 58 | - DRM_RENDER_ALLOW|DRM_UNLOCKED), 59 | + DRM_RENDER_ALLOW), 60 | DRM_IOCTL_DEF_DRV(NVIDIA_GEM_EXPORT_DMABUF_MEMORY, 61 | nv_drm_gem_export_dmabuf_memory_ioctl, 62 | - DRM_RENDER_ALLOW|DRM_UNLOCKED), 63 | + DRM_RENDER_ALLOW), 64 | DRM_IOCTL_DEF_DRV(NVIDIA_GEM_IDENTIFY_OBJECT, 65 | nv_drm_gem_identify_object_ioctl, 66 | - DRM_RENDER_ALLOW|DRM_UNLOCKED), 67 | + DRM_RENDER_ALLOW), 68 | #endif /* NV_DRM_ATOMIC_MODESET_AVAILABLE */ 69 | }; 70 | 71 | 72 | -------------------------------------------------------------------------------- /patches/legacy-kernel-6.4.diff: -------------------------------------------------------------------------------- 1 | From 4981428cda825b415eea60313f71bf386cc9f7e1 Mon Sep 17 00:00:00 2001 2 | From: Joan Bruguera 3 | Date: Sat, 25 Feb 2023 10:57:26 +0000 4 | Subject: [PATCH] Tentative fix for NVIDIA 470.199.02 driver for Linux 6.4-rc1 5 | 6 | --- 7 | kernel-dkms/nvidia-drm/nvidia-drm-drv.c | 5 +++++ 8 | 1 file changed, 5 insertions(+) 9 | 10 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 11 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 12 | @@ -20,6 +20,7 @@ 13 | * DEALINGS IN THE SOFTWARE. 14 | */ 15 | 16 | +#include 17 | #include "nvidia-drm-conftest.h" /* NV_DRM_AVAILABLE and NV_DRM_DRM_GEM_H_PRESENT */ 18 | 19 | #include "nvidia-drm-priv.h" 20 | @@ -873,9 +874,13 @@ 21 | 22 | nv_drm_driver.dumb_create = nv_drm_dumb_create; 23 | nv_drm_driver.dumb_map_offset = nv_drm_dumb_map_offset; 24 | +// Rel. commit "drm: remove dumb_destroy callback" (Christian König, 26 Jan 2023) 25 | +// NB: No resources are leaked, the kernel releases the same resources by default 26 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0) 27 | #if defined(NV_DRM_DRIVER_HAS_DUMB_DESTROY) 28 | nv_drm_driver.dumb_destroy = nv_drm_dumb_destroy; 29 | #endif /* NV_DRM_DRIVER_HAS_DUMB_DESTROY */ 30 | +#endif 31 | #endif /* NV_DRM_ATOMIC_MODESET_AVAILABLE */ 32 | } 33 | 34 | -- 35 | 2.40.1 36 | -------------------------------------------------------------------------------- /patches/legacy-kernel-6.5.diff: -------------------------------------------------------------------------------- 1 | From 0ca9614e5b074d3dd01e95f47b3555f48e74f622 Mon Sep 17 00:00:00 2001 2 | From: =?UTF-8?q?Joan=20Bruguera=20Mic=C3=B3?= 3 | Date: Wed, 17 May 2023 21:54:08 +0000 4 | Subject: [PATCH] Tentative fix for NVIDIA 470.182.03 driver for Linux 6.5-rc1 5 | 6 | --- 7 | kernel-dkms/common/inc/nv-mm.h | 45 +++++++++++++++++++++++++++++++++++++++++++-- 8 | 1 file changed, 43 insertions(+), 2 deletions(-) 9 | 10 | diff --git a/kernel-dkms/common/inc/nv-mm.h b/kernel-dkms/common/inc/nv-mm.h 11 | index 54f6f60..25333e8 100644 12 | --- a/kernel-dkms/common/inc/nv-mm.h 13 | +++ b/kernel-dkms/common/inc/nv-mm.h 14 | @@ -23,6 +23,7 @@ 15 | #ifndef __NV_MM_H__ 16 | #define __NV_MM_H__ 17 | 18 | +#include 19 | #include "conftest.h" 20 | 21 | #if !defined(NV_VM_FAULT_T_IS_PRESENT) 22 | @@ -47,7 +48,27 @@ typedef int vm_fault_t; 23 | * 24 | */ 25 | 26 | -#if defined(NV_GET_USER_PAGES_HAS_TASK_STRUCT) 27 | +// Rel. commit. "mm/gup: remove unused vmas parameter from get_user_pages()" (Lorenzo Stoakes, 14 May 2023) 28 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 5, 0) 29 | +#include 30 | + 31 | +static inline long NV_GET_USER_PAGES(unsigned long start, 32 | + unsigned long nr_pages, 33 | + int write, 34 | + int force, 35 | + struct page **pages, 36 | + struct vm_area_struct **vmas) 37 | +{ 38 | + unsigned int flags = 0; 39 | + 40 | + if (write) 41 | + flags |= FOLL_WRITE; 42 | + if (force) 43 | + flags |= FOLL_FORCE; 44 | + 45 | + return get_user_pages(start, nr_pages, flags, pages); 46 | +} 47 | +#elif defined(NV_GET_USER_PAGES_HAS_TASK_STRUCT) 48 | #if defined(NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS) 49 | #define NV_GET_USER_PAGES(start, nr_pages, write, force, pages, vmas) \ 50 | get_user_pages(current, current->mm, start, nr_pages, write, force, pages, vmas) 51 | @@ -130,7 +151,27 @@ typedef int vm_fault_t; 52 | * 53 | */ 54 | 55 | -#if defined(NV_GET_USER_PAGES_REMOTE_PRESENT) 56 | +// Rel. commit. "mm/gup: remove unused vmas parameter from get_user_pages_remote()" (Lorenzo Stoakes, 14 May 2023) 57 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 5, 0) 58 | +static inline long NV_GET_USER_PAGES_REMOTE(struct task_struct *tsk, 59 | + struct mm_struct *mm, 60 | + unsigned long start, 61 | + unsigned long nr_pages, 62 | + int write, 63 | + int force, 64 | + struct page **pages, 65 | + struct vm_area_struct **vmas) 66 | +{ 67 | + unsigned int flags = 0; 68 | + 69 | + if (write) 70 | + flags |= FOLL_WRITE; 71 | + if (force) 72 | + flags |= FOLL_FORCE; 73 | + 74 | + return get_user_pages_remote(mm, start, nr_pages, flags, pages, NULL); 75 | +} 76 | +#elif defined(NV_GET_USER_PAGES_REMOTE_PRESENT) 77 | #if defined(NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS) 78 | #define NV_GET_USER_PAGES_REMOTE get_user_pages_remote 79 | #else 80 | -- 81 | 2.41.0 82 | -------------------------------------------------------------------------------- /patches/legacy-kernel-6.6.diff: -------------------------------------------------------------------------------- 1 | From a1879549b0bf049de790c0775c25971c82da8638 Mon Sep 17 00:00:00 2001 2 | From: =?UTF-8?q?Joan=20Bruguera=20Mic=C3=B3?= 3 | Date: Sat, 15 Jul 2023 22:26:18 +0000 4 | Subject: [PATCH] Tentative fix for NVIDIA 470.199.02 driver for Linux 6.6-rc1 5 | 6 | --- 7 | kernel-dkms/nvidia-drm/nvidia-drm-drv.c | 4 ++++ 8 | 1 file changed, 4 insertions(+) 9 | 10 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 11 | index b93642a..1b310f3 100644 12 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 13 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 14 | @@ -808,8 +808,12 @@ static struct drm_driver nv_drm_driver = { 15 | .ioctls = nv_drm_ioctls, 16 | .num_ioctls = ARRAY_SIZE(nv_drm_ioctls), 17 | 18 | +// Rel. commit "drm/prime: Unexport helpers for fd/handle conversion" (Thomas Zimmermann, 20 Jun 2023) 19 | +// Those functions are no longer exported, but leaving them to NULL is equivalent 20 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 6, 0) 21 | .prime_handle_to_fd = drm_gem_prime_handle_to_fd, 22 | .prime_fd_to_handle = drm_gem_prime_fd_to_handle, 23 | +#endif 24 | .gem_prime_import = nv_drm_gem_prime_import, 25 | .gem_prime_import_sg_table = nv_drm_gem_prime_import_sg_table, 26 | 27 | -- 28 | 2.41.0 29 | 30 | -------------------------------------------------------------------------------- /patches/linux-version.diff: -------------------------------------------------------------------------------- 1 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-gem-nvkms-memory.c b/kernel-dkms/nvidia-drm/nvidia-drm-gem-nvkms-memory.c 2 | index 1db7777..863bb77 100644 3 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-gem-nvkms-memory.c 4 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-gem-nvkms-memory.c 5 | @@ -20,6 +20,8 @@ 6 | * DEALINGS IN THE SOFTWARE. 7 | */ 8 | 9 | +#include 10 | + 11 | #include "nvidia-drm-conftest.h" 12 | 13 | #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) 14 | 15 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-encoder.c b/kernel-dkms/nvidia-drm/nvidia-drm-encoder.c 16 | index f66bbd7c9..4de87a271 100644 17 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-encoder.c 18 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-encoder.c 19 | @@ -20,6 +20,8 @@ 20 | * DEALINGS IN THE SOFTWARE. 21 | */ 22 | 23 | +#include 24 | + 25 | #include "nvidia-drm-conftest.h" /* NV_DRM_ATOMIC_MODESET_AVAILABLE */ 26 | 27 | #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) 28 | 29 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 30 | index 58fd2724a..fc9169a96 100644 31 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 32 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c 33 | @@ -20,6 +20,8 @@ 34 | * DEALINGS IN THE SOFTWARE. 35 | */ 36 | 37 | +#include 38 | + 39 | #include "nvidia-drm-conftest.h" /* NV_DRM_AVAILABLE and NV_DRM_DRM_GEM_H_PRESENT */ 40 | 41 | #include "nvidia-drm-priv.h" 42 | 43 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-connector.c b/kernel-dkms/nvidia-drm/nvidia-drm-connector.c 44 | index 4dd12d112..44c9d8ed3 100644 45 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-connector.c 46 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-connector.c 47 | @@ -20,6 +20,8 @@ 48 | * DEALINGS IN THE SOFTWARE. 49 | */ 50 | 51 | +#include 52 | + 53 | #include "nvidia-drm-conftest.h" /* NV_DRM_ATOMIC_MODESET_AVAILABLE */ 54 | 55 | #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) 56 | 57 | diff --git a/kernel-dkms/common/inc/nv.h b/kernel-dkms/common/inc/nv.h 58 | index d52c2a1ef..f6dc2dc32 100644 59 | --- a/kernel-dkms/common/inc/nv.h 60 | +++ b/kernel-dkms/common/inc/nv.h 61 | @@ -18,6 +18,8 @@ 62 | #include 63 | #include 64 | 65 | +#include 66 | + 67 | #if !defined(NV_MIN) 68 | #define NV_MIN(_a,_b) ((_a) < (_b) ? (_a) : (_b)) 69 | #endif 70 | 71 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-gem.h b/kernel-dkms/nvidia-drm/nvidia-drm-gem.h 72 | index f276588db..7cbdbe632 100644 73 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-gem.h 74 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-gem.h 75 | @@ -38,6 +38,8 @@ 76 | 77 | #endif 78 | 79 | +#include 80 | + 81 | struct nv_drm_gem_object; 82 | 83 | struct nv_drm_gem_object_funcs { 84 | 85 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-helper.c b/kernel-dkms/nvidia-drm/nvidia-drm-helper.c 86 | index 4ccf81929..7fb59bbb3 100644 87 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-helper.c 88 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-helper.c 89 | @@ -29,6 +29,8 @@ 90 | 91 | #include "nvidia-drm-helper.h" 92 | 93 | +#include 94 | + 95 | #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) 96 | 97 | #include 98 | 99 | diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-linux.c b/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 100 | index 5a2bbc18c..133d8fe64 100644 101 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 102 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 103 | @@ -20,6 +20,8 @@ 104 | * DEALINGS IN THE SOFTWARE. 105 | */ 106 | 107 | +#include 108 | + 109 | #include 110 | #include 111 | #include 112 | 113 | diff --git a/kernel-dkms/nvidia-uvm/uvm_linux.h b/kernel-dkms/nvidia-uvm/uvm_linux.h 114 | index 8707ac070..990cefbd4 100644 115 | --- a/kernel-dkms/nvidia-uvm/uvm_linux.h 116 | +++ b/kernel-dkms/nvidia-uvm/uvm_linux.h 117 | @@ -29,6 +29,8 @@ 118 | // 119 | // 120 | 121 | +#include 122 | + 123 | #ifndef _UVM_LINUX_H 124 | #define _UVM_LINUX_H 125 | 126 | diff --git a/kernel-dkms/nvidia/nvlink_linux.c b/kernel-dkms/nvidia/nvlink_linux.c 127 | index c13b72515..db691679c 100644 128 | --- a/kernel-dkms/nvidia/nvlink_linux.c 129 | +++ b/kernel-dkms/nvidia/nvlink_linux.c 130 | @@ -37,6 +37,8 @@ 131 | #include 132 | #include 133 | 134 | +#include 135 | + 136 | #define MAX_ERROR_STRING 512 137 | 138 | #define NV_MAX_ISR_DELAY_US 20000 139 | 140 | diff --git a/kernel-dkms/nvidia/os-interface.c b/kernel-dkms/nvidia/os-interface.c 141 | index d1c889f69..88c57b2da 100644 142 | --- a/kernel-dkms/nvidia/os-interface.c 143 | +++ b/kernel-dkms/nvidia/os-interface.c 144 | @@ -14,6 +14,8 @@ 145 | #include "os-interface.h" 146 | #include "nv-linux.h" 147 | 148 | +#include 149 | + 150 | #define MAX_ERROR_STRING 512 151 | static char nv_error_string[MAX_ERROR_STRING]; 152 | nv_spinlock_t nv_error_string_lock; 153 | 154 | diff --git a/kernel-dkms/nvidia-modeset/nvidia-modeset-linux.c b/kernel-dkms/nvidia-modeset/nvidia-modeset-linux.c 155 | index 1b9148ee7..4c1bd3617 100644 156 | --- a/kernel-dkms/nvidia-modeset/nvidia-modeset-linux.c 157 | +++ b/kernel-dkms/nvidia-modeset/nvidia-modeset-linux.c 158 | @@ -8,6 +8,8 @@ 159 | * _NVRM_COPYRIGHT_END_ 160 | */ 161 | 162 | +#include 163 | + 164 | #include 165 | #include 166 | #include 167 | -------------------------------------------------------------------------------- /patches/list_is_first.diff: -------------------------------------------------------------------------------- 1 | From d42eed1eca8947a3c601a5e21c7820f0bba8550b Mon Sep 17 00:00:00 2001 2 | From: Tk-Glitch 3 | Date: Wed, 3 Apr 2019 18:41:21 +0200 4 | Subject: nvidia-fix-2 5 | 6 | 7 | diff --git a/kernel-dkms/common/inc/nv-list-helpers.h b/kernel-dkms/common/inc/nv-list-helpers.h 8 | index 2feaa1afd..0d66f00c8 100644 9 | --- a/kernel-dkms/common/inc/nv-list-helpers.h 10 | +++ b/kernel-dkms/common/inc/nv-list-helpers.h 11 | @@ -23,6 +23,8 @@ 12 | #ifndef __NV_LIST_HELPERS_H__ 13 | #define __NV_LIST_HELPERS_H__ 14 | 15 | +#include 16 | + 17 | #include 18 | #include "conftest.h" 19 | 20 | diff --git a/kernel-dkms/nvidia-uvm/uvm8_range_tree.c b/kernel-dkms/nvidia-uvm/uvm8_range_tree.c 21 | index b7170d03c..7d24b01f3 100644 22 | --- a/kernel-dkms/nvidia-uvm/uvm8_range_tree.c 23 | +++ b/kernel-dkms/nvidia-uvm/uvm8_range_tree.c 24 | @@ -31,9 +31,15 @@ static uvm_range_tree_node_t *get_range_node(struct rb_node *rb_node) 25 | 26 | uvm_range_tree_node_t *uvm_range_tree_prev(uvm_range_tree_t *tree, uvm_range_tree_node_t *node) 27 | { 28 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0) 29 | if (list_is_first(&node->list, &tree->head)) 30 | return NULL; 31 | return list_prev_entry(node, list); 32 | +#else 33 | + if (nv_list_is_first(&node->list, &tree->head)) 34 | + return NULL; 35 | + return list_prev_entry(node, list); 36 | +#endif 37 | } 38 | 39 | uvm_range_tree_node_t *uvm_range_tree_next(uvm_range_tree_t *tree, uvm_range_tree_node_t *node) 40 | -------------------------------------------------------------------------------- /patches/make-modeset-fbdev-default-565.diff: -------------------------------------------------------------------------------- 1 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 2 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 3 | @@ -31,13 +31,13 @@ 4 | 5 | MODULE_PARM_DESC( 6 | modeset, 7 | - "Enable atomic kernel modesetting (1 = enable, 0 = disable (default))"); 8 | + "Enable atomic kernel modesetting (1 = enable (default), 0 = disable)"); 9 | module_param_named(modeset, nv_drm_modeset_module_param, bool, 0400); 10 | 11 | #if defined(NV_DRM_FBDEV_AVAILABLE) 12 | MODULE_PARM_DESC( 13 | fbdev, 14 | - "Create a framebuffer device (1 = enable, 0 = disable (default)) (EXPERIMENTAL)"); 15 | + "Create a framebuffer device (1 = enable (default), 0 = disable) (EXPERIMENTAL)"); 16 | module_param_named(fbdev, nv_drm_fbdev_module_param, bool, 0400); 17 | #endif 18 | 19 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-os-interface.c 20 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-os-interface.c 21 | @@ -41,8 +41,8 @@ 22 | #include 23 | #endif 24 | 25 | -bool nv_drm_modeset_module_param = false; 26 | -bool nv_drm_fbdev_module_param = false; 27 | +bool nv_drm_modeset_module_param = true; 28 | +bool nv_drm_fbdev_module_param = true; 29 | 30 | void *nv_drm_calloc(size_t nmemb, size_t size) 31 | { 32 | -------------------------------------------------------------------------------- /patches/make-modeset-fbdev-default.diff: -------------------------------------------------------------------------------- 1 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 2 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-linux.c 3 | @@ -31,13 +31,13 @@ 4 | 5 | MODULE_PARM_DESC( 6 | modeset, 7 | - "Enable atomic kernel modesetting (1 = enable, 0 = disable (default))"); 8 | + "Enable atomic kernel modesetting (1 = enable (default), 0 = disable)"); 9 | module_param_named(modeset, nv_drm_modeset_module_param, bool, 0400); 10 | 11 | #if defined(NV_DRM_FBDEV_GENERIC_AVAILABLE) 12 | MODULE_PARM_DESC( 13 | fbdev, 14 | - "Create a framebuffer device (1 = enable, 0 = disable (default)) (EXPERIMENTAL)"); 15 | + "Create a framebuffer device (1 = enable (default), 0 = disable) (EXPERIMENTAL)"); 16 | module_param_named(fbdev, nv_drm_fbdev_module_param, bool, 0400); 17 | #endif 18 | 19 | --- a/kernel-dkms/nvidia-drm/nvidia-drm-os-interface.c 20 | +++ b/kernel-dkms/nvidia-drm/nvidia-drm-os-interface.c 21 | @@ -41,8 +41,8 @@ 22 | #include 23 | #endif 24 | 25 | -bool nv_drm_modeset_module_param = false; 26 | -bool nv_drm_fbdev_module_param = false; 27 | +bool nv_drm_modeset_module_param = true; 28 | +bool nv_drm_fbdev_module_param = true; 29 | 30 | void *nv_drm_calloc(size_t nmemb, size_t size) 31 | { 32 | -------------------------------------------------------------------------------- /patches/nvidia-open-gcc-ibt-sls.diff: -------------------------------------------------------------------------------- 1 | diff --git a/src/nvidia-modeset/Makefile b/src/nvidia-modeset/Makefile 2 | index c63b86b..a67d2fc 100644 3 | --- a/src/nvidia-modeset/Makefile 4 | +++ b/src/nvidia-modeset/Makefile 5 | @@ -95,7 +95,8 @@ CFLAGS += -ffunction-sections 6 | CFLAGS += -fdata-sections 7 | CFLAGS += -ffreestanding 8 | 9 | -CONDITIONAL_CFLAGS := $(call TEST_CC_ARG, -fcf-protection=none) 10 | +CONDITIONAL_CFLAGS += $(call TEST_CC_ARG, -fcf-protection=branch) 11 | +CONDITIONAL_CFLAGS += $(call TEST_CC_ARG, -mharden-sls=all) 12 | CONDITIONAL_CFLAGS += $(call TEST_CC_ARG, -Wformat-overflow=2) 13 | CONDITIONAL_CFLAGS += $(call TEST_CC_ARG, -Wformat-truncation=1) 14 | ifeq ($(TARGET_ARCH),x86_64) 15 | diff --git a/src/nvidia/Makefile b/src/nvidia/Makefile 16 | index 9bdb826..3f1e330 100644 17 | --- a/src/nvidia/Makefile 18 | +++ b/src/nvidia/Makefile 19 | @@ -119,7 +119,8 @@ CFLAGS += -fdata-sections 20 | NV_KERNEL_O_LDFLAGS += --gc-sections 21 | EXPORTS_LINK_COMMAND = exports_link_command.txt 22 | 23 | -CONDITIONAL_CFLAGS += $(call TEST_CC_ARG, -fcf-protection=none) 24 | +CONDITIONAL_CFLAGS += $(call TEST_CC_ARG, -fcf-protection=branch -mindirect-branch-register) 25 | +CONDITIONAL_CFLAGS += $(call TEST_CC_ARG, -mharden-sls=all) 26 | 27 | ifeq ($(TARGET_ARCH),x86_64) 28 | CONDITIONAL_CFLAGS += $(call TEST_CC_ARG, -mindirect-branch-register) 29 | -------------------------------------------------------------------------------- /patches/silence-event-assert-until-570.diff: -------------------------------------------------------------------------------- 1 | diff --git a/src/nvidia/src/kernel/rmapi/event_notification.c b/src/nvidia/src/kernel/rmapi/event_notification.c 2 | index cf78eadd..d6937cac 100644 3 | --- a/src/nvidia/src/kernel/rmapi/event_notification.c 4 | +++ b/src/nvidia/src/kernel/rmapi/event_notification.c 5 | @@ -286,11 +286,11 @@ static NV_STATUS _gpuEngineEventNotificationListNotify 6 | portSyncSpinlockAcquire(pEventNotificationList->pSpinlock); 7 | { 8 | // We don't expect this to be called multiple times in parallel 9 | - NV_ASSERT_OR_ELSE(pEventNotificationList->pendingEventNotifyCount == 0, 10 | + if (pEventNotificationList->pendingEventNotifyCount != 0) 11 | { 12 | portSyncSpinlockRelease(pEventNotificationList->pSpinlock); 13 | return NV_ERR_INVALID_STATE; 14 | - }); 15 | + } 16 | 17 | EngineEventNotificationListIter it = 18 | listIterAll(&pEventNotificationList->eventNotificationList); 19 | -------------------------------------------------------------------------------- /system/10-nvidia-drm-outputclass.conf: -------------------------------------------------------------------------------- 1 | Section "OutputClass" 2 | Identifier "nvidia" 3 | MatchDriver "nvidia-drm" 4 | Driver "nvidia" 5 | Option "AllowEmptyInitialConfiguration" 6 | ModulePath "/usr/lib/nvidia/xorg" 7 | ModulePath "/usr/lib/xorg/modules" 8 | EndSection 9 | -------------------------------------------------------------------------------- /system/egl-wayland/licenses/egl-wayland/COPYING: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a 4 | copy of this software and associated documentation files (the "Software"), 5 | to deal in the Software without restriction, including without limitation 6 | the rights to use, copy, modify, merge, publish, distribute, sublicense, 7 | and/or sell copies of the Software, and to permit persons to whom the 8 | Software is furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 16 | THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 19 | DEALINGS IN THE SOFTWARE. 20 | 21 | -------------------------------------------------------------------------------- /system/egl-wayland/pkgconfig/wayland-eglstream-protocols.pc: -------------------------------------------------------------------------------- 1 | prefix=/usr 2 | datarootdir=${prefix}/share 3 | pkgdatadir=${datarootdir}/wayland-eglstream 4 | 5 | Name: wayland-eglstream-protocols 6 | Description: Nvidia Wayland EGLStream XML protocol files 7 | Version: 1.1.2 8 | 9 | -------------------------------------------------------------------------------- /system/egl-wayland/pkgconfig/wayland-eglstream.pc: -------------------------------------------------------------------------------- 1 | prefix=/usr 2 | exec_prefix=${prefix} 3 | libdir=${exec_prefix}/lib 4 | includedir=${prefix}/include 5 | 6 | Name: wayland-eglstream 7 | Description: Nvidia Wayland EGLStream compositor helper libraries 8 | Version: 1.1.2 9 | Cflags: -I${includedir} 10 | Libs: -L${libdir} -lnvidia-egl-wayland 11 | Requires: eglexternalplatform >= 1.1 eglexternalplatform < 2 12 | 13 | -------------------------------------------------------------------------------- /system/egl-wayland/wayland-eglstream/wayland-eglstream-controller.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Copyright (c) 2017-2018, NVIDIA CORPORATION. All rights reserved. 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a 7 | copy of this software and associated documentation files (the "Software"), 8 | to deal in the Software without restriction, including without limitation 9 | the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 | and/or sell copies of the Software, and to permit persons to whom the 11 | Software is furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in 14 | all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 | THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22 | DEALINGS IN THE SOFTWARE. 23 | 24 | 25 | 27 | 28 | 29 | - dont_care: Using this enum will tell the server to make its own 30 | decisions regarding present mode. 31 | 32 | - fifo: Tells the server to use a fifo present mode. The decision to 33 | use fifo synchronous is left up to the server. 34 | 35 | - mailbox: Tells the server to use a mailbox present mode. 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | - present_mode: Must be one of wl_eglstream_controller_present_mode. Tells the 45 | server the desired present mode that should be used. 46 | 47 | - fifo_length: Only valid when the present_mode attrib is provided and its 48 | value is specified as fifo. Tells the server the desired fifo 49 | length to be used when the desired present_mode is fifo. 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | Creates the corresponding server side EGLStream from the given wl_buffer 58 | and attaches a consumer to it. 59 | 60 | 63 | 65 | 66 | 67 | 68 | 69 | Creates the corresponding server side EGLStream from the given wl_buffer 70 | and attaches a consumer to it using the given attributes. 71 | 72 | 75 | 77 | 79 | 80 | It contains key-value pairs compatible with intptr_t type. A key must 81 | be one of wl_eglstream_controller_attrib enumeration values. What a value 82 | represents is attribute-specific. 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /system/egl-wayland/wayland-eglstream/wayland-eglstream.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Copyright (c) 2014-2016, NVIDIA CORPORATION. All rights reserved. 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a 8 | copy of this software and associated documentation files (the "Software"), 9 | to deal in the Software without restriction, including without limitation 10 | the rights to use, copy, modify, merge, publish, distribute, sublicense, 11 | and/or sell copies of the Software, and to permit persons to whom the 12 | Software is furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in 15 | all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 | THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23 | DEALINGS IN THE SOFTWARE. 24 | 25 | 26 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 40 | 41 | 42 | - fd: The given handle represents a file descriptor, and the 43 | EGLStream connection must be done as described in 44 | EGL_KHR_stream_cross_process_fd 45 | 46 | - inet: The EGLStream connection must be done using an inet address 47 | and port as described in EGL_NV_stream_socket. The given 48 | handle can be ignored, but both inet address and port must 49 | be given as attributes. 50 | 51 | - socket: The given handle represents a unix socket, and the EGLStream 52 | connection must be done as described in EGL_NV_stream_socket. 53 | 54 | 55 | 56 | 57 | 58 | 59 | 61 | 62 | 63 | - inet_addr: The given attribute encodes an IPv4 address of a client 64 | socket. Both IPv4 address and port must be set at the same 65 | time. 66 | 67 | - inet_port: The given attribute encodes a port of a client socket. Both 68 | IPv4 address and port must be set at the same time. 69 | 70 | 71 | 72 | 73 | 74 | 75 | 78 | 79 | 82 | 83 | 84 | This enum values should be used as bit masks. 85 | 86 | - stream_fd: The server supports EGLStream connections as described 87 | in EGL_KHR_stream_cross_process_fd 88 | 89 | - stream_inet: The server supports EGLStream inet connections as 90 | described in EGL_NV_stream_socket. 91 | 92 | - stream_socket: The server supports EGLStream unix socket connections 93 | as described in EGL_NV_stream_socket. 94 | 95 | 96 | 97 | 98 | 99 | 100 | 103 | 104 | 105 | The capabilities event is sent out at wl_eglstream_display binding 106 | time. It allows the server to advertise what features it supports so 107 | clients may know what is safe to be used. 108 | 109 | 110 | 111 | 112 | 113 | 114 | The swapinterval_override event is sent out whenever a client requests 115 | a swapinterval setting through swap_interval() and there is an override 116 | in place that will make such request to be ignored. 117 | The swapinterval_override event will provide the override value so 118 | that the client is made aware of it. 119 | 120 | 122 | 124 | 125 | 126 | 130 | 131 | 132 | Create a wl_buffer corresponding to given handle. The attributes list 133 | may be used to define additional EGLStream connection data (e.g inet 134 | address/port). The server can create its EGLStream handle using the 135 | information encoded in the wl_buffer. 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | It contains key-value pairs compatible with intptr_t type. A key must 145 | be one of wl_eglstream_display_attrib enumeration values. What a value 146 | represents is attribute-specific. 147 | 148 | 149 | 150 | 151 | 152 | 153 | Set the swap interval for the consumer of the given EGLStream. The swap 154 | interval is silently clamped to the valid range on the server side. 155 | 156 | 158 | 159 | 160 | 161 | 162 | -------------------------------------------------------------------------------- /system/nvidia-sleep.conf: -------------------------------------------------------------------------------- 1 | # https://download.nvidia.com/XFree86/Linux-x86_64/560.35.03/README/powermanagement.html#PreserveAllVide719f0 2 | # Save and restore all video memory allocations. 3 | options nvidia NVreg_PreserveVideoMemoryAllocations=1 4 | # 5 | # The destination should not be using tmpfs, so we prefer 6 | # /var/tmp instead of /tmp 7 | options nvidia NVreg_TemporaryFilePath=/var/tmp 8 | -------------------------------------------------------------------------------- /system/nvidia-tkg.hook: -------------------------------------------------------------------------------- 1 | [Trigger] 2 | Operation=Install 3 | Operation=Upgrade 4 | Operation=Remove 5 | Type=Package 6 | Target=nvidia-tkg 7 | Target=nvidia-dkms-tkg 8 | Target=nvidia-dev-tkg 9 | Target=nvidia-dev-dkms-tkg 10 | Target=nvidia-open-tkg 11 | Target=nvidia-open-dkms-tkg 12 | 13 | [Action] 14 | Description=Update Nvidia modules in initcpio 15 | When=PostTransaction 16 | NeedsTargets 17 | Exec=/bin/sh -c 'if command -v mkinitcpio >/dev/null 2>&1; then mkinitcpio -P; elif command -v /usr/lib/booster/regenerate_images >/dev/null 2>&1; then /usr/lib/booster/regenerate_images; elif command -v dracut >/dev/null 2>&1; then dracut --regenerate-all --force; else printf "\\033[31m The initramfs generator was not found, please update initramfs manually\\033[0m\\n"; fi' 18 | -------------------------------------------------------------------------------- /system/nvidia-tkg.install: -------------------------------------------------------------------------------- 1 | _depmod() { 2 | # Update module dependencies for all kernels 3 | local -a _kernels 4 | mapfile -t _kernels < <(find /usr/lib/modules/*/build/version -exec cat {} +) 5 | for _kernel in "${_kernels[@]}"; do 6 | depmod $_kernel 7 | done 8 | } 9 | 10 | _rmmod() { 11 | # Try unloading 12 | if lsmod | grep -q nvidia; then 13 | rmmod nvidia 14 | fi 15 | 16 | # What? 17 | if [[ $? != 0 ]]; then 18 | # X running? 19 | if pidof Xorg >/dev/null; then 20 | echo ":: Please reboot or exit X first." 21 | fi 22 | fi 23 | } 24 | 25 | post_install() { 26 | _depmod 27 | 28 | # X running? 29 | if pidof Xorg >/dev/null; then 30 | echo ":: Please reboot or exit X to unload the current module." 31 | fi 32 | } 33 | 34 | post_upgrade() { 35 | _depmod 36 | 37 | # Not rebuilding? 38 | if (( $(vercmp $1 $2) != 0 )); then 39 | _rmmod 40 | fi 41 | } 42 | 43 | post_remove() { 44 | _depmod 45 | 46 | _rmmod 47 | } 48 | -------------------------------------------------------------------------------- /system/nvidia-utils-tkg.install: -------------------------------------------------------------------------------- 1 | post_install() { 2 | # Enable NVIDIA Services at first installation 3 | # The services are mandatory, see under systemd configuration 4 | # https://download.nvidia.com/XFree86/Linux-x86_64/560.35.03/README/powermanagement.html#SystemdConfigur74e29 5 | # This is also an requirement to have sleep working together with PreserveAllocations 6 | # https://gitlab.archlinux.org/archlinux/packaging/packages/nvidia-utils/-/commit/55644f78820fd382fbdf283b1fd7f08e6b7c22d7 7 | # https://gitlab.archlinux.org/archlinux/packaging/packages/nvidia-utils/-/merge_requests/16 8 | systemctl enable nvidia-resume nvidia-hibernate nvidia-suspend 9 | } 10 | 11 | post_upgrade() { 12 | # Only enable the services for the 560.35.03-16 version 13 | # This avoids, that the services are automatically enabled in every upgrade 14 | if (( $(vercmp $2 560.35.03-16) < 0)); then 15 | for service in nvidia-resume nvidia-hibernate nvidia-suspend; do 16 | if ! systemctl is-enabled --quiet $service; then 17 | echo "Enabling $service..." 18 | systemctl enable $service 19 | fi 20 | done 21 | fi 22 | } 23 | 24 | pre_remove() { 25 | systemctl disable nvidia-resume nvidia-hibernate nvidia-suspend 26 | } 27 | -------------------------------------------------------------------------------- /system/nvidia-utils-tkg.sysusers: -------------------------------------------------------------------------------- 1 | u! nvidia-persistenced 143 'NVIDIA Persistence Daemon' 2 | --------------------------------------------------------------------------------