Commit 0a523998 authored by Boris Brezillon's avatar Boris Brezillon Committed by Rob Herring

drm/panfrost: Open/close the perfcnt BO

Commit a5efb4c9 ("drm/panfrost: Restructure the GEM object creation")
moved the drm_mm_insert_node_generic() call to the gem->open() hook,
but forgot to update perfcnt accordingly.

Patch the perfcnt logic to call panfrost_gem_open/close() where
appropriate.

Fixes: a5efb4c9 ("drm/panfrost: Restructure the GEM object creation")
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarBoris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: default avatarSteven Price <steven.price@arm.com>
Acked-by: default avatarAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: default avatarRob Herring <robh@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20191129135908.2439529-6-boris.brezillon@collabora.com
parent aed44cbe
...@@ -445,7 +445,7 @@ panfrost_postclose(struct drm_device *dev, struct drm_file *file) ...@@ -445,7 +445,7 @@ panfrost_postclose(struct drm_device *dev, struct drm_file *file)
{ {
struct panfrost_file_priv *panfrost_priv = file->driver_priv; struct panfrost_file_priv *panfrost_priv = file->driver_priv;
panfrost_perfcnt_close(panfrost_priv); panfrost_perfcnt_close(file);
panfrost_job_close(panfrost_priv); panfrost_job_close(panfrost_priv);
panfrost_mmu_pgtable_free(panfrost_priv); panfrost_mmu_pgtable_free(panfrost_priv);
......
...@@ -46,7 +46,7 @@ static void panfrost_gem_free_object(struct drm_gem_object *obj) ...@@ -46,7 +46,7 @@ static void panfrost_gem_free_object(struct drm_gem_object *obj)
drm_gem_shmem_free_object(obj); drm_gem_shmem_free_object(obj);
} }
static int panfrost_gem_open(struct drm_gem_object *obj, struct drm_file *file_priv) int panfrost_gem_open(struct drm_gem_object *obj, struct drm_file *file_priv)
{ {
int ret; int ret;
size_t size = obj->size; size_t size = obj->size;
...@@ -85,7 +85,7 @@ static int panfrost_gem_open(struct drm_gem_object *obj, struct drm_file *file_p ...@@ -85,7 +85,7 @@ static int panfrost_gem_open(struct drm_gem_object *obj, struct drm_file *file_p
return ret; return ret;
} }
static void panfrost_gem_close(struct drm_gem_object *obj, struct drm_file *file_priv) void panfrost_gem_close(struct drm_gem_object *obj, struct drm_file *file_priv)
{ {
struct panfrost_gem_object *bo = to_panfrost_bo(obj); struct panfrost_gem_object *bo = to_panfrost_bo(obj);
struct panfrost_file_priv *priv = file_priv->driver_priv; struct panfrost_file_priv *priv = file_priv->driver_priv;
......
...@@ -45,6 +45,10 @@ panfrost_gem_create_with_handle(struct drm_file *file_priv, ...@@ -45,6 +45,10 @@ panfrost_gem_create_with_handle(struct drm_file *file_priv,
u32 flags, u32 flags,
uint32_t *handle); uint32_t *handle);
int panfrost_gem_open(struct drm_gem_object *obj, struct drm_file *file_priv);
void panfrost_gem_close(struct drm_gem_object *obj,
struct drm_file *file_priv);
void panfrost_gem_shrinker_init(struct drm_device *dev); void panfrost_gem_shrinker_init(struct drm_device *dev);
void panfrost_gem_shrinker_cleanup(struct drm_device *dev); void panfrost_gem_shrinker_cleanup(struct drm_device *dev);
......
...@@ -66,9 +66,10 @@ static int panfrost_perfcnt_dump_locked(struct panfrost_device *pfdev) ...@@ -66,9 +66,10 @@ static int panfrost_perfcnt_dump_locked(struct panfrost_device *pfdev)
} }
static int panfrost_perfcnt_enable_locked(struct panfrost_device *pfdev, static int panfrost_perfcnt_enable_locked(struct panfrost_device *pfdev,
struct panfrost_file_priv *user, struct drm_file *file_priv,
unsigned int counterset) unsigned int counterset)
{ {
struct panfrost_file_priv *user = file_priv->driver_priv;
struct panfrost_perfcnt *perfcnt = pfdev->perfcnt; struct panfrost_perfcnt *perfcnt = pfdev->perfcnt;
struct drm_gem_shmem_object *bo; struct drm_gem_shmem_object *bo;
u32 cfg; u32 cfg;
...@@ -90,14 +91,14 @@ static int panfrost_perfcnt_enable_locked(struct panfrost_device *pfdev, ...@@ -90,14 +91,14 @@ static int panfrost_perfcnt_enable_locked(struct panfrost_device *pfdev,
perfcnt->bo = to_panfrost_bo(&bo->base); perfcnt->bo = to_panfrost_bo(&bo->base);
/* Map the perfcnt buf in the address space attached to file_priv. */ /* Map the perfcnt buf in the address space attached to file_priv. */
ret = panfrost_mmu_map(perfcnt->bo); ret = panfrost_gem_open(&perfcnt->bo->base.base, file_priv);
if (ret) if (ret)
goto err_put_bo; goto err_put_bo;
perfcnt->buf = drm_gem_shmem_vmap(&bo->base); perfcnt->buf = drm_gem_shmem_vmap(&bo->base);
if (IS_ERR(perfcnt->buf)) { if (IS_ERR(perfcnt->buf)) {
ret = PTR_ERR(perfcnt->buf); ret = PTR_ERR(perfcnt->buf);
goto err_put_bo; goto err_close_bo;
} }
/* /*
...@@ -156,14 +157,17 @@ static int panfrost_perfcnt_enable_locked(struct panfrost_device *pfdev, ...@@ -156,14 +157,17 @@ static int panfrost_perfcnt_enable_locked(struct panfrost_device *pfdev,
err_vunmap: err_vunmap:
drm_gem_shmem_vunmap(&perfcnt->bo->base.base, perfcnt->buf); drm_gem_shmem_vunmap(&perfcnt->bo->base.base, perfcnt->buf);
err_close_bo:
panfrost_gem_close(&perfcnt->bo->base.base, file_priv);
err_put_bo: err_put_bo:
drm_gem_object_put_unlocked(&bo->base); drm_gem_object_put_unlocked(&bo->base);
return ret; return ret;
} }
static int panfrost_perfcnt_disable_locked(struct panfrost_device *pfdev, static int panfrost_perfcnt_disable_locked(struct panfrost_device *pfdev,
struct panfrost_file_priv *user) struct drm_file *file_priv)
{ {
struct panfrost_file_priv *user = file_priv->driver_priv;
struct panfrost_perfcnt *perfcnt = pfdev->perfcnt; struct panfrost_perfcnt *perfcnt = pfdev->perfcnt;
if (user != perfcnt->user) if (user != perfcnt->user)
...@@ -179,6 +183,7 @@ static int panfrost_perfcnt_disable_locked(struct panfrost_device *pfdev, ...@@ -179,6 +183,7 @@ static int panfrost_perfcnt_disable_locked(struct panfrost_device *pfdev,
perfcnt->user = NULL; perfcnt->user = NULL;
drm_gem_shmem_vunmap(&perfcnt->bo->base.base, perfcnt->buf); drm_gem_shmem_vunmap(&perfcnt->bo->base.base, perfcnt->buf);
perfcnt->buf = NULL; perfcnt->buf = NULL;
panfrost_gem_close(&perfcnt->bo->base.base, file_priv);
drm_gem_object_put_unlocked(&perfcnt->bo->base.base); drm_gem_object_put_unlocked(&perfcnt->bo->base.base);
perfcnt->bo = NULL; perfcnt->bo = NULL;
pm_runtime_mark_last_busy(pfdev->dev); pm_runtime_mark_last_busy(pfdev->dev);
...@@ -190,7 +195,6 @@ static int panfrost_perfcnt_disable_locked(struct panfrost_device *pfdev, ...@@ -190,7 +195,6 @@ static int panfrost_perfcnt_disable_locked(struct panfrost_device *pfdev,
int panfrost_ioctl_perfcnt_enable(struct drm_device *dev, void *data, int panfrost_ioctl_perfcnt_enable(struct drm_device *dev, void *data,
struct drm_file *file_priv) struct drm_file *file_priv)
{ {
struct panfrost_file_priv *pfile = file_priv->driver_priv;
struct panfrost_device *pfdev = dev->dev_private; struct panfrost_device *pfdev = dev->dev_private;
struct panfrost_perfcnt *perfcnt = pfdev->perfcnt; struct panfrost_perfcnt *perfcnt = pfdev->perfcnt;
struct drm_panfrost_perfcnt_enable *req = data; struct drm_panfrost_perfcnt_enable *req = data;
...@@ -206,10 +210,10 @@ int panfrost_ioctl_perfcnt_enable(struct drm_device *dev, void *data, ...@@ -206,10 +210,10 @@ int panfrost_ioctl_perfcnt_enable(struct drm_device *dev, void *data,
mutex_lock(&perfcnt->lock); mutex_lock(&perfcnt->lock);
if (req->enable) if (req->enable)
ret = panfrost_perfcnt_enable_locked(pfdev, pfile, ret = panfrost_perfcnt_enable_locked(pfdev, file_priv,
req->counterset); req->counterset);
else else
ret = panfrost_perfcnt_disable_locked(pfdev, pfile); ret = panfrost_perfcnt_disable_locked(pfdev, file_priv);
mutex_unlock(&perfcnt->lock); mutex_unlock(&perfcnt->lock);
return ret; return ret;
...@@ -247,15 +251,16 @@ int panfrost_ioctl_perfcnt_dump(struct drm_device *dev, void *data, ...@@ -247,15 +251,16 @@ int panfrost_ioctl_perfcnt_dump(struct drm_device *dev, void *data,
return ret; return ret;
} }
void panfrost_perfcnt_close(struct panfrost_file_priv *pfile) void panfrost_perfcnt_close(struct drm_file *file_priv)
{ {
struct panfrost_file_priv *pfile = file_priv->driver_priv;
struct panfrost_device *pfdev = pfile->pfdev; struct panfrost_device *pfdev = pfile->pfdev;
struct panfrost_perfcnt *perfcnt = pfdev->perfcnt; struct panfrost_perfcnt *perfcnt = pfdev->perfcnt;
pm_runtime_get_sync(pfdev->dev); pm_runtime_get_sync(pfdev->dev);
mutex_lock(&perfcnt->lock); mutex_lock(&perfcnt->lock);
if (perfcnt->user == pfile) if (perfcnt->user == pfile)
panfrost_perfcnt_disable_locked(pfdev, pfile); panfrost_perfcnt_disable_locked(pfdev, file_priv);
mutex_unlock(&perfcnt->lock); mutex_unlock(&perfcnt->lock);
pm_runtime_mark_last_busy(pfdev->dev); pm_runtime_mark_last_busy(pfdev->dev);
pm_runtime_put_autosuspend(pfdev->dev); pm_runtime_put_autosuspend(pfdev->dev);
......
...@@ -9,7 +9,7 @@ void panfrost_perfcnt_sample_done(struct panfrost_device *pfdev); ...@@ -9,7 +9,7 @@ void panfrost_perfcnt_sample_done(struct panfrost_device *pfdev);
void panfrost_perfcnt_clean_cache_done(struct panfrost_device *pfdev); void panfrost_perfcnt_clean_cache_done(struct panfrost_device *pfdev);
int panfrost_perfcnt_init(struct panfrost_device *pfdev); int panfrost_perfcnt_init(struct panfrost_device *pfdev);
void panfrost_perfcnt_fini(struct panfrost_device *pfdev); void panfrost_perfcnt_fini(struct panfrost_device *pfdev);
void panfrost_perfcnt_close(struct panfrost_file_priv *pfile); void panfrost_perfcnt_close(struct drm_file *file_priv);
int panfrost_ioctl_perfcnt_enable(struct drm_device *dev, void *data, int panfrost_ioctl_perfcnt_enable(struct drm_device *dev, void *data,
struct drm_file *file_priv); struct drm_file *file_priv);
int panfrost_ioctl_perfcnt_dump(struct drm_device *dev, void *data, int panfrost_ioctl_perfcnt_dump(struct drm_device *dev, void *data,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment