aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1454-drm-amdgpu-clear-bo-at-memory-allocation.patch
blob: 23a72920a119f5a507a2d48e97b3318f71c0b924 (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
From a9d8447a8505a836b52d9194a5cff24ce95f301a Mon Sep 17 00:00:00 2001
From: Lan Xiao <Lan.Xiao@amd.com>
Date: Fri, 10 Jun 2016 10:17:48 -0400
Subject: [PATCH 1454/4131] drm/amdgpu: clear bo at memory allocation

Feature: SWDEV-95685

Change-Id: I46b46fcc6045d1c9ec9734d1321c2bc817700fda
Signed-off-by: Lan Xiao <Lan.Xiao@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 59 ++++++++++++++++++++++++
 1 file changed, 59 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index a094aa4..f80206e5 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -279,6 +279,55 @@ static void unpin_pts(struct amdgpu_bo_va *bo_va, struct amdgpu_vm *vm)
 	}
 }
 
+
+static int amdgpu_amdkfd_gpuvm_clear_bo(struct amdgpu_device *adev,
+			      struct amdgpu_vm *vm,
+			      struct amdgpu_bo *bo)
+{
+	struct amdgpu_ring *ring;
+	struct fence *fence = NULL;
+	struct amdgpu_job *job;
+	unsigned entries;
+	uint64_t addr;
+	int r;
+
+	ring = container_of(vm->entity.sched, struct amdgpu_ring, sched);
+
+	r = reservation_object_reserve_shared(bo->tbo.resv);
+	if (r)
+		return r;
+
+	r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false);
+	if (r)
+		goto error;
+
+	addr = amdgpu_bo_gpu_offset(bo);
+	entries = amdgpu_bo_size(bo);
+
+	r = amdgpu_job_alloc_with_ib(adev, 64, &job);
+	if (r)
+		goto error;
+
+	amdgpu_emit_fill_buffer(adev, &job->ibs[0], 0, addr, entries);
+	amdgpu_ring_pad_ib(ring, &job->ibs[0]);
+
+	WARN_ON(job->ibs[0].length_dw > 64);
+	r = amdgpu_job_submit(job, ring, &vm->entity,
+			      AMDGPU_FENCE_OWNER_VM, &fence);
+	if (r)
+		goto error_free;
+
+	amdgpu_bo_fence(bo, fence, true);
+	fence_put(fence);
+	return 0;
+
+error_free:
+	amdgpu_job_free(job);
+
+error:
+	return r;
+}
+
 static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va,
 		size_t size, void *vm, struct kgd_mem **mem,
 		uint64_t *offset, void **kptr, struct kfd_process_device *pdd,
@@ -336,6 +385,15 @@ static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va,
 	bo->pdd = pdd;
 	(*mem)->data2.bo = bo;
 
+	if (domain == AMDGPU_GEM_DOMAIN_VRAM) {
+		ret = amdgpu_amdkfd_gpuvm_clear_bo(adev, vm, bo);
+		if (ret) {
+			pr_err("amdkfd: Failed to clear BO object on GTT. ret == %d\n",
+					ret);
+			goto err_bo_clear;
+		}
+	}
+
 	pr_debug("Created BO on GTT with size %zu bytes\n", size);
 
 	if (userptr) {
@@ -397,6 +455,7 @@ static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va,
 	if (userptr)
 		amdgpu_mn_unregister(bo);
 allocate_mem_set_userptr_failed:
+err_bo_clear:
 	amdgpu_bo_unref(&bo);
 err_bo_create:
 	kfree(*mem);
-- 
2.7.4