[PATCH 2/4] amdgpu: add export/import semaphore apis
Chunming Zhou
David1.Zhou at amd.com
Thu Aug 18 07:55:57 UTC 2016
They are used for sharing semaphore across process.
Change-Id: I262adf10913d365bb93368b492e69140af522c64
Signed-off-by: Chunming Zhou <David1.Zhou at amd.com>
---
amdgpu/amdgpu.h | 40 ++++++++++++++++++++++++++++++
amdgpu/amdgpu_cs.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++--
amdgpu/amdgpu_internal.h | 2 ++
3 files changed, 103 insertions(+), 2 deletions(-)
diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h
index 693d841..e716855 100644
--- a/amdgpu/amdgpu.h
+++ b/amdgpu/amdgpu.h
@@ -1379,6 +1379,19 @@ int amdgpu_svm_commit(amdgpu_va_handle va_range_handle,
int amdgpu_svm_uncommit(amdgpu_va_handle va_range_handle);
/**
+ * create shared semaphore
+ *
+ * \param amdgpu_device_handle
+ * \param sem - \c [out] semaphore handle
+ *
+ * \return 0 on success\n
+ * <0 - Negative POSIX Error code
+ *
+*/
+int amdgpu_cs_create_semaphore_object(amdgpu_device_handle device_handle,
+ amdgpu_semaphore_handle *sem);
+
+/**
* create semaphore
*
* \param sem - \c [out] semaphore handle
@@ -1439,6 +1452,33 @@ int amdgpu_cs_wait_semaphore(amdgpu_context_handle ctx,
int amdgpu_cs_destroy_semaphore(amdgpu_semaphore_handle sem);
/**
+ * export semaphore
+ *
+ * \param sem - \c [in] semaphore handle
+ * \param shared_handle - \c [out] handle across process
+ *
+ * \return 0 on success\n
+ * <0 - Negative POSIX Error code
+ *
+*/
+int amdgpu_cs_export_semaphore(amdgpu_semaphore_handle sem,
+ uint32_t *shared_handle);
+/**
+ * import semaphore
+ *
+ * \param sem - \c [out] semaphore handle
+ * \param dev - \c [in] device handle
+ * \param shared_handle - \c [in] handle across process
+ *
+ * \return 0 on success\n
+ * <0 - Negative POSIX Error code
+ *
+*/
+int amdgpu_cs_import_semaphore(amdgpu_semaphore_handle *sem,
+ amdgpu_device_handle dev,
+ uint32_t shared_handle);
+
+/**
* Get the ASIC marketing name
*
* \param dev - \c [in] Device handle. See #amdgpu_device_initialize()
diff --git a/amdgpu/amdgpu_cs.c b/amdgpu/amdgpu_cs.c
index c76a675..a3ff34e 100644
--- a/amdgpu/amdgpu_cs.c
+++ b/amdgpu/amdgpu_cs.c
@@ -518,6 +518,34 @@ int amdgpu_cs_wait_fences(struct amdgpu_cs_fence *fences,
return r;
}
+int amdgpu_cs_create_semaphore_object(amdgpu_device_handle device_handle,
+ amdgpu_semaphore_handle *sem)
+{
+ struct amdgpu_bo_alloc_request req = {0};
+ amdgpu_bo_handle buf_handle;
+ int r;
+
+ if (NULL == sem)
+ return -EINVAL;
+
+ req.alloc_size = sizeof(struct amdgpu_semaphore);
+ req.preferred_heap = AMDGPU_GEM_DOMAIN_GTT;
+
+ r = amdgpu_bo_alloc(device_handle, &req, &buf_handle);
+ if (r)
+ return r;
+ r = amdgpu_bo_cpu_map(buf_handle, sem);
+ if (r) {
+ amdgpu_bo_free(buf_handle);
+ return r;
+ }
+ (*sem)->buf_handle = buf_handle;
+ atomic_set(&(*sem)->refcount, 1);
+ (*sem)->version = 2;
+
+ return 0;
+}
+
int amdgpu_cs_create_semaphore(amdgpu_semaphore_handle *sem)
{
struct amdgpu_semaphore *gpu_semaphore;
@@ -529,6 +557,7 @@ int amdgpu_cs_create_semaphore(amdgpu_semaphore_handle *sem)
if (NULL == gpu_semaphore)
return -ENOMEM;
+ gpu_semaphore->version = 1;
atomic_set(&gpu_semaphore->refcount, 1);
*sem = gpu_semaphore;
@@ -608,8 +637,15 @@ static int amdgpu_cs_unreference_sem(amdgpu_semaphore_handle sem)
if (NULL == sem)
return -EINVAL;
- if (update_references(&sem->refcount, NULL))
- free(sem);
+ if (update_references(&sem->refcount, NULL)) {
+ if (sem->version == 1)
+ free(sem);
+ else if (sem->version == 2) {
+ amdgpu_bo_handle buf_handle = sem->buf_handle;
+ amdgpu_bo_cpu_unmap(buf_handle);
+ amdgpu_bo_free(buf_handle);
+ }
+ }
return 0;
}
@@ -618,4 +654,27 @@ int amdgpu_cs_destroy_semaphore(amdgpu_semaphore_handle sem)
return amdgpu_cs_unreference_sem(sem);
}
+int amdgpu_cs_export_semaphore(amdgpu_semaphore_handle sem,
+ uint32_t *shared_handle)
+{
+ return amdgpu_bo_export(sem->buf_handle,
+ amdgpu_bo_handle_type_dma_buf_fd,
+ shared_handle);
+
+}
+
+int amdgpu_cs_import_semaphore(amdgpu_semaphore_handle *sem,
+ amdgpu_device_handle dev, uint32_t shared_handle)
+{
+ struct amdgpu_bo_import_result output;
+ int r;
+
+ r = amdgpu_bo_import(dev,
+ amdgpu_bo_handle_type_dma_buf_fd,
+ shared_handle,
+ &output);
+ if (r)
+ return r;
+ return amdgpu_bo_cpu_map(output.buf_handle, sem);
+}
diff --git a/amdgpu/amdgpu_internal.h b/amdgpu/amdgpu_internal.h
index ccc85d7..7c422da 100644
--- a/amdgpu/amdgpu_internal.h
+++ b/amdgpu/amdgpu_internal.h
@@ -134,6 +134,8 @@ struct amdgpu_semaphore {
atomic_t refcount;
struct list_head list;
struct drm_amdgpu_fence signal_fence;
+ amdgpu_bo_handle buf_handle;
+ uint32_t version;
};
/**
--
1.9.1
More information about the amd-gfx
mailing list