aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorJunwei Zhang <Jerry.Zhang@amd.com>2016-09-07 22:13:32 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-09-14 15:10:26 -0400
commitaa1d562e645d2542b48bdd42903726adfc87efb3 (patch)
tree7f3d07a3afa835a5ebfe30bd649398caca796daf /drivers/gpu/drm
parentad2473af273b81cf184d6e43a395a128d4db7b87 (diff)
drm/amdgpu: add a new helper to free a BO in kernel allocations
Free the BO allocated by amdgpu_bo_create_kernel() Signed-off-by: Junwei Zhang <Jerry.Zhang@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.c29
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.h2
2 files changed, 31 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index b17734e0ecc8..162411bd8145 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -287,6 +287,35 @@ error_free:
287 return r; 287 return r;
288} 288}
289 289
290/**
291 * amdgpu_bo_free_kernel - free BO for kernel use
292 *
293 * @bo: amdgpu BO to free
294 *
295 * unmaps and unpin a BO for kernel internal use.
296 */
297void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr,
298 void **cpu_addr)
299{
300 if (*bo == NULL)
301 return;
302
303 if (likely(amdgpu_bo_reserve(*bo, false) == 0)) {
304 if (cpu_addr)
305 amdgpu_bo_kunmap(*bo);
306
307 amdgpu_bo_unpin(*bo);
308 amdgpu_bo_unreserve(*bo);
309 }
310 amdgpu_bo_unref(bo);
311
312 if (gpu_addr)
313 *gpu_addr = 0;
314
315 if (cpu_addr)
316 *cpu_addr = NULL;
317}
318
290int amdgpu_bo_create_restricted(struct amdgpu_device *adev, 319int amdgpu_bo_create_restricted(struct amdgpu_device *adev,
291 unsigned long size, int byte_align, 320 unsigned long size, int byte_align,
292 bool kernel, u32 domain, u64 flags, 321 bool kernel, u32 domain, u64 flags,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
index b6a27390ef88..3032c541ef0e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
@@ -128,6 +128,8 @@ int amdgpu_bo_create_kernel(struct amdgpu_device *adev,
128 unsigned long size, int align, 128 unsigned long size, int align,
129 u32 domain, struct amdgpu_bo **bo_ptr, 129 u32 domain, struct amdgpu_bo **bo_ptr,
130 u64 *gpu_addr, void **cpu_addr); 130 u64 *gpu_addr, void **cpu_addr);
131void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr,
132 void **cpu_addr);
131int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr); 133int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr);
132void amdgpu_bo_kunmap(struct amdgpu_bo *bo); 134void amdgpu_bo_kunmap(struct amdgpu_bo *bo);
133struct amdgpu_bo *amdgpu_bo_ref(struct amdgpu_bo *bo); 135struct amdgpu_bo *amdgpu_bo_ref(struct amdgpu_bo *bo);