From 7f053c3095a1e3b807867d8f41babbceeb327eb0 Mon Sep 17 00:00:00 2001 From: Matej Dian Date: Thu, 14 Jan 2021 17:43:16 +0100 Subject: [PATCH] Add initial kernel 5.11 patch (#23) * Add initial kernel 5.11 patch tested on 5.11rc2 + 460.32.03 http://rglinuxtech.com/?p=2878 http://rglinuxtech.com/?p=2871 * Add pahole dependency required to build against 5.11 --- PKGBUILD | 30 +++- patches/kernel-5.11.patch | 344 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 372 insertions(+), 2 deletions(-) create mode 100644 patches/kernel-5.11.patch diff --git a/PKGBUILD b/PKGBUILD index e87230f..a5784a3 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -162,11 +162,12 @@ fi pkgname=("${_pkgname_array[@]}") pkgver=$_driver_version -pkgrel=145 +pkgrel=146 arch=('x86_64') url="http://www.nvidia.com/" license=('custom:NVIDIA') optdepends=('linux-headers' 'linux-lts-headers: Build the module for LTS Arch kernel') +makedepends=('pahole') options=('!strip') cp "$where"/patches/* "$where" && cp -r "$where"/system/* "$where" @@ -211,6 +212,7 @@ source=($_source_name 'kernel-5.9.patch' # 5.9 workaround '5.9-gpl.diff' # 5.9 cuda/nvenc workaround 'kernel-5.10.patch' # 5.10 workaround + 'kernel-5.11.patch' # 5.11 workaround '455-crashfix.diff' # 455 drivers fix - https://forums.developer.nvidia.com/t/455-23-04-page-allocation-failure-in-kernel-module-at-random-points/155250/79 ) @@ -242,6 +244,7 @@ md5sums=("$_md5sum" '888d12b9aea711e6a025835b8ad063e2' '0758046ed7c50463fd0ec378e9e34f95' 'bcdd512edad1bad8331a8872259d2581' + '50c676a110fad2e0faa4c4e4b8488a66' '08bec554de265ce5fdcfdbd55fb608fc') if [ "$_autoaddpatch" = "true" ]; then @@ -504,6 +507,12 @@ DEST_MODULE_LOCATION[3]="/kernel/drivers/video"' dkms.conf _whitelist510=( 450* 455.2* 455.3* ) fi + # 5.11 + if (( $(vercmp "$_kernel" "5.11") >= 0 )); then + _kernel511="1" + _whitelist511=( 460* ) + fi + # Loop patches (linux-4.15.patch, lol.patch, ...) for _p in $(printf -- '%s\n' ${source[@]} | grep .patch); do # https://stackoverflow.com/a/21058239/1821548 # Patch version (4.15, "", ...) @@ -551,6 +560,9 @@ DEST_MODULE_LOCATION[3]="/kernel/drivers/video"' dkms.conf if [ "$_patch" = "5.10" ]; then _whitelist=(${_whitelist510[@]}) fi + if [ "$_patch" = "5.11" ]; then + _whitelist=(${_whitelist511[@]}) + fi patchy=0 if (( $(vercmp "$_kernel" "$_patch") >= 0 )); then @@ -796,6 +808,20 @@ DEST_MODULE_LOCATION[3]="/kernel/drivers/video"' dkms.conf fi fi + # 5.11 + if [ "$_kernel511" = "1" ]; then + patchy=0 + for yup in "${_whitelist511[@]}"; do + [[ $pkgver = $yup ]] && patchy=1 + done + if [ "$patchy" = "1" ]; then + msg2 "Applying kernel-5.11.patch for dkms..." + patch -Np1 -i "$srcdir"/kernel-5.11.patch + else + msg2 "Skipping kernel-5.11.patch as it doesn't apply to this driver version..." + fi + fi + # 5.9 - 5.10 quirk if [ "$_kernel59" = "1" ] || [ "$_kernel510" = "1" ]; then if [[ $pkgver = 450* ]] || [[ $pkgver = 455.2* ]] || [[ $pkgver = 455.3* ]]; then @@ -1226,7 +1252,7 @@ package_lib32-nvidia-dev-utils-tkg() { if [ "$_dkms" = "true" ] || [ "$_dkms" = "full" ]; then nvidia-dkms-tkg() { pkgdesc="NVIDIA kernel module sources (DKMS)" - depends=('dkms' "nvidia-utils-tkg>=${pkgver}" 'nvidia-libgl') + depends=('dkms' "nvidia-utils-tkg>=${pkgver}" 'nvidia-libgl' 'pahole') provides=("nvidia=${pkgver}" 'nvidia-dkms' "nvidia-dkms-tkg=${pkgver}" 'NVIDIA-MODULE') conflicts=('nvidia' 'nvidia-dkms') diff --git a/patches/kernel-5.11.patch b/patches/kernel-5.11.patch new file mode 100644 index 0000000..f665806 --- /dev/null +++ b/patches/kernel-5.11.patch @@ -0,0 +1,344 @@ +diff --git a/kernel-dkms/conftest.sh b/kernel-dkms/conftest.sh +index 282a911..c2d0fc3 100755 +--- a/kernel-dkms/conftest.sh ++++ b/kernel-dkms/conftest.sh +@@ -159,6 +159,7 @@ test_headers() { + FILES="$FILES asm/pgtable_types.h" + FILES="$FILES linux/stringhash.h" + FILES="$FILES linux/dma-map-ops.h" ++ FILES="$FILES asm/kmap_types.h" + + translate_and_preprocess_header_files $FILES + } +@@ -1265,6 +1266,8 @@ compile_test() { + drm_available) + # Determine if the DRM subsystem is usable + CODE=" ++ #include ++ + #if defined(NV_DRM_DRMP_H_PRESENT) + #include + #endif +@@ -1273,6 +1276,10 @@ compile_test() { + #include + #endif + ++ #if defined(NV_DRM_DRM_GEM_H_PRESENT) ++ #include ++ #endif ++ + #if defined(NV_DRM_DRM_PRIME_H_PRESENT) + #include + #endif +@@ -1282,6 +1289,7 @@ compile_test() { + #endif + + void conftest_drm_available(void) { ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) + struct drm_driver drv; + + /* 2013-01-15 89177644a7b6306e6084a89eab7e290f4bfef397 */ +@@ -1291,6 +1299,13 @@ compile_test() { + drv.gem_prime_vunmap = 0; + (void)drm_gem_prime_import; + (void)drm_gem_prime_export; ++#else ++ struct drm_gem_object_funcs gem; ++ gem.pin = 0; ++ gem.get_sg_table = 0; ++ gem.vmap = 0; ++ gem.vunmap = 0; ++#endif + + /* 2013-10-02 1bb72532ac260a2d3982b40bdd4c936d779d0d16 */ + (void)drm_dev_alloc; +diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-crtc.c b/kernel-dkms/nvidia-drm/nvidia-drm-crtc.c +index b966bb2..b104d13 100644 +--- a/kernel-dkms/nvidia-drm/nvidia-drm-crtc.c ++++ b/kernel-dkms/nvidia-drm/nvidia-drm-crtc.c +@@ -42,6 +42,8 @@ + #include + #include + ++#include ++ + static void nv_drm_plane_destroy(struct drm_plane *plane) + { + /* plane->state gets freed here */ +@@ -460,8 +462,14 @@ static int head_modeset_config_attach_connector( + * will be discarded if ->atomic_check() fails. + */ + static int nv_drm_crtc_atomic_check(struct drm_crtc *crtc, ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0) + struct drm_crtc_state *crtc_state) + { ++#else ++ struct drm_atomic_state *state) ++{ ++ struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,crtc); ++#endif + struct nv_drm_crtc_state *nv_crtc_state = to_nv_crtc_state(crtc_state); + struct NvKmsKapiHeadRequestedConfig *req_config = + &nv_crtc_state->req_config; +@@ -532,7 +540,11 @@ static void nv_drm_crtc_disable(struct drm_crtc *crtc) + + #ifdef NV_DRM_CRTC_HELPER_FUNCS_HAS_ATOMIC_ENABLE + static void nv_drm_crtc_atomic_enable(struct drm_crtc *crtc, ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0) + struct drm_crtc_state *old_crtc_state) ++#else ++ struct drm_atomic_state *state) ++#endif + { + + } +diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c +index ebfb5cd..e816f26 100644 +--- a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c ++++ b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c +@@ -20,6 +20,7 @@ + * DEALINGS IN THE SOFTWARE. + */ + ++#include + #include "nvidia-drm-conftest.h" /* NV_DRM_AVAILABLE and NV_DRM_DRM_GEM_H_PRESENT */ + + #include "nvidia-drm-priv.h" +@@ -755,12 +756,21 @@ static struct drm_driver nv_drm_driver = { + + .prime_handle_to_fd = drm_gem_prime_handle_to_fd, + .prime_fd_to_handle = drm_gem_prime_fd_to_handle, ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) ++ // Deprecated in favour of equivalent in drm_get_object in torvalds/linux commit d693def4fd1c23f1ca5aed1afb9993b3a2069ad2 + .gem_prime_export = drm_gem_prime_export, ++#endif + .gem_prime_import = nv_drm_gem_prime_import, ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) ++ // Deprecated in favour of equivalent in drm_get_object in torvalds/linux commit d693def4fd1c23f1ca5aed1afb9993b3a2069ad2 + .gem_prime_get_sg_table = nv_drm_gem_prime_get_sg_table, ++#endif + .gem_prime_import_sg_table = nv_drm_gem_prime_import_sg_table, ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) ++ // Deprecated in favour of equivalent in drm_get_object in torvalds/linux commit d693def4fd1c23f1ca5aed1afb9993b3a2069ad2 + .gem_prime_vmap = nv_drm_gem_prime_vmap, + .gem_prime_vunmap = nv_drm_gem_prime_vunmap, ++#endif + + #if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_RES_OBJ) + .gem_prime_res_obj = nv_drm_gem_prime_res_obj, +@@ -784,12 +794,16 @@ static struct drm_driver nv_drm_driver = { + .desc = "NVIDIA DRM driver", + .date = "20160202", + ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) ++ // This is now behind a CONFIG_DRM_LEGACY Kconfig flag.(torvalds/linux commit 57bb1ee6034046be70aed33fd6d447bb2b7261fa) ++ // (Was this used anyway? Just remove it entirely for now) + #if defined(NV_DRM_DRIVER_HAS_LEGACY_DEV_LIST) + .legacy_dev_list = LIST_HEAD_INIT(nv_drm_driver.legacy_dev_list), + #else + .device_list = LIST_HEAD_INIT(nv_drm_driver.device_list), + #endif + .gem_vm_ops = &nv_drm_gem_vma_ops, ++#endif + }; + + +diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c b/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c +index e554adc..4aa082b 100644 +--- a/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c ++++ b/kernel-dkms/nvidia-drm/nvidia-drm-gem-user-memory.c +@@ -20,6 +20,7 @@ + * DEALINGS IN THE SOFTWARE. + */ + ++#include + #include "nvidia-drm-conftest.h" + + #if defined(NV_DRM_AVAILABLE) +@@ -58,6 +59,7 @@ static struct sg_table *__nv_drm_gem_user_memory_prime_get_sg_table( + nv_user_memory->pages_count); + } + ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) + static void *__nv_drm_gem_user_memory_prime_vmap( + struct nv_drm_gem_object *nv_gem) + { +@@ -73,6 +75,28 @@ static void __nv_drm_gem_user_memory_prime_vunmap( + { + nv_drm_vunmap(address); + } ++#else ++// Updated vmap/vunmap operations to use struct dma_buf_map instead of raw pointers ++// See torvalds/linux commits ccc22d41bd9acec58cdc7c3b012e1887aba40af4, 6619ccf1bb1d0ebb071f758111efa83918b216fc ++static int __nv_drm_gem_user_memory_prime_vmap( ++ struct nv_drm_gem_object *nv_gem, ++ struct dma_buf_map *map) ++{ ++ struct nv_drm_gem_user_memory *nv_user_memory = to_nv_user_memory(nv_gem); ++ ++ map->vaddr = nv_drm_vmap(nv_user_memory->pages, ++ nv_user_memory->pages_count); ++ map->is_iomem = false; ++ return 0; ++} ++ ++static void __nv_drm_gem_user_memory_prime_vunmap( ++ struct nv_drm_gem_object *gem, ++ struct dma_buf_map *map) ++{ ++ nv_drm_vunmap(map->vaddr); ++} ++#endif + + static int __nv_drm_gem_user_memory_mmap(struct nv_drm_gem_object *nv_gem, + struct vm_area_struct *vma) +diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-gem.c b/kernel-dkms/nvidia-drm/nvidia-drm-gem.c +index a6b54f0..ca45362 100644 +--- a/kernel-dkms/nvidia-drm/nvidia-drm-gem.c ++++ b/kernel-dkms/nvidia-drm/nvidia-drm-gem.c +@@ -20,6 +20,7 @@ + * DEALINGS IN THE SOFTWARE. + */ + ++#include + #include "nvidia-drm-conftest.h" + + #if defined(NV_DRM_AVAILABLE) +@@ -67,6 +68,13 @@ void nv_drm_gem_free(struct drm_gem_object *gem) + static struct drm_gem_object_funcs nv_drm_gem_funcs = { + .free = nv_drm_gem_free, + .get_sg_table = nv_drm_gem_prime_get_sg_table, ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0)) ++ // New functions moved from drm_driver because of torvalds/linux commit d693def4fd1c23f1ca5aed1afb9993b3a2069ad2 ++ .export = drm_gem_prime_export, ++ .vmap = nv_drm_gem_prime_vmap, ++ .vunmap = nv_drm_gem_prime_vunmap, ++ .vm_ops = &nv_drm_gem_vma_ops, ++#endif + }; + #endif + +@@ -141,6 +149,7 @@ struct sg_table *nv_drm_gem_prime_get_sg_table(struct drm_gem_object *gem) + return ERR_PTR(-ENOTSUPP); + } + ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) + void *nv_drm_gem_prime_vmap(struct drm_gem_object *gem) + { + struct nv_drm_gem_object *nv_gem = to_nv_gem_object(gem); +@@ -160,6 +169,29 @@ void nv_drm_gem_prime_vunmap(struct drm_gem_object *gem, void *address) + nv_gem->ops->prime_vunmap(nv_gem, address); + } + } ++#else ++// Updated vmap/vunmap operations to use struct dma_buf_map instead of raw pointers ++// See torvalds/linux commits ccc22d41bd9acec58cdc7c3b012e1887aba40af4, 6619ccf1bb1d0ebb071f758111efa83918b216fc ++int nv_drm_gem_prime_vmap(struct drm_gem_object *gem, struct dma_buf_map *map) ++{ ++ struct nv_drm_gem_object *nv_gem = to_nv_gem_object(gem); ++ ++ if (nv_gem->ops->prime_vmap != NULL) { ++ return nv_gem->ops->prime_vmap(nv_gem, map); ++ } ++ ++ return -ENOTSUPP; ++} ++ ++void nv_drm_gem_prime_vunmap(struct drm_gem_object *gem, struct dma_buf_map *map) ++{ ++ struct nv_drm_gem_object *nv_gem = to_nv_gem_object(gem); ++ ++ if (nv_gem->ops->prime_vunmap != NULL) { ++ nv_gem->ops->prime_vunmap(nv_gem, map); ++ } ++} ++#endif + + #if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_RES_OBJ) + nv_dma_resv_t* nv_drm_gem_prime_res_obj(struct drm_gem_object *obj) +diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-gem.h b/kernel-dkms/nvidia-drm/nvidia-drm-gem.h +index 5c9f33d..24576e2 100644 +--- a/kernel-dkms/nvidia-drm/nvidia-drm-gem.h ++++ b/kernel-dkms/nvidia-drm/nvidia-drm-gem.h +@@ -23,6 +23,7 @@ + #ifndef __NVIDIA_DRM_GEM_H__ + #define __NVIDIA_DRM_GEM_H__ + ++#include + #include "nvidia-drm-conftest.h" + + #if defined(NV_DRM_AVAILABLE) +@@ -50,8 +51,15 @@ struct nv_drm_gem_object; + struct nv_drm_gem_object_funcs { + void (*free)(struct nv_drm_gem_object *nv_gem); + struct sg_table *(*prime_get_sg_table)(struct nv_drm_gem_object *nv_gem); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) + void *(*prime_vmap)(struct nv_drm_gem_object *nv_gem); + void (*prime_vunmap)(struct nv_drm_gem_object *nv_gem, void *address); ++#else ++ // Updated vmap/vunmap operations to use struct dma_buf_map instead of raw pointers ++ // See torvalds/linux commits ccc22d41bd9acec58cdc7c3b012e1887aba40af4, 6619ccf1bb1d0ebb071f758111efa83918b216fc ++ int (*prime_vmap)(struct nv_drm_gem_object *nv_gem, struct dma_buf_map *map); ++ void (*prime_vunmap)(struct nv_drm_gem_object *nv_gem, struct dma_buf_map *map); ++#endif + struct drm_gem_object *(*prime_dup)(struct drm_device *dev, + const struct nv_drm_gem_object *nv_gem_src); + int (*mmap)(struct nv_drm_gem_object *nv_gem, struct vm_area_struct *vma); +@@ -188,9 +196,17 @@ struct drm_gem_object *nv_drm_gem_prime_import(struct drm_device *dev, + + struct sg_table *nv_drm_gem_prime_get_sg_table(struct drm_gem_object *gem); + ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) + void *nv_drm_gem_prime_vmap(struct drm_gem_object *gem); + + void nv_drm_gem_prime_vunmap(struct drm_gem_object *gem, void *address); ++#else ++// Updated vmap/vunmap operations to use struct dma_buf_map instead of raw pointers ++// See torvalds/linux commits ccc22d41bd9acec58cdc7c3b012e1887aba40af4, 6619ccf1bb1d0ebb071f758111efa83918b216fc ++int nv_drm_gem_prime_vmap(struct drm_gem_object *gem, struct dma_buf_map *map); ++ ++void nv_drm_gem_prime_vunmap(struct drm_gem_object *gem, struct dma_buf_map *map); ++#endif + + #if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_RES_OBJ) + nv_dma_resv_t* nv_drm_gem_prime_res_obj(struct drm_gem_object *obj); +diff --git a/kernel-dkms/nvidia/nv-caps.c b/kernel-dkms/nvidia/nv-caps.c +index 90e866f..5cde194 100644 +--- a/kernel-dkms/nvidia/nv-caps.c ++++ b/kernel-dkms/nvidia/nv-caps.c +@@ -37,8 +37,12 @@ MODULE_PARM_DESC(nv_cap_enable_devfs, "Enable (1) or disable (0) nv-caps " \ + + extern int NVreg_ModifyDeviceFiles; + ++#if NV_IS_EXPORT_SYMBOL_PRESENT_close_fd ++#include ++#else + /* sys_close() or __close_fd() */ + #include ++#endif + + #define NV_CAP_DRV_MINOR_COUNT 8192 + +@@ -586,7 +590,9 @@ void NV_API_CALL nv_cap_close_fd(int fd) + * 2018-04-02 2ca2a09d6215 ("fs: add ksys_close() wrapper; remove in-kernel + * calls to sys_close()") + */ +-#if NV_IS_EXPORT_SYMBOL_PRESENT___close_fd ++#if NV_IS_EXPORT_SYMBOL_PRESENT_close_fd ++ close_fd(fd); ++#elif NV_IS_EXPORT_SYMBOL_PRESENT___close_fd + __close_fd(current->files, fd); + #else + sys_close(fd); +diff --git a/kernel-dkms/nvidia/nvidia.Kbuild b/kernel-dkms/nvidia/nvidia.Kbuild +index 90579de..c6f3614 100644 +--- a/kernel-dkms/nvidia/nvidia.Kbuild ++++ b/kernel-dkms/nvidia/nvidia.Kbuild +@@ -172,6 +172,7 @@ NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_tegra_dce_client_ip + NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_dram_clk_to_mc_clk + NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_get_dram_num_channels + NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_tegra_dram_types ++NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_close_fd + + NV_CONFTEST_TYPE_COMPILE_TESTS += acpi_op_remove + NV_CONFTEST_TYPE_COMPILE_TESTS += outer_flush_all