From 2cedb24cf8ae3857d9c64eb54ca3b110bb076fe8 Mon Sep 17 00:00:00 2001 From: Harish Kasiviswanathan 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 --- 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