drm/msm: rework GEM_INFO ioctl
authorRob Clark <robdclark@gmail.com>
Thu, 29 Nov 2018 14:54:42 +0000 (09:54 -0500)
committerRob Clark <robdclark@gmail.com>
Tue, 11 Dec 2018 18:07:04 +0000 (13:07 -0500)
Prep work to add a way to get/set the GEM objects debug name.

Signed-off-by: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/msm/msm_drv.c
include/uapi/drm/msm_drm.h

index a73187274b624c50ed13685139ab1aecbec6de02..fe86c675d5b78d08bec589aa276ea3fe14a51603 100644 (file)
@@ -882,21 +882,31 @@ static int msm_ioctl_gem_info(struct drm_device *dev, void *data,
        struct drm_gem_object *obj;
        int ret = 0;
 
-       if (args->flags & ~MSM_INFO_FLAGS)
+       if (args->pad)
                return -EINVAL;
 
+       switch (args->info) {
+       case MSM_INFO_GET_OFFSET:
+       case MSM_INFO_GET_IOVA:
+               /* value returned as immediate, not pointer, so len==0: */
+               if (args->len)
+                       return -EINVAL;
+               break;
+       default:
+               return -EINVAL;
+       }
+
        obj = drm_gem_object_lookup(file, args->handle);
        if (!obj)
                return -ENOENT;
 
-       if (args->flags & MSM_INFO_IOVA) {
-               uint64_t iova;
-
-               ret = msm_ioctl_gem_info_iova(dev, obj, &iova);
-               if (!ret)
-                       args->offset = iova;
-       } else {
-               args->offset = msm_gem_mmap_offset(obj);
+       switch (args->info) {
+       case MSM_INFO_GET_OFFSET:
+               args->value = msm_gem_mmap_offset(obj);
+               break;
+       case MSM_INFO_GET_IOVA:
+               ret = msm_ioctl_gem_info_iova(dev, obj, &args->value);
+               break;
        }
 
        drm_gem_object_put_unlocked(obj);
index 3c3af92c4b3ed6c9d3100a85aeff340203983a0c..7b372c1bcc7d27e1c784f4dd1113849669586d9f 100644 (file)
@@ -105,14 +105,22 @@ struct drm_msm_gem_new {
        __u32 handle;         /* out */
 };
 
-#define MSM_INFO_IOVA  0x01
-
-#define MSM_INFO_FLAGS (MSM_INFO_IOVA)
+/* Get or set GEM buffer info.  The requested value can be passed
+ * directly in 'value', or for data larger than 64b 'value' is a
+ * pointer to userspace buffer, with 'len' specifying the number of
+ * bytes copied into that buffer.  For info returned by pointer,
+ * calling the GEM_INFO ioctl with null 'value' will return the
+ * required buffer size in 'len'
+ */
+#define MSM_INFO_GET_OFFSET    0x00   /* get mmap() offset, returned by value */
+#define MSM_INFO_GET_IOVA      0x01   /* get iova, returned by value */
 
 struct drm_msm_gem_info {
        __u32 handle;         /* in */
-       __u32 flags;          /* in - combination of MSM_INFO_* flags */
-       __u64 offset;         /* out, mmap() offset or iova */
+       __u32 info;           /* in - one of MSM_INFO_* */
+       __u64 value;          /* in or out */
+       __u32 len;            /* in or out */
+       __u32 pad;
 };
 
 #define MSM_PREP_READ        0x01