aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSabre Shao2015-07-09 00:50:36 -0500
committerAlex Deucher2015-08-05 12:47:52 -0500
commit23fab59ba56233cd7142d43eace9348b9f5d72c2 (patch)
tree1f9d75be35ecdfa6eb7c10149816656ca81a8afc /amdgpu/amdgpu_vamgr.c
parent5b01908d1c1f94700e68381afe948045d1ef54a1 (diff)
downloadexternal-libgbm-23fab59ba56233cd7142d43eace9348b9f5d72c2.tar.gz
external-libgbm-23fab59ba56233cd7142d43eace9348b9f5d72c2.tar.xz
external-libgbm-23fab59ba56233cd7142d43eace9348b9f5d72c2.zip
amdgpu: add va allocation intefaces
Two new interfaces are added to support client request for allocate virtual address without physical memory committed to. The virtual address space can be managed by client itself. Signed-off-by: Sabre Shao <Sabre.Shao@amd.com> Signed-off-by: Ken Wang <Qingqing.Wang@amd.com> Reviewed-by: Jammy Zhou <Jammy.Zhou@amd.com>
Diffstat (limited to 'amdgpu/amdgpu_vamgr.c')
-rw-r--r--amdgpu/amdgpu_vamgr.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/amdgpu/amdgpu_vamgr.c b/amdgpu/amdgpu_vamgr.c
index 2328e5d7..faffba20 100644
--- a/amdgpu/amdgpu_vamgr.c
+++ b/amdgpu/amdgpu_vamgr.c
@@ -23,6 +23,7 @@
23 23
24#include <stdlib.h> 24#include <stdlib.h>
25#include <string.h> 25#include <string.h>
26#include <errno.h>
26#include "amdgpu.h" 27#include "amdgpu.h"
27#include "amdgpu_drm.h" 28#include "amdgpu_drm.h"
28#include "amdgpu_internal.h" 29#include "amdgpu_internal.h"
@@ -223,3 +224,46 @@ void amdgpu_vamgr_free_va(struct amdgpu_bo_va_mgr *mgr,
223out: 224out:
224 pthread_mutex_unlock(&mgr->bo_va_mutex); 225 pthread_mutex_unlock(&mgr->bo_va_mutex);
225} 226}
227
228int amdgpu_va_range_alloc(amdgpu_device_handle dev,
229 enum amdgpu_gpu_va_range va_range_type,
230 uint64_t size,
231 uint64_t va_base_alignment,
232 uint64_t va_base_required,
233 uint64_t *va_base_allocated,
234 amdgpu_va_handle *va_range_handle)
235{
236 va_base_alignment = MAX2(va_base_alignment, dev->vamgr->va_alignment);
237 size = ALIGN(size, vamgr.va_alignment);
238
239 *va_base_allocated = amdgpu_vamgr_find_va(dev->vamgr, size,
240 va_base_alignment, va_base_required);
241
242 if (*va_base_allocated != AMDGPU_INVALID_VA_ADDRESS) {
243 struct amdgpu_va* va;
244 va = calloc(1, sizeof(struct amdgpu_va));
245 if(!va){
246 amdgpu_vamgr_free_va(dev->vamgr, *va_base_allocated, size);
247 return -ENOMEM;
248 }
249 va->dev = dev;
250 va->address = *va_base_allocated;
251 va->size = size;
252 va->range = va_range_type;
253 *va_range_handle = va;
254 } else {
255 return -EINVAL;
256 }
257
258 return 0;
259}
260
261int amdgpu_va_range_free(amdgpu_va_handle va_range_handle)
262{
263 if(!va_range_handle || !va_range_handle->address)
264 return 0;
265 amdgpu_vamgr_free_va(va_range_handle->dev->vamgr, va_range_handle->address,
266 va_range_handle->size);
267 free(va_range_handle);
268 return 0;
269}