On 06/02/2020 14:13, Boris Brezillon wrote: > We need to use the AS attached to the opened FD when dumping counters. Indeed we do! Reviewed-by: Steven Price <steven.price@xxxxxxx> > > Reported-by: Antonio Caggiano <antonio.caggiano@xxxxxxxxxxxxx> > Fixes: 7282f7645d06 ("drm/panfrost: Implement per FD address spaces") > Cc: <stable@xxxxxxxxxxxxxxx> > Signed-off-by: Boris Brezillon <boris.brezillon@xxxxxxxxxxxxx> > --- > drivers/gpu/drm/panfrost/panfrost_mmu.c | 7 ++++++- > drivers/gpu/drm/panfrost/panfrost_perfcnt.c | 11 ++++------- > 2 files changed, 10 insertions(+), 8 deletions(-) > > diff --git a/drivers/gpu/drm/panfrost/panfrost_mmu.c b/drivers/gpu/drm/panfrost/panfrost_mmu.c > index 763cfca886a7..3107b0738e40 100644 > --- a/drivers/gpu/drm/panfrost/panfrost_mmu.c > +++ b/drivers/gpu/drm/panfrost/panfrost_mmu.c > @@ -151,7 +151,12 @@ u32 panfrost_mmu_as_get(struct panfrost_device *pfdev, struct panfrost_mmu *mmu) > as = mmu->as; > if (as >= 0) { > int en = atomic_inc_return(&mmu->as_count); > - WARN_ON(en >= NUM_JOB_SLOTS); > + > + /* > + * AS can be retained by active jobs or a perfcnt context, > + * hence the '+ 1' here. > + */ > + WARN_ON(en >= (NUM_JOB_SLOTS + 1)); > > list_move(&mmu->list, &pfdev->as_lru_list); > goto out; > diff --git a/drivers/gpu/drm/panfrost/panfrost_perfcnt.c b/drivers/gpu/drm/panfrost/panfrost_perfcnt.c > index 684820448be3..6913578d5aa7 100644 > --- a/drivers/gpu/drm/panfrost/panfrost_perfcnt.c > +++ b/drivers/gpu/drm/panfrost/panfrost_perfcnt.c > @@ -73,7 +73,7 @@ static int panfrost_perfcnt_enable_locked(struct panfrost_device *pfdev, > struct panfrost_file_priv *user = file_priv->driver_priv; > struct panfrost_perfcnt *perfcnt = pfdev->perfcnt; > struct drm_gem_shmem_object *bo; > - u32 cfg; > + u32 cfg, as; > int ret; > > if (user == perfcnt->user) > @@ -126,12 +126,8 @@ static int panfrost_perfcnt_enable_locked(struct panfrost_device *pfdev, > > perfcnt->user = user; > > - /* > - * Always use address space 0 for now. > - * FIXME: this needs to be updated when we start using different > - * address space. > - */ > - cfg = GPU_PERFCNT_CFG_AS(0) | > + as = panfrost_mmu_as_get(pfdev, perfcnt->mapping->mmu); > + cfg = GPU_PERFCNT_CFG_AS(as) | > GPU_PERFCNT_CFG_MODE(GPU_PERFCNT_CFG_MODE_MANUAL); > > /* > @@ -195,6 +191,7 @@ static int panfrost_perfcnt_disable_locked(struct panfrost_device *pfdev, > drm_gem_shmem_vunmap(&perfcnt->mapping->obj->base.base, perfcnt->buf); > perfcnt->buf = NULL; > panfrost_gem_close(&perfcnt->mapping->obj->base.base, file_priv); > + panfrost_mmu_as_put(pfdev, perfcnt->mapping->mmu); > panfrost_gem_mapping_put(perfcnt->mapping); > perfcnt->mapping = NULL; > pm_runtime_mark_last_busy(pfdev->dev); >