From 142e5801ce8fc7ca8649a94b4d04bd4f6838bb68 Mon Sep 17 00:00:00 2001 From: Harish Kasiviswanathan Date: Mon, 23 Jan 2017 11:17:34 -0500 Subject: [PATCH 1595/4131] drm/amdgpu: kfd2kgd: Add copy_mem_to_mem interface Change-Id: Ia0b7ad212f6f6f480d080ec63bf0d8765cc7863b Signed-off-by: Harish Kasiviswanathan --- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 4 ++ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 3 +- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 3 +- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 88 +++++++++++++++++++++++ drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 6 ++ 5 files changed, 102 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h index db4f75c..6476491 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h @@ -136,6 +136,10 @@ int amdgpu_amdkfd_submit_ib(struct kgd_dev *kgd, enum kgd_engine_type engine, int amdgpu_amdkfd_gpuvm_restore_process_bos(void *master_vm); struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void); struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void); +int amdgpu_amdkfd_copy_mem_to_mem(struct kgd_dev *kgd, struct kgd_mem *src_mem, + uint64_t src_offset, struct kgd_mem *dst_mem, + uint64_t dest_offset, uint64_t size, struct fence **f, + uint64_t *actual_size); /* Shared API */ int map_bo(struct amdgpu_device *rdev, uint64_t va, void *vm, 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 cebf03a..ae860ec 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c @@ -230,7 +230,8 @@ static const struct kfd2kgd_calls kfd2kgd = { .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, - .restore_process_bos = amdgpu_amdkfd_gpuvm_restore_process_bos + .restore_process_bos = amdgpu_amdkfd_gpuvm_restore_process_bos, + .copy_mem_to_mem = amdgpu_amdkfd_copy_mem_to_mem }; struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions() 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 da6a243..fbea6a6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c @@ -209,7 +209,8 @@ static const struct kfd2kgd_calls kfd2kgd = { .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, - .restore_process_bos = amdgpu_amdkfd_gpuvm_restore_process_bos + .restore_process_bos = amdgpu_amdkfd_gpuvm_restore_process_bos, + .copy_mem_to_mem = amdgpu_amdkfd_copy_mem_to_mem }; struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions() diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index 3f2bc2f..50af53f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c @@ -2250,3 +2250,91 @@ int amdgpu_amdkfd_gpuvm_restore_process_bos(void *m_vm) kfree(pd_bo_list); return ret; } + +int amdgpu_amdkfd_copy_mem_to_mem(struct kgd_dev *kgd, struct kgd_mem *src_mem, + uint64_t src_offset, struct kgd_mem *dst_mem, + uint64_t dst_offset, uint64_t size, + struct fence **f, uint64_t *actual_size) +{ + struct amdgpu_device *adev = NULL; + struct ttm_mem_reg *src = NULL, *dst = NULL; + struct amdgpu_ring *ring; + struct ww_acquire_ctx ticket; + struct list_head list; + struct amdgpu_bo_list_entry *entry; + uint64_t src_start, dst_start; + int r; + + if (!kgd || !src_mem || !dst_mem) + return -EINVAL; + + if (actual_size) + *actual_size = 0; + + adev = get_amdgpu_device(kgd); + src = &src_mem->bo->tbo.mem; + dst = &dst_mem->bo->tbo.mem; + + ring = adev->mman.buffer_funcs_ring; + + INIT_LIST_HEAD(&list); + entry = &src_mem->bo_list_entry; + list_add_tail(&entry->tv.head, &list); + entry = &dst_mem->bo_list_entry; + list_add_tail(&entry->tv.head, &list); + + r = ttm_eu_reserve_buffers(&ticket, &list, false, NULL); + if (r) { + pr_err("Copy buffer failed. Unable to reserve bo (%d)\n", r); + return r; + } + + src_start = (src->start << PAGE_SHIFT) + src_offset; + dst_start = (dst->start << PAGE_SHIFT) + dst_offset; + + switch (src->mem_type) { + case TTM_PL_VRAM: + src_start += adev->mc.vram_start; + break; + case TTM_PL_TT: + src_start += adev->mc.gtt_start; + break; + default: + DRM_ERROR("Unknown placement %d\n", src->mem_type); + r = -EINVAL; + goto copy_fail; + } + switch (dst->mem_type) { + case TTM_PL_VRAM: + dst_start += adev->mc.vram_start; + break; + case TTM_PL_TT: + dst_start += adev->mc.gtt_start; + break; + default: + DRM_ERROR("Unknown placement %d\n", dst->mem_type); + r = -EINVAL; + goto copy_fail; + } + if (!ring->ready) { + pr_err("Trying to move memory with ring turned off.\n"); + r = -EINVAL; + goto copy_fail; + } + + r = amdgpu_copy_buffer(ring, src_start, dst_start, + size, NULL, f); + if (r) + goto copy_fail; + + if (actual_size) + *actual_size = size; + + amdgpu_bo_fence(src_mem->bo, *f, true); + amdgpu_bo_fence(dst_mem->bo, *f, true); + +copy_fail: + ttm_eu_backoff_reservation(&ticket, &list); + return r; +} + diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h index a57dbb1..57e0982 100644 --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h @@ -226,6 +226,8 @@ struct tile_config { * @restore_process_bos: Restore all BOs that belongs to the process identified * by master_vm. * + * @copy_mem_to_mem: Copies size bytes from source BO to destination BO + * * This structure contains function pointers to services that the kgd driver * provides to amdkfd driver. * @@ -371,6 +373,10 @@ struct kfd2kgd_calls { struct tile_config *config); int (*restore_process_bos)(void *master_vm); + int (*copy_mem_to_mem)(struct kgd_dev *kgd, struct kgd_mem *src_mem, + uint64_t src_offset, struct kgd_mem *dst_mem, + uint64_t dest_offset, uint64_t size, struct fence **f, + uint64_t *actual_size); }; /** -- 2.7.4