diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 29 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 2 |
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 | */ | ||
| 297 | void 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 | |||
| 290 | int amdgpu_bo_create_restricted(struct amdgpu_device *adev, | 319 | int 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); |
| 131 | void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr, | ||
| 132 | void **cpu_addr); | ||
| 131 | int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr); | 133 | int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr); |
| 132 | void amdgpu_bo_kunmap(struct amdgpu_bo *bo); | 134 | void amdgpu_bo_kunmap(struct amdgpu_bo *bo); |
| 133 | struct amdgpu_bo *amdgpu_bo_ref(struct amdgpu_bo *bo); | 135 | struct amdgpu_bo *amdgpu_bo_ref(struct amdgpu_bo *bo); |
