[AMD Official Use Only - Internal Distribution Only]
Hi, Felix,
amdgpu_gem_prime_export has different define in the old driver. I added
some comment in the below codes.
Best Regards
Dennis Li
-Original Message-
From: amd-gfx On Behalf Of Felix
Kuehling
Sent: Tuesday, July 14, 2020 11:15 AM
To: amd-...@lists.freedesktop.org; dri-devel@lists.freedesktop.org
Cc: Deucher, Alexander ; daniel.vet...@ffwll.ch;
airl...@gmail.com
Subject: [PATCH 1/1] drm/amdkfd: Add IPC API
This allows exporting and importing buffers. The API generates handles that can
be used with the HIP IPC API, i.e. big numbers rather than file descriptors.
Signed-off-by: Felix Kuehling
---
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h| 5 +
.../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 56 +++-
drivers/gpu/drm/amd/amdkfd/Makefile | 3 +-
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 74 ++---
drivers/gpu/drm/amd/amdkfd/kfd_ipc.c | 263 ++
drivers/gpu/drm/amd/amdkfd/kfd_ipc.h | 55
drivers/gpu/drm/amd/amdkfd/kfd_module.c | 5 +
drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 5 +
include/uapi/linux/kfd_ioctl.h| 62 -
9 files changed, 488 insertions(+), 40 deletions(-) create mode 100644
drivers/gpu/drm/amd/amdkfd/kfd_ipc.c
create mode 100644 drivers/gpu/drm/amd/amdkfd/kfd_ipc.h
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
index 3f2b695cf19e..0f8dc4c4f924 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
@@ -49,6 +49,7 @@ struct kfd_bo_va_list { struct kgd_mem {
struct mutex lock;
struct amdgpu_bo *bo;
+ struct kfd_ipc_obj *ipc_obj;
struct list_head bo_va_list;
/* protected by amdkfd_process_info.lock */
struct ttm_validate_buffer validate_list; @@ -240,9 +241,13 @@ int
amdgpu_amdkfd_gpuvm_get_vm_fault_info(struct kgd_dev *kgd,
int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd,
struct dma_buf *dmabuf,
+ struct kfd_ipc_obj *ipc_obj,
uint64_t va, void *vm,
struct kgd_mem **mem, uint64_t *size,
uint64_t *mmap_offset);
+int amdgpu_amdkfd_gpuvm_export_ipc_obj(struct kgd_dev *kgd, void *vm,
+ struct kgd_mem *mem,
+ struct kfd_ipc_obj **ipc_obj);
void amdgpu_amdkfd_gpuvm_init_mem_limits(void);
void amdgpu_amdkfd_unreserve_memory_limit(struct amdgpu_bo *bo); diff --git
a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index c408936e8f98..cd5f23c0c2ca 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -29,6 +29,7 @@
#include "amdgpu_vm.h"
#include "amdgpu_amdkfd.h"
#include "amdgpu_dma_buf.h"
+#include "kfd_ipc.h"
#include
/* BO flag to indicate a KFD userptr BO */ @@ -1353,6 +1354,9 @@ int
amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
*size = 0;
}
+ /* Unreference the ipc_obj if applicable */
+ kfd_ipc_obj_put(&mem->ipc_obj);
+
/* Free the BO*/
drm_gem_object_put_unlocked(&mem->bo->tbo.base);
mutex_destroy(&mem->lock);
@@ -1656,6 +1660,7 @@ int amdgpu_amdkfd_gpuvm_get_vm_fault_info(struct kgd_dev
*kgd,
int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd,
struct dma_buf *dma_buf,
+ struct kfd_ipc_obj *ipc_obj,
uint64_t va, void *vm,
struct kgd_mem **mem, uint64_t *size,
uint64_t *mmap_offset)
@@ -1692,15 +1697,18 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev
*kgd,
INIT_LIST_HEAD(&(*mem)->bo_va_list);
mutex_init(&(*mem)->lock);
-
- (*mem)->alloc_flags =
- ((bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) ?
- KFD_IOC_ALLOC_MEM_FLAGS_VRAM : KFD_IOC_ALLOC_MEM_FLAGS_GTT)
- | KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE
- | KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE;
+ if (bo->kfd_bo)
+ (*mem)->alloc_flags = bo->kfd_bo->alloc_flags;
+ else
+ (*mem)->alloc_flags =
+ ((bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) ?
+ KFD_IOC_ALLOC_MEM_FLAGS_VRAM :
KFD_IOC_ALLOC_MEM_FLAGS_GTT)
+ | KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE
+ | KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE;
drm_gem_object_get(&bo->tbo.base);
(*mem)->bo = bo;
+ (*mem)->ipc_obj = ipc_obj;
(*mem)->va = va;
(*mem)->domain = (bo->preferred_dom