aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/1595-drm-amdgpu-kfd2kgd-Add-copy_mem_to_mem-interface.patch
blob: 36ff74153a6af427ae074b2186d0a06689f4bc77 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
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