diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1595-drm-amdgpu-kfd2kgd-Add-copy_mem_to_mem-interface.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1595-drm-amdgpu-kfd2kgd-Add-copy_mem_to_mem-interface.patch | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1595-drm-amdgpu-kfd2kgd-Add-copy_mem_to_mem-interface.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1595-drm-amdgpu-kfd2kgd-Add-copy_mem_to_mem-interface.patch new file mode 100644 index 00000000..36ff7415 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1595-drm-amdgpu-kfd2kgd-Add-copy_mem_to_mem-interface.patch @@ -0,0 +1,181 @@ +From 142e5801ce8fc7ca8649a94b4d04bd4f6838bb68 Mon Sep 17 00:00:00 2001 +From: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com> +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 <Harish.Kasiviswanathan@amd.com> +--- + 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 + |