Yes, this is because of the “GPL condom” that prevents loading the UVM module…
BOTH Linux kernel developers and NVIDIA are to blame here.
The first because they behave like OpenSource nazies (and are in the process violating laws such as UE law which does NOT allow API copyrighting): imagine what would happen to OpenSource if Micro$oft or Apple would suddenly behave in the exact same way and forbid to use their OS’ APIs unless the software using them would be using the same license… OpenSource software would simply not run any more on Windows PCs and Macs and would be doomed !
The second, because their OpenSource support and production is extremely poor (to say the least) without even a valid reason (why would the competition have better contributions if there was any valid reason to hide their software behind closed sources doors), and because instead of discussing the issue like civilized persons with Linux kernel devels, they just try and bypass the existing restrictions rather than to consider taking the Open Source route (at least for part of their code: no one would blame them for keeping some code closed as a binary blob: almost every other hardware manufacturer, including AMD, are doing it).
As an end user, it really pisses me off big time.
So here is my advice, until those “fine people” pertaining to the Linux kernel and NVIDIA devel teams finally find a common, sane ground (i.e. behave as adults instead of like children in a kindergarten), just do like what I did to circumvent this issue:
1.- turn the license in the NVIDIA kernel sources from “NVIDIA” TO “GPL”
2.- disable (just couple #if 0 … #endif to insert in kernel/module.c) the GPL condom code (compare v5.8 and v5.9 kernel sources to find out where to insert those directives).
Any of the above two solutions will allow you to recover the full functionality of the NVIDIA drivers on your system, and as long as you do not distribute the resulting binaries, no one can blame (or sue you) you for it !
Based on what @dinosaur said, I created my own kernel patch to make nvidia drivers work again. The patch reverts the commit which introduced the TAINT stuff:
Patch works, but with latest linux git pull (commit 071a0578b0ce0b0e543d1e38ee6926b9cc21c198), compile fails …
/v6/src/nvidia-455.28/nvidia/nv-dma.c:631:37: error: implicit declaration of function ‘get_dma_ops’; did you mean ‘get_mm_rss’? [-Werror=implicit-function-declaration]
const struct dma_map_ops *ops = get_dma_ops(dma_dev->dev);
^~~~~~~~~~~
get_mm_rss
/v6/src/nvidia-455.28/nvidia/nv-dma.c:631:37: warning: initialization of ‘const struct dma_map_ops *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
/v6/src/nvidia-455.28/nvidia/nv-dma.c:646:16: error: dereferencing pointer to incomplete type ‘const struct dma_map_ops’
return (ops->map_resource != NULL);
^~
/v6/src/nvidia-455.28/nvidia/nv-dma.c:650:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
/* DMA-map a peer PCI device’s BAR for peer access. */
But the following “dev” … I don’t know to fix that …
/v6/src/nvidia-455.28/nvidia-drm/nvidia-drm-gem-user-memory.c:63:12: error: too few arguments to function ‘drm_prime_pages_to_sg’
return drm_prime_pages_to_sg(nv_user_memory->pages,
^~~~~~~~~~~~~~~~~~~~~
In file included from /v6/src/nvidia-455.28/nvidia-drm/nvidia-drm-gem-user-memory.c:28:
./include/drm/drm_prime.h:91:18: note: declared here
struct sg_table *drm_prime_pages_to_sg(struct drm_device *dev,
^~~~~~~~~~~~~~~~~~~~~
Looks like need to pass addition “dev” to the function drm_prime_pages_to_sg() …