Change-Id: I9a9e8d474c2f31e71bdf9841a518fa48b3e5c33b
Signed-off-by: Chunming Zhou <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 63 +++++++++++++++++++++-------------
 include/uapi/drm/amdgpu_drm.h          |  3 ++
 2 files changed, 42 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 3b049a4..d048802 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -155,6 +155,7 @@ static int amdgpu_cs_parser_init(struct amdgpu_cs_parser 
*p, void *data)
                        break;
 
                case AMDGPU_CHUNK_ID_DEPENDENCIES:
+               case AMDGPU_CHUNK_ID_SYNCFILE:
                        break;
 
                default:
@@ -983,34 +984,47 @@ static int amdgpu_cs_process_fence_dep(struct 
amdgpu_cs_parser *p,
                sizeof(struct drm_amdgpu_cs_chunk_dep);
 
        for (i = 0; i < num_deps; ++i) {
-               struct amdgpu_ring *ring;
-               struct amdgpu_ctx *ctx;
-               struct dma_fence *fence;
+               if (chunk->chunk_id == AMDGPU_CHUNK_ID_DEPENDENCIES) {
+                       struct amdgpu_ring *ring;
+                       struct amdgpu_ctx *ctx;
+                       struct dma_fence *fence;
 
-               ctx = amdgpu_ctx_get(fpriv, deps[i].ctx_id);
-               if (ctx == NULL)
-                       return -EINVAL;
+                       ctx = amdgpu_ctx_get(fpriv, deps[i].ctx_id);
+                       if (ctx == NULL)
+                               return -EINVAL;
 
-               r = amdgpu_queue_mgr_map(p->adev, &ctx->queue_mgr,
-                                        deps[i].ip_type,
-                                        deps[i].ip_instance,
-                                        deps[i].ring, &ring);
-               if (r) {
-                       amdgpu_ctx_put(ctx);
-                       return r;
-               }
+                       r = amdgpu_queue_mgr_map(p->adev, &ctx->queue_mgr,
+                                               deps[i].ip_type,
+                                               deps[i].ip_instance,
+                                               deps[i].ring, &ring);
+                       if (r) {
+                               amdgpu_ctx_put(ctx);
+                               return r;
+                       }
 
-               fence = amdgpu_ctx_get_fence(ctx, ring,
-                                            deps[i].handle);
-               if (IS_ERR(fence)) {
-                       r = PTR_ERR(fence);
-                       amdgpu_ctx_put(ctx);
-                       return r;
-               } else if (fence) {
+                       fence = amdgpu_ctx_get_fence(ctx, ring,
+                                               deps[i].handle);
+                       if (IS_ERR(fence)) {
+                               r = PTR_ERR(fence);
+                               amdgpu_ctx_put(ctx);
+                               return r;
+                       } else if (fence) {
+                               r = amdgpu_sync_fence(p->adev, &p->job->sync,
+                                                       fence);
+                               dma_fence_put(fence);
+                               amdgpu_ctx_put(ctx);
+                               if (r)
+                                       return r;
+                       }
+               } else if (chunk->chunk_id == AMDGPU_CHUNK_ID_SYNCFILE) {
+                       struct dma_fence *fence;
+
+                       WARN_ONCE(deps[i].sf_fd < 0,
+                                 "invalid syncfile fd handle!");
+                       fence = sync_file_get_fence(deps[i].sf_fd);
                        r = amdgpu_sync_fence(p->adev, &p->job->sync,
-                                             fence);
+                                               fence);
                        dma_fence_put(fence);
-                       amdgpu_ctx_put(ctx);
                        if (r)
                                return r;
                }
@@ -1028,7 +1042,8 @@ static int amdgpu_cs_dependencies(struct amdgpu_device 
*adev,
 
                chunk = &p->chunks[i];
 
-               if (chunk->chunk_id == AMDGPU_CHUNK_ID_DEPENDENCIES) {
+               if ((chunk->chunk_id == AMDGPU_CHUNK_ID_DEPENDENCIES) ||
+                       (chunk->chunk_id == AMDGPU_CHUNK_ID_SYNCFILE)) {
                        r = amdgpu_cs_process_fence_dep(p, chunk);
                        if (r)
                                return r;
diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h
index d0cd4f0..19b4fea 100644
--- a/include/uapi/drm/amdgpu_drm.h
+++ b/include/uapi/drm/amdgpu_drm.h
@@ -511,6 +511,7 @@ struct drm_amdgpu_gem_va {
 #define AMDGPU_CHUNK_ID_IB             0x01
 #define AMDGPU_CHUNK_ID_FENCE          0x02
 #define AMDGPU_CHUNK_ID_DEPENDENCIES   0x03
+#define AMDGPU_CHUNK_ID_SYNCFILE       0x04
 
 struct drm_amdgpu_cs_chunk {
        __u32           chunk_id;
@@ -573,6 +574,8 @@ struct drm_amdgpu_cs_chunk_dep {
        __u32 ring;
        __u32 ctx_id;
        __u64 handle;
+       int32_t sf_fd;
+       int32_t _pad;
 };
 
 struct drm_amdgpu_cs_chunk_fence {
-- 
1.9.1

_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to