Change-Id: I79155cef5ee798899cd51a88825512cbf0d8ad82 Signed-off-by: Chunming Zhou <David1.Zhou at amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 10 +++++++++- include/uapi/drm/amdgpu_drm.h | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index d048802..6c0ea9a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c @@ -1178,6 +1178,14 @@ int amdgpu_cs_wait_ioctl(struct drm_device *dev, void *data, if (amdgpu_kms_vram_lost(adev, fpriv)) return -ENODEV; + if (wait->in.sf_fd > 0) { + struct dma_fence *fence = sync_file_get_fence(wait->in.sf_fd); + + WARN_ONCE(fence, "get fence failed from syncfile fd!"); + r = kcl_fence_wait_timeout(fence, true, timeout); + dma_fence_put(fence); + goto out; + } ctx = amdgpu_ctx_get(filp->driver_priv, wait->in.ctx_id); if (ctx == NULL) return -EINVAL; @@ -1202,7 +1210,7 @@ int amdgpu_cs_wait_ioctl(struct drm_device *dev, void *data, amdgpu_ctx_put(ctx); if (r < 0) return r; - +out: memset(wait, 0, sizeof(*wait)); wait->out.status = (r == 0); diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h index 19b4fea..ce110d9 100644 --- a/include/uapi/drm/amdgpu_drm.h +++ b/include/uapi/drm/amdgpu_drm.h @@ -399,6 +399,8 @@ struct drm_amdgpu_wait_cs_in { __u32 ip_instance; __u32 ring; __u32 ctx_id; + int32_t sf_fd; + int32_t _pad; }; struct drm_amdgpu_wait_cs_out { -- 1.9.1