aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1559-drm-amdgpu-Export-dmabuf-support-for-KFD-BOs.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1559-drm-amdgpu-Export-dmabuf-support-for-KFD-BOs.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1559-drm-amdgpu-Export-dmabuf-support-for-KFD-BOs.patch129
1 files changed, 129 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1559-drm-amdgpu-Export-dmabuf-support-for-KFD-BOs.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1559-drm-amdgpu-Export-dmabuf-support-for-KFD-BOs.patch
new file mode 100644
index 00000000..4a0cedf0
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1559-drm-amdgpu-Export-dmabuf-support-for-KFD-BOs.patch
@@ -0,0 +1,129 @@
+From 2cedb24cf8ae3857d9c64eb54ca3b110bb076fe8 Mon Sep 17 00:00:00 2001
+From: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
+Date: Fri, 18 Nov 2016 17:30:00 -0500
+Subject: [PATCH 1559/4131] drm/amdgpu: Export dmabuf support for KFD BOs
+
+Change-Id: Id0a30c029f1c9d0eff8fc76df40d391a3cddfdbb
+Signed-off-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 ++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 2 ++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 1 +
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 1 +
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 27 +++++++++++++++++++++++
+ drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 4 ++++
+ 6 files changed, 37 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+index 11b759e..ee6069f 100755
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+@@ -408,6 +408,8 @@ amdgpu_gem_prime_import_sg_table(struct drm_device *dev,
+ struct dma_buf *amdgpu_gem_prime_export(struct drm_device *dev,
+ struct drm_gem_object *gobj,
+ int flags);
++struct drm_gem_object *
++amdgpu_gem_prime_foreign_bo(struct amdgpu_device *adev, struct amdgpu_bo *bo);
+ struct drm_gem_object *amdgpu_gem_prime_import(struct drm_device *dev,
+ struct dma_buf *dma_buf);
+ int amdgpu_gem_prime_pin(struct drm_gem_object *obj);
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+index 9c8c941..362132b 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+@@ -195,6 +195,8 @@ void amdgpu_amdkfd_gpuvm_unpin_put_sg_table(
+ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd, int dma_buf_fd,
+ uint64_t va, void *vm,
+ struct kgd_mem **mem, uint64_t *size);
++int amdgpu_amdkfd_gpuvm_export_dmabuf(struct kgd_dev *kgd, void *vm,
++ struct kgd_mem *mem, int *dmabuf_fd);
+ int amdgpu_amdkfd_gpuvm_evict_mem(struct kgd_mem *mem, struct mm_struct *mm);
+ int amdgpu_amdkfd_gpuvm_restore_mem(struct kgd_mem *mem, struct mm_struct *mm);
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+index 7ab108e..4896541 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+@@ -224,6 +224,7 @@ static const struct kfd2kgd_calls kfd2kgd = {
+ .unpin_put_sg_table_bo = amdgpu_amdkfd_gpuvm_unpin_put_sg_table,
+ .get_dmabuf_info = amdgpu_amdkfd_get_dmabuf_info,
+ .import_dmabuf = amdgpu_amdkfd_gpuvm_import_dmabuf,
++ .export_dmabuf = amdgpu_amdkfd_gpuvm_export_dmabuf,
+ .get_vm_fault_info = amdgpu_amdkfd_gpuvm_get_vm_fault_info,
+ .submit_ib = amdgpu_amdkfd_submit_ib,
+ .get_tile_config = amdgpu_amdkfd_get_tile_config,
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+index ba316e8..60dafce 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+@@ -203,6 +203,7 @@ static const struct kfd2kgd_calls kfd2kgd = {
+ .unpin_put_sg_table_bo = amdgpu_amdkfd_gpuvm_unpin_put_sg_table,
+ .get_dmabuf_info = amdgpu_amdkfd_get_dmabuf_info,
+ .import_dmabuf = amdgpu_amdkfd_gpuvm_import_dmabuf,
++ .export_dmabuf = amdgpu_amdkfd_gpuvm_export_dmabuf,
+ .get_vm_fault_info = amdgpu_amdkfd_gpuvm_get_vm_fault_info,
+ .submit_ib = amdgpu_amdkfd_submit_ib,
+ .get_tile_config = amdgpu_amdkfd_get_tile_config,
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+index 0926000..3a7bfa1 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+@@ -1845,6 +1845,33 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd, int dma_buf_fd,
+ return r;
+ }
+
++int amdgpu_amdkfd_gpuvm_export_dmabuf(struct kgd_dev *kgd, void *vm,
++ struct kgd_mem *mem, int *dmabuf_fd)
++{
++ struct dma_buf *dmabuf;
++ struct amdgpu_device *adev = NULL;
++ struct amdgpu_bo *bo = NULL;
++ struct drm_gem_object *gobj = NULL;
++
++ if (!dmabuf_fd || !kgd || !vm || !mem)
++ return -EINVAL;
++
++ adev = get_amdgpu_device(kgd);
++ bo = mem->bo;
++
++ gobj = amdgpu_gem_prime_foreign_bo(adev, bo);
++ if (gobj == NULL) {
++ pr_err("Export BO failed. Unable to find/create GEM object\n");
++ return -EINVAL;
++ }
++
++ dmabuf = amdgpu_gem_prime_export(adev->ddev, gobj, 0);
++ *dmabuf_fd = dma_buf_fd(dmabuf, 0);
++
++ pr_debug("Exported: %d\n", *dmabuf_fd);
++ return 0;
++}
++
+ /* Runs out of process context. mem->lock must be held. */
+ int amdgpu_amdkfd_gpuvm_evict_mem(struct kgd_mem *mem, struct mm_struct *mm)
+ {
+diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+index 910dca1..68b72cd 100644
+--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
++++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+@@ -217,6 +217,8 @@ struct tile_config {
+ * @import_dmabuf: Imports a DMA buffer, creating a new kgd_mem object
+ * Supports only DMA buffers created by GPU driver on the same GPU
+ *
++ * @export_dmabuf: Emports a KFD BO for sharing with other process
++ *
+ * @submit_ib: Submits an IB to the engine specified by inserting the IB to
+ * the corresonded ring (ring type).
+ *
+@@ -355,6 +357,8 @@ struct kfd2kgd_calls {
+ uint32_t *metadata_size, uint32_t *flags);
+ int (*import_dmabuf)(struct kgd_dev *kgd, int dma_buf_fd, uint64_t va,
+ void *vm, struct kgd_mem **mem, uint64_t *size);
++ int (*export_dmabuf)(struct kgd_dev *kgd, void *vm, struct kgd_mem *mem,
++ int *dma_buf_fd);
+
+ int (*get_vm_fault_info)(struct kgd_dev *kgd,
+ struct kfd_vm_fault_info *info);
+--
+2.7.4
+