Hello,
On Sat, 30 Jul 2016, meino.cra...@gmx.de wrote:
>trying the new kernel linux-4.7 (vanilla, downloaded from
>ftp.kernel.org) with nvidia drivers
>(Installed versions: 367.35-r1^md(03:00:46 07/30/16)(X driver kms
>multilib uvm -acpi -compat -gtk3 -pax_kernel -static-libs -tools
>-wayland KERNEL="linux -FreeBSD")).
>The kernel compiled fine, the nvidia-drivers does not.
>
>Anuone else with the same problem (read: This has to be
>fixed by nvidia/Linus) or am I the only one (so it is
>my problem...which does not neccessarily imply that I
>know how to fix that ... ;) ???
I've got it working with the attached patch in
/etc/portage/patches/x11-drivers/nvidia-drivers-367.35/
I've no idea though, if I hit that codepath yet. Should work though,
as the patch makes the module use the kernel function and what I read
about radix_tree_gang_lookup() it should be ok this way.
But do not expect anything to work ;)
I'm courious what the official patch will be ;) The first part
(patching kernel/nvidia-drm/nvidia-drm-{fb,gem}.c) I've found online.
HTH,
-dnh
--
Please do not think so much about licenses, it will just make your head
explode if not carefully studied over the years ;)
-- Marcus Meissner
diff -purN a/kernel/nvidia-drm/nvidia-drm-fb.c b/kernel/nvidia-drm/nvidia-drm-fb.c
--- a/kernel/nvidia-drm/nvidia-drm-fb.c 2016-07-12 06:53:45.000000000 +0200
+++ b/kernel/nvidia-drm/nvidia-drm-fb.c 2016-07-28 09:43:11.494515158 +0200
@@ -32,6 +32,8 @@
#include <drm/drm_crtc_helper.h>
+#include <linux/version.h>
+
static void nvidia_framebuffer_destroy(struct drm_framebuffer *fb)
{
struct nvidia_drm_device *nv_dev = fb->dev->dev_private;
@@ -114,7 +116,11 @@ static struct drm_framebuffer *internal_
* We don't support any planar format, pick up first buffer only.
*/
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
+ gem = drm_gem_object_lookup(file, cmd->handles[0]);
+#else
gem = drm_gem_object_lookup(dev, file, cmd->handles[0]);
+#endif
if (gem == NULL)
{
diff -purN a/kernel/nvidia-drm/nvidia-drm-gem.c b/kernel/nvidia-drm/nvidia-drm-gem.c
--- a/kernel/nvidia-drm/nvidia-drm-gem.c 2016-07-12 06:53:45.000000000 +0200
+++ b/kernel/nvidia-drm/nvidia-drm-gem.c 2016-07-28 09:27:24.610637573 +0200
@@ -28,6 +28,8 @@
#include "nvidia-drm-ioctl.h"
#include "nvidia-drm-gem.h"
+#include <linux/version.h>
+
static struct nvidia_drm_gem_object *nvidia_drm_gem_new
(
struct drm_file *file_priv,
@@ -408,7 +410,11 @@ int nvidia_drm_dumb_map_offset
mutex_lock(&dev->struct_mutex);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
+ gem = drm_gem_object_lookup(file, handle);
+#else
gem = drm_gem_object_lookup(dev, file, handle);
+#endif
if (gem == NULL)
{
diff -purN a/kernel/nvidia-uvm/uvm_linux.h b/kernel/nvidia-uvm/uvm_linux.h
--- a/kernel/nvidia-uvm/uvm_linux.h 2016-07-12 06:52:17.000000000 +0200
+++ b/kernel/nvidia-uvm/uvm_linux.h 2016-07-28 09:29:21.096322608 +0200
@@ -554,11 +554,13 @@ static void uvm_init_radix_tree_preloada
INIT_RADIX_TREE(tree, GFP_NOWAIT);
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
static bool radix_tree_empty(struct radix_tree_root *tree)
{
void *dummy;
return radix_tree_gang_lookup(tree, &dummy, 0, 1) == 0;
}
+#endif
#if !defined(NV_USLEEP_RANGE_PRESENT)