return 0;
}
+static void vc5_gem_register_pid(struct drm_file *file_priv)
+{
+ struct vc4_file *vc4file = file_priv->driver_priv;
+ struct drm_vc5_file_private *driver_priv = &vc4file->priv;
+
+ if (!driver_priv->pid && !driver_priv->tgid) {
+ driver_priv->pid = task_pid_nr(current);
+ driver_priv->tgid = task_tgid_nr(current);
+ } else {
+ if (driver_priv->pid != task_pid_nr(current))
+ DRM_DEBUG_KMS("wrong pid: %ld, %ld\n",
+ (unsigned long)driver_priv->pid,
+ (unsigned long)task_pid_nr(current));
+ if (driver_priv->tgid != task_tgid_nr(current))
+ DRM_DEBUG_KMS("wrong tgid: %ld, %ld\n",
+ (unsigned long)driver_priv->tgid,
+ (unsigned long)task_tgid_nr(current));
+ }
+}
+
+int vc5_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;
+
+ vc5_gem_register_pid(file_priv);
+
+ return ret;
+}
+
static int vc4_dumb_create(struct drm_file *file_priv,
struct drm_device *dev,
struct drm_mode_create_dumb *args)
if (ret)
return ret;
- return drm_gem_cma_dumb_create_internal(file_priv, dev, args);
+ ret = drm_gem_cma_dumb_create_internal(file_priv, dev, args);
+ if (!ret)
+ vc5_gem_register_pid(file_priv);
+
+ return ret;
}
static int vc4_get_param_ioctl(struct drm_device *dev, void *data,
kfree(vc4file);
}
+static int vc5_open(struct drm_device *dev, struct drm_file *file)
+{
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
+ struct vc4_file *vc4file;
+
+ vc4file = kzalloc(sizeof(*vc4file), GFP_KERNEL);
+ if (!vc4file)
+ return -ENOMEM;
+ vc4file->dev = vc4;
+
+ file->driver_priv = vc4file;
+ return 0;
+}
+
+static void vc5_close(struct drm_device *dev, struct drm_file *file)
+{
+ struct vc4_file *vc4file = file->driver_priv;
+
+ kfree(vc4file);
+}
+
DEFINE_DRM_GEM_FOPS(vc4_drm_fops);
static const struct drm_ioctl_desc vc4_drm_ioctls[] = {
DRIVER_ATOMIC |
DRIVER_GEM),
+ .open = vc5_open,
+ .postclose = vc5_close,
#if defined(CONFIG_DEBUG_FS)
.debugfs_init = vc4_debugfs_init,
#endif
DRM_GEM_CMA_DRIVER_OPS_WITH_DUMB_CREATE(vc4_dumb_create),
+ .prime_fd_to_handle = vc5_drm_gem_prime_fd_to_handle,
.fops = &vc4_drm_fops,
.name = DRIVER_NAME,
"raspberrypi,rpi-firmware-kms-2711"));
}
+int vc5_bo_debugfs_init(struct drm_minor *minor)
+{
+ struct drm_device *drm = minor->dev;
+ struct vc4_dev *vc4 = to_vc4_dev(drm);
+ int ret;
+
+ if (!vc4->is_vc5)
+ return -ENODEV;
+
+ ret = vc4_debugfs_add_file(minor, "gem_info",
+ vc5_debugfs_gem_info, NULL);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
static int vc4_drm_bind(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
if (ret)
return ret;
- return platform_driver_register(&vc4_platform_driver);
+ ret = platform_driver_register(&vc4_platform_driver);
+ if (ret)
+ platform_unregister_drivers(component_drivers,
+ ARRAY_SIZE(component_drivers));
+
+ return ret;
}
static void __exit vc4_drm_unregister(void)