OSDN Git Service

amdgpu: add IB sharing support v2
authorJammy Zhou <Jammy.Zhou@amd.com>
Wed, 20 May 2015 20:17:48 +0000 (04:17 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 5 Aug 2015 17:47:50 +0000 (13:47 -0400)
A new 'offset' flag is added to the amdgpu_cs_ib_info structure,
which can be used to specify location of PM4 packets to execute
in the IB buffer object

v2: remove the shared IB flag, etc

Signed-off-by: Jammy Zhou <Jammy.Zhou@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
amdgpu/amdgpu.h
amdgpu/amdgpu_cs.c

index 32bf30e..c6161bd 100644 (file)
@@ -342,6 +342,9 @@ struct amdgpu_cs_ib_info {
         *   - Could be 0
         */
        uint32_t       size;
+
+       /** Offset in the IB buffer object (in unit of dwords) */
+       uint32_t        offset_dw;
 };
 
 /**
index c8101b8..5e406e8 100644 (file)
@@ -316,8 +316,17 @@ static void amdgpu_cs_add_pending(amdgpu_context_handle context,
                                  uint32_t ring)
 {
        struct list_head *head;
+       struct amdgpu_ib *next;
+       struct amdgpu_ib *s;
+
        pthread_mutex_lock(&context->pendings_mutex);
        head = &context->pendings[ip][ip_instance][ring];
+       LIST_FOR_EACH_ENTRY_SAFE(next, s, head, list_node)
+               if (next == ib) {
+                       pthread_mutex_unlock(&context->pendings_mutex);
+                       return;
+               }
+
        LIST_ADDTAIL(&ib->list_node, head);
        pthread_mutex_unlock(&context->pendings_mutex);
        return;
@@ -694,7 +703,8 @@ static int amdgpu_cs_submit_one(amdgpu_context_handle context,
                ib = &ibs_request->ibs[i];
 
                chunk_data[i].ib_data.handle = ib->ib_handle->buf_handle->handle;
-               chunk_data[i].ib_data.va_start = ib->ib_handle->virtual_mc_base_address;
+               chunk_data[i].ib_data.va_start = ib->ib_handle->virtual_mc_base_address
+                                               + ib->offset_dw * 4;
                chunk_data[i].ib_data.ib_bytes = ib->size * 4;
                chunk_data[i].ib_data.ip_type = ibs_request->ip_type;
                chunk_data[i].ib_data.ip_instance = ibs_request->ip_instance;