Am 24.10.2017 um 07:57 schrieb Monk Liu: > this query will give flag bits to indicate what happend > on the given context > > Change-Id: I638efef736de77519388199d000ca8f62b4dc89a > Signed-off-by: Monk Liu <Monk.Liu at amd.com> Reviewed-by: Christian König <christian.koenig at amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 37 +++++++++++++++++++++++++++++++++ > include/uapi/drm/amdgpu_drm.h | 8 +++++++ > 2 files changed, 45 insertions(+) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c > index c539fb6..d71dc16 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c > @@ -227,6 +227,40 @@ static int amdgpu_ctx_query(struct amdgpu_device *adev, > return 0; > } > > +static int amdgpu_ctx_query2(struct amdgpu_device *adev, > + struct amdgpu_fpriv *fpriv, uint32_t id, > + union drm_amdgpu_ctx_out *out) > +{ > + struct amdgpu_ctx *ctx; > + struct amdgpu_ctx_mgr *mgr; > + > + if (!fpriv) > + return -EINVAL; > + > + mgr = &fpriv->ctx_mgr; > + mutex_lock(&mgr->lock); > + ctx = idr_find(&mgr->ctx_handles, id); > + if (!ctx) { > + mutex_unlock(&mgr->lock); > + return -EINVAL; > + } > + > + out->state.flags = 0x0; > + out->state.hangs = 0x0; > + > + if (ctx->reset_counter != atomic_read(&adev->gpu_reset_counter)) > + out->state.flags |= AMDGPU_CTX_QUERY2_FLAGS_RESET; > + > + if (ctx->vram_lost_counter != atomic_read(&adev->vram_lost_counter)) > + out->state.flags |= AMDGPU_CTX_QUERY2_FLAGS_VRAMLOST; > + > + if (atomic_read(&ctx->guilty)) > + out->state.flags |= AMDGPU_CTX_QUERY2_FLAGS_GUILTY; > + > + mutex_unlock(&mgr->lock); > + return 0; > +} > + > int amdgpu_ctx_ioctl(struct drm_device *dev, void *data, > struct drm_file *filp) > { > @@ -258,6 +292,9 @@ int amdgpu_ctx_ioctl(struct drm_device *dev, void *data, > case AMDGPU_CTX_OP_QUERY_STATE: > r = amdgpu_ctx_query(adev, fpriv, id, &args->out); > break; > + case AMDGPU_CTX_OP_QUERY_STATE2: > + r = amdgpu_ctx_query2(adev, fpriv, id, &args->out); > + break; > default: > return -EINVAL; > } > diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h > index 74f0b5d..f7a4cf1 100644 > --- a/include/uapi/drm/amdgpu_drm.h > +++ b/include/uapi/drm/amdgpu_drm.h > @@ -163,6 +163,7 @@ union drm_amdgpu_bo_list { > #define AMDGPU_CTX_OP_ALLOC_CTX 1 > #define AMDGPU_CTX_OP_FREE_CTX 2 > #define AMDGPU_CTX_OP_QUERY_STATE 3 > +#define AMDGPU_CTX_OP_QUERY_STATE2 4 > > /* GPU reset status */ > #define AMDGPU_CTX_NO_RESET 0 > @@ -173,6 +174,13 @@ union drm_amdgpu_bo_list { > /* unknown cause */ > #define AMDGPU_CTX_UNKNOWN_RESET 3 > > +/* indicate gpu reset occured after ctx created */ > +#define AMDGPU_CTX_QUERY2_FLAGS_RESET (1<<0) > +/* indicate vram lost occured after ctx created */ > +#define AMDGPU_CTX_QUERY2_FLAGS_VRAMLOST (1<<1) > +/* indicate some job from this context once cause gpu hang */ > +#define AMDGPU_CTX_QUERY2_FLAGS_GUILTY (1<<2) > + > /* Context priority level */ > #define AMDGPU_CTX_PRIORITY_UNSET -2048 > #define AMDGPU_CTX_PRIORITY_VERY_LOW -1023