aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1595-drm-amdgpu-kfd2kgd-Add-copy_mem_to_mem-interface.patch
diff options
context:
space:
mode:
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.patch181
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
+