mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-24 14:54:49 +08:00
drm/panfrost: Open/close the perfcnt BO
Commita5efb4c9a5
("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:a5efb4c9a5
("drm/panfrost: Restructure the GEM object creation") Cc: <stable@vger.kernel.org> Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com> Reviewed-by: Steven Price <steven.price@arm.com> Acked-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> Signed-off-by: Rob Herring <robh@kernel.org> Link: https://patchwork.freedesktop.org/patch/msgid/20191129135908.2439529-6-boris.brezillon@collabora.com
This commit is contained in:
parent
aed44cbeae
commit
0a5239985a
@ -445,7 +445,7 @@ panfrost_postclose(struct drm_device *dev, struct drm_file *file)
|
||||
{
|
||||
struct panfrost_file_priv *panfrost_priv = file->driver_priv;
|
||||
|
||||
panfrost_perfcnt_close(panfrost_priv);
|
||||
panfrost_perfcnt_close(file);
|
||||
panfrost_job_close(panfrost_priv);
|
||||
|
||||
panfrost_mmu_pgtable_free(panfrost_priv);
|
||||
|
@ -46,7 +46,7 @@ static void panfrost_gem_free_object(struct drm_gem_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;
|
||||
size_t size = obj->size;
|
||||
@ -85,7 +85,7 @@ static int panfrost_gem_open(struct drm_gem_object *obj, struct drm_file *file_p
|
||||
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_file_priv *priv = file_priv->driver_priv;
|
||||
|
@ -45,6 +45,10 @@ panfrost_gem_create_with_handle(struct drm_file *file_priv,
|
||||
u32 flags,
|
||||
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_cleanup(struct drm_device *dev);
|
||||
|
||||
|
@ -66,9 +66,10 @@ static int panfrost_perfcnt_dump_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)
|
||||
{
|
||||
struct panfrost_file_priv *user = file_priv->driver_priv;
|
||||
struct panfrost_perfcnt *perfcnt = pfdev->perfcnt;
|
||||
struct drm_gem_shmem_object *bo;
|
||||
u32 cfg;
|
||||
@ -90,14 +91,14 @@ static int panfrost_perfcnt_enable_locked(struct panfrost_device *pfdev,
|
||||
perfcnt->bo = to_panfrost_bo(&bo->base);
|
||||
|
||||
/* 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)
|
||||
goto err_put_bo;
|
||||
|
||||
perfcnt->buf = drm_gem_shmem_vmap(&bo->base);
|
||||
if (IS_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,
|
||||
|
||||
err_vunmap:
|
||||
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:
|
||||
drm_gem_object_put_unlocked(&bo->base);
|
||||
return ret;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
if (user != perfcnt->user)
|
||||
@ -179,6 +183,7 @@ static int panfrost_perfcnt_disable_locked(struct panfrost_device *pfdev,
|
||||
perfcnt->user = NULL;
|
||||
drm_gem_shmem_vunmap(&perfcnt->bo->base.base, perfcnt->buf);
|
||||
perfcnt->buf = NULL;
|
||||
panfrost_gem_close(&perfcnt->bo->base.base, file_priv);
|
||||
drm_gem_object_put_unlocked(&perfcnt->bo->base.base);
|
||||
perfcnt->bo = NULL;
|
||||
pm_runtime_mark_last_busy(pfdev->dev);
|
||||
@ -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,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct panfrost_file_priv *pfile = file_priv->driver_priv;
|
||||
struct panfrost_device *pfdev = dev->dev_private;
|
||||
struct panfrost_perfcnt *perfcnt = pfdev->perfcnt;
|
||||
struct drm_panfrost_perfcnt_enable *req = data;
|
||||
@ -206,10 +210,10 @@ int panfrost_ioctl_perfcnt_enable(struct drm_device *dev, void *data,
|
||||
|
||||
mutex_lock(&perfcnt->lock);
|
||||
if (req->enable)
|
||||
ret = panfrost_perfcnt_enable_locked(pfdev, pfile,
|
||||
ret = panfrost_perfcnt_enable_locked(pfdev, file_priv,
|
||||
req->counterset);
|
||||
else
|
||||
ret = panfrost_perfcnt_disable_locked(pfdev, pfile);
|
||||
ret = panfrost_perfcnt_disable_locked(pfdev, file_priv);
|
||||
mutex_unlock(&perfcnt->lock);
|
||||
|
||||
return ret;
|
||||
@ -247,15 +251,16 @@ out:
|
||||
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_perfcnt *perfcnt = pfdev->perfcnt;
|
||||
|
||||
pm_runtime_get_sync(pfdev->dev);
|
||||
mutex_lock(&perfcnt->lock);
|
||||
if (perfcnt->user == pfile)
|
||||
panfrost_perfcnt_disable_locked(pfdev, pfile);
|
||||
panfrost_perfcnt_disable_locked(pfdev, file_priv);
|
||||
mutex_unlock(&perfcnt->lock);
|
||||
pm_runtime_mark_last_busy(pfdev->dev);
|
||||
pm_runtime_put_autosuspend(pfdev->dev);
|
||||
|
@ -9,7 +9,7 @@ void panfrost_perfcnt_sample_done(struct panfrost_device *pfdev);
|
||||
void panfrost_perfcnt_clean_cache_done(struct panfrost_device *pfdev);
|
||||
int panfrost_perfcnt_init(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,
|
||||
struct drm_file *file_priv);
|
||||
int panfrost_ioctl_perfcnt_dump(struct drm_device *dev, void *data,
|
||||
|
Loading…
Reference in New Issue
Block a user