Browse Source

drm/nouveau/core/object: pass client directly to ioctl handlers

nvkm_object::client refers to the client that created the object, which,
is currently always the same as the ioctl caller.

Upcoming patches introduce the concept of subclients, where a parent is
able to access the object trees of its children, making the above no
longer true.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Ben Skeggs 9 years ago
parent
commit
a664869ac4
1 changed files with 28 additions and 19 deletions
  1. 28 19
      drivers/gpu/drm/nouveau/nvkm/core/ioctl.c

+ 28 - 19
drivers/gpu/drm/nouveau/nvkm/core/ioctl.c

@@ -29,7 +29,8 @@
 #include <nvif/ioctl.h>
 #include <nvif/ioctl.h>
 
 
 static int
 static int
-nvkm_ioctl_nop(struct nvkm_object *object, void *data, u32 size)
+nvkm_ioctl_nop(struct nvkm_client *client,
+	       struct nvkm_object *object, void *data, u32 size)
 {
 {
 	union {
 	union {
 		struct nvif_ioctl_nop_v0 v0;
 		struct nvif_ioctl_nop_v0 v0;
@@ -46,7 +47,8 @@ nvkm_ioctl_nop(struct nvkm_object *object, void *data, u32 size)
 }
 }
 
 
 static int
 static int
-nvkm_ioctl_sclass(struct nvkm_object *object, void *data, u32 size)
+nvkm_ioctl_sclass(struct nvkm_client *client,
+		  struct nvkm_object *object, void *data, u32 size)
 {
 {
 	union {
 	union {
 		struct nvif_ioctl_sclass_v0 v0;
 		struct nvif_ioctl_sclass_v0 v0;
@@ -78,12 +80,12 @@ nvkm_ioctl_sclass(struct nvkm_object *object, void *data, u32 size)
 }
 }
 
 
 static int
 static int
-nvkm_ioctl_new(struct nvkm_object *parent, void *data, u32 size)
+nvkm_ioctl_new(struct nvkm_client *client,
+	       struct nvkm_object *parent, void *data, u32 size)
 {
 {
 	union {
 	union {
 		struct nvif_ioctl_new_v0 v0;
 		struct nvif_ioctl_new_v0 v0;
 	} *args = data;
 	} *args = data;
-	struct nvkm_client *client = parent->client;
 	struct nvkm_object *object = NULL;
 	struct nvkm_object *object = NULL;
 	struct nvkm_oclass oclass;
 	struct nvkm_oclass oclass;
 	int ret = -ENOSYS, i = 0;
 	int ret = -ENOSYS, i = 0;
@@ -142,7 +144,8 @@ nvkm_ioctl_new(struct nvkm_object *parent, void *data, u32 size)
 }
 }
 
 
 static int
 static int
-nvkm_ioctl_del(struct nvkm_object *object, void *data, u32 size)
+nvkm_ioctl_del(struct nvkm_client *client,
+	       struct nvkm_object *object, void *data, u32 size)
 {
 {
 	union {
 	union {
 		struct nvif_ioctl_del none;
 		struct nvif_ioctl_del none;
@@ -160,7 +163,8 @@ nvkm_ioctl_del(struct nvkm_object *object, void *data, u32 size)
 }
 }
 
 
 static int
 static int
-nvkm_ioctl_mthd(struct nvkm_object *object, void *data, u32 size)
+nvkm_ioctl_mthd(struct nvkm_client *client,
+		struct nvkm_object *object, void *data, u32 size)
 {
 {
 	union {
 	union {
 		struct nvif_ioctl_mthd_v0 v0;
 		struct nvif_ioctl_mthd_v0 v0;
@@ -179,7 +183,8 @@ nvkm_ioctl_mthd(struct nvkm_object *object, void *data, u32 size)
 
 
 
 
 static int
 static int
-nvkm_ioctl_rd(struct nvkm_object *object, void *data, u32 size)
+nvkm_ioctl_rd(struct nvkm_client *client,
+	      struct nvkm_object *object, void *data, u32 size)
 {
 {
 	union {
 	union {
 		struct nvif_ioctl_rd_v0 v0;
 		struct nvif_ioctl_rd_v0 v0;
@@ -218,7 +223,8 @@ nvkm_ioctl_rd(struct nvkm_object *object, void *data, u32 size)
 }
 }
 
 
 static int
 static int
-nvkm_ioctl_wr(struct nvkm_object *object, void *data, u32 size)
+nvkm_ioctl_wr(struct nvkm_client *client,
+	      struct nvkm_object *object, void *data, u32 size)
 {
 {
 	union {
 	union {
 		struct nvif_ioctl_wr_v0 v0;
 		struct nvif_ioctl_wr_v0 v0;
@@ -246,7 +252,8 @@ nvkm_ioctl_wr(struct nvkm_object *object, void *data, u32 size)
 }
 }
 
 
 static int
 static int
-nvkm_ioctl_map(struct nvkm_object *object, void *data, u32 size)
+nvkm_ioctl_map(struct nvkm_client *client,
+	       struct nvkm_object *object, void *data, u32 size)
 {
 {
 	union {
 	union {
 		struct nvif_ioctl_map_v0 v0;
 		struct nvif_ioctl_map_v0 v0;
@@ -264,7 +271,8 @@ nvkm_ioctl_map(struct nvkm_object *object, void *data, u32 size)
 }
 }
 
 
 static int
 static int
-nvkm_ioctl_unmap(struct nvkm_object *object, void *data, u32 size)
+nvkm_ioctl_unmap(struct nvkm_client *client,
+		 struct nvkm_object *object, void *data, u32 size)
 {
 {
 	union {
 	union {
 		struct nvif_ioctl_unmap none;
 		struct nvif_ioctl_unmap none;
@@ -280,7 +288,8 @@ nvkm_ioctl_unmap(struct nvkm_object *object, void *data, u32 size)
 }
 }
 
 
 static int
 static int
-nvkm_ioctl_ntfy_new(struct nvkm_object *object, void *data, u32 size)
+nvkm_ioctl_ntfy_new(struct nvkm_client *client,
+		    struct nvkm_object *object, void *data, u32 size)
 {
 {
 	union {
 	union {
 		struct nvif_ioctl_ntfy_new_v0 v0;
 		struct nvif_ioctl_ntfy_new_v0 v0;
@@ -306,9 +315,9 @@ nvkm_ioctl_ntfy_new(struct nvkm_object *object, void *data, u32 size)
 }
 }
 
 
 static int
 static int
-nvkm_ioctl_ntfy_del(struct nvkm_object *object, void *data, u32 size)
+nvkm_ioctl_ntfy_del(struct nvkm_client *client,
+		    struct nvkm_object *object, void *data, u32 size)
 {
 {
-	struct nvkm_client *client = object->client;
 	union {
 	union {
 		struct nvif_ioctl_ntfy_del_v0 v0;
 		struct nvif_ioctl_ntfy_del_v0 v0;
 	} *args = data;
 	} *args = data;
@@ -325,9 +334,9 @@ nvkm_ioctl_ntfy_del(struct nvkm_object *object, void *data, u32 size)
 }
 }
 
 
 static int
 static int
-nvkm_ioctl_ntfy_get(struct nvkm_object *object, void *data, u32 size)
+nvkm_ioctl_ntfy_get(struct nvkm_client *client,
+		    struct nvkm_object *object, void *data, u32 size)
 {
 {
-	struct nvkm_client *client = object->client;
 	union {
 	union {
 		struct nvif_ioctl_ntfy_get_v0 v0;
 		struct nvif_ioctl_ntfy_get_v0 v0;
 	} *args = data;
 	} *args = data;
@@ -344,9 +353,9 @@ nvkm_ioctl_ntfy_get(struct nvkm_object *object, void *data, u32 size)
 }
 }
 
 
 static int
 static int
-nvkm_ioctl_ntfy_put(struct nvkm_object *object, void *data, u32 size)
+nvkm_ioctl_ntfy_put(struct nvkm_client *client,
+		    struct nvkm_object *object, void *data, u32 size)
 {
 {
-	struct nvkm_client *client = object->client;
 	union {
 	union {
 		struct nvif_ioctl_ntfy_put_v0 v0;
 		struct nvif_ioctl_ntfy_put_v0 v0;
 	} *args = data;
 	} *args = data;
@@ -364,7 +373,7 @@ nvkm_ioctl_ntfy_put(struct nvkm_object *object, void *data, u32 size)
 
 
 static struct {
 static struct {
 	int version;
 	int version;
-	int (*func)(struct nvkm_object *, void *, u32);
+	int (*func)(struct nvkm_client *, struct nvkm_object *, void *, u32);
 }
 }
 nvkm_ioctl_v0[] = {
 nvkm_ioctl_v0[] = {
 	{ 0x00, nvkm_ioctl_nop },
 	{ 0x00, nvkm_ioctl_nop },
@@ -404,7 +413,7 @@ nvkm_ioctl_path(struct nvkm_client *client, u64 handle, u32 type,
 
 
 	if (ret = -EINVAL, type < ARRAY_SIZE(nvkm_ioctl_v0)) {
 	if (ret = -EINVAL, type < ARRAY_SIZE(nvkm_ioctl_v0)) {
 		if (nvkm_ioctl_v0[type].version == 0)
 		if (nvkm_ioctl_v0[type].version == 0)
-			ret = nvkm_ioctl_v0[type].func(object, data, size);
+			ret = nvkm_ioctl_v0[type].func(client, object, data, size);
 	}
 	}
 
 
 	return ret;
 	return ret;