From a9d8447a8505a836b52d9194a5cff24ce95f301a Mon Sep 17 00:00:00 2001 From: Lan Xiao 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 --- 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