drm/v3d: Add gpu_gem_info node via debugfs
[platform/kernel/linux-rpi.git] / drivers / gpu / drm / v3d / v3d_bo.c
index 8b52cb2..e9c39c4 100644 (file)
@@ -166,6 +166,46 @@ v3d_prime_import_sg_table(struct drm_device *dev,
        return obj;
 }
 
+static void v3d_gem_register_pid(struct drm_file *file)
+{
+       struct v3d_file_priv *v3d_priv = file->driver_priv;
+       struct drm_v3d_file_private *pid_priv;
+
+       if (!v3d_priv)
+               return;
+
+       pid_priv = &v3d_priv->priv;
+
+       if (!pid_priv->pid && !pid_priv->tgid) {
+               pid_priv->pid = task_pid_nr(current);
+               pid_priv->tgid = task_tgid_nr(current);
+       } else {
+               if (pid_priv->pid != task_pid_nr(current))
+                       DRM_DEBUG_KMS("wrong pid: %ld, %ld\n",
+                                       (unsigned long)pid_priv->pid,
+                                       (unsigned long)task_pid_nr(current));
+               if (pid_priv->tgid != task_tgid_nr(current))
+                       DRM_DEBUG_KMS("wrong tgid: %ld, %ld\n",
+                                       (unsigned long)pid_priv->tgid,
+                                       (unsigned long)task_tgid_nr(current));
+       }
+}
+
+int v3d_drm_gem_prime_fd_to_handle(struct drm_device *dev,
+                                  struct drm_file *file_priv, int prime_fd,
+                                  uint32_t *handle)
+{
+       int ret;
+
+       ret = drm_gem_prime_fd_to_handle(dev, file_priv, prime_fd, handle);
+       if (ret < 0)
+               return ret;
+
+       v3d_gem_register_pid(file_priv);
+
+       return ret;
+}
+
 int v3d_create_bo_ioctl(struct drm_device *dev, void *data,
                        struct drm_file *file_priv)
 {
@@ -185,6 +225,9 @@ int v3d_create_bo_ioctl(struct drm_device *dev, void *data,
        args->offset = bo->node.start << PAGE_SHIFT;
 
        ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle);
+       if (!ret)
+               v3d_gem_register_pid(file_priv);
+
        drm_gem_object_put(&bo->base.base);
 
        return ret;