aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1454-drm-amdgpu-clear-bo-at-memory-allocation.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1454-drm-amdgpu-clear-bo-at-memory-allocation.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1454-drm-amdgpu-clear-bo-at-memory-allocation.patch100
1 files changed, 100 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1454-drm-amdgpu-clear-bo-at-memory-allocation.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1454-drm-amdgpu-clear-bo-at-memory-allocation.patch
new file mode 100644
index 00000000..23a72920
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1454-drm-amdgpu-clear-bo-at-memory-allocation.patch
@@ -0,0 +1,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
+