diff options
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.patch | 129 |
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 + |