summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2015-11-24 15:34:51 +1000
committerBen Skeggs <bskeggs@redhat.com>2015-11-25 15:29:46 +1000
commit358c45c68e739e0e51b27169720d1252d9068560 (patch)
tree64d03b958b26e4d49217636b2620f1d9fcc34614
parent47f4185bea5751b8440714599f72d2691c727780 (diff)
nvif: allow userspace access to its own client object
Regression from "abi16: implement limited interoperability with usif/nvif". Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drm/nouveau/nouveau_drm.h4
-rw-r--r--drm/nouveau/nouveau_usif.c5
2 files changed, 7 insertions, 2 deletions
diff --git a/drm/nouveau/nouveau_drm.h b/drm/nouveau/nouveau_drm.h
index 3050042e..a02813e9 100644
--- a/drm/nouveau/nouveau_drm.h
+++ b/drm/nouveau/nouveau_drm.h
@@ -39,6 +39,7 @@
#include <nvif/client.h>
#include <nvif/device.h>
+#include <nvif/ioctl.h>
#include <drmP.h>
@@ -65,9 +66,10 @@ struct nouveau_drm_tile {
};
enum nouveau_drm_object_route {
- NVDRM_OBJECT_NVIF = 0,
+ NVDRM_OBJECT_NVIF = NVIF_IOCTL_V0_OWNER_NVIF,
NVDRM_OBJECT_USIF,
NVDRM_OBJECT_ABI16,
+ NVDRM_OBJECT_ANY = NVIF_IOCTL_V0_OWNER_ANY,
};
enum nouveau_drm_notify_route {
diff --git a/drm/nouveau/nouveau_usif.c b/drm/nouveau/nouveau_usif.c
index 89dc4ce6..6ae1b349 100644
--- a/drm/nouveau/nouveau_usif.c
+++ b/drm/nouveau/nouveau_usif.c
@@ -313,7 +313,10 @@ usif_ioctl(struct drm_file *filp, void __user *user, u32 argc)
if (nvif_unpack(argv->v0, 0, 0, true)) {
/* block access to objects not created via this interface */
owner = argv->v0.owner;
- argv->v0.owner = NVDRM_OBJECT_USIF;
+ if (argv->v0.object == 0ULL)
+ argv->v0.owner = NVDRM_OBJECT_ANY; /* except client */
+ else
+ argv->v0.owner = NVDRM_OBJECT_USIF;
} else
goto done;