From: Tomasz Jankowski <tomasz1.jankowski@xxxxxxxxx> Signed-off-by: Tomasz Jankowski <tomasz1.jankowski@xxxxxxxxx> Tested-by: Mikolaj Grzybowski <mikolajx.grzybowski@xxxxxxxxx> Co-developed-by: Jianxun Zhang <jianxun.zhang@xxxxxxxxxxxxxxx> Signed-off-by: Jianxun Zhang <jianxun.zhang@xxxxxxxxxxxxxxx> Co-developed-by: Maciej Kwapulinski <maciej.kwapulinski@xxxxxxxxxxxxxxx> Signed-off-by: Maciej Kwapulinski <maciej.kwapulinski@xxxxxxxxxxxxxxx> --- drivers/gpu/drm/gna/gna_device.c | 46 ++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/drivers/gpu/drm/gna/gna_device.c b/drivers/gpu/drm/gna/gna_device.c index aee409e3b4ea..4ce08bf313c3 100644 --- a/drivers/gpu/drm/gna/gna_device.c +++ b/drivers/gpu/drm/gna/gna_device.c @@ -58,6 +58,49 @@ const struct dev_pm_ops __maybe_unused gna_pm = { SET_RUNTIME_PM_OPS(gna_runtime_suspend, gna_runtime_resume, NULL) }; +static int gna_open(struct drm_device *dev, struct drm_file *file) +{ + struct gna_device *gna_priv; + + gna_priv = to_gna_device(dev); + + file->driver_priv = gna_priv; + + return 0; +} + +static void gna_delete_file_requests(struct drm_file *file, struct gna_device *gna_priv) +{ + struct gna_request *req, *temp_req; + struct list_head *reqs_list; + + mutex_lock(&gna_priv->reqlist_lock); + + reqs_list = &gna_priv->request_list; + if (!list_empty(reqs_list)) { + list_for_each_entry_safe(req, temp_req, reqs_list, node) { + if (req->drm_f == file) { + bool is_pending; + + list_del_init(&req->node); + is_pending = cancel_work_sync(&req->work); + if (is_pending) + atomic_dec(&gna_priv->enqueued_requests); + kref_put(&req->refcount, gna_request_release); + break; + } + } + } + + mutex_unlock(&gna_priv->reqlist_lock); +} + +static void gna_close(struct drm_device *dev, struct drm_file *file) +{ + struct gna_device *gna_priv = (struct gna_device *)file->driver_priv; + + gna_delete_file_requests(file, gna_priv); +} static void gna_drm_dev_fini(struct drm_device *dev, void *ptr) { @@ -136,6 +179,9 @@ static struct drm_gem_object *gna_create_gem_object(struct drm_device *dev, static const struct drm_driver gna_drm_driver = { .driver_features = DRIVER_GEM | DRIVER_RENDER, + .open = gna_open, + .postclose = gna_close, + .gem_create_object = gna_create_gem_object, .ioctls = gna_drm_ioctls, -- 2.25.1