summaryrefslogtreecommitdiff
path: root/amdgpu
diff options
context:
space:
mode:
Diffstat (limited to 'amdgpu')
-rw-r--r--amdgpu/amdgpu_bo.c106
1 files changed, 44 insertions, 62 deletions
diff --git a/amdgpu/amdgpu_bo.c b/amdgpu/amdgpu_bo.c
index 11d352ae..e1717194 100644
--- a/amdgpu/amdgpu_bo.c
+++ b/amdgpu/amdgpu_bo.c
@@ -40,6 +40,7 @@
#include "amdgpu_drm.h"
#include "amdgpu_internal.h"
#include "util_hash_table.h"
+#include "util_math.h"
static void amdgpu_close_kms_handle(amdgpu_device_handle dev,
uint32_t handle)
@@ -74,6 +75,39 @@ void amdgpu_bo_free_internal(amdgpu_bo_handle bo)
free(bo);
}
+/* map the buffer to the GPU virtual address space */
+static int amdgpu_bo_map(amdgpu_bo_handle bo, uint32_t alignment)
+{
+ amdgpu_device_handle dev = bo->dev;
+ union drm_amdgpu_gem_va va;
+ int r;
+
+ memset(&va, 0, sizeof(va));
+
+ bo->virtual_mc_base_address = amdgpu_vamgr_find_va(&dev->vamgr,
+ bo->alloc_size, alignment);
+
+ if (bo->virtual_mc_base_address == AMDGPU_INVALID_VA_ADDRESS)
+ return -ENOSPC;
+
+ va.in.handle = bo->handle;
+ va.in.operation = AMDGPU_VA_OP_MAP;
+ va.in.flags = AMDGPU_VM_PAGE_READABLE |
+ AMDGPU_VM_PAGE_WRITEABLE |
+ AMDGPU_VM_PAGE_EXECUTABLE;
+ va.in.va_address = bo->virtual_mc_base_address;
+ va.in.offset_in_bo = 0;
+ va.in.map_size = ALIGN(bo->alloc_size, getpagesize());
+
+ r = drmCommandWriteRead(dev->fd, DRM_AMDGPU_GEM_VA, &va, sizeof(va));
+ if (r || va.out.result == AMDGPU_VA_RESULT_ERROR) {
+ amdgpu_bo_free_internal(bo);
+ return r;
+ }
+
+ return 0;
+}
+
int amdgpu_bo_alloc(amdgpu_device_handle dev,
struct amdgpu_bo_alloc_request *alloc_buffer,
struct amdgpu_bo_alloc_result *info)
@@ -115,33 +149,10 @@ int amdgpu_bo_alloc(amdgpu_device_handle dev,
pthread_mutex_init(&bo->cpu_access_mutex, NULL);
- /* map the buffer to the GPU virtual address space */
- {
- union drm_amdgpu_gem_va va;
-
- memset(&va, 0, sizeof(va));
-
- bo->virtual_mc_base_address = amdgpu_vamgr_find_va(&dev->vamgr,
- alloc_buffer->alloc_size,
- alloc_buffer->phys_alignment);
-
- if (bo->virtual_mc_base_address == AMDGPU_INVALID_VA_ADDRESS) {
- amdgpu_bo_free_internal(bo);
- return -ENOSPC;
- }
-
- va.in.handle = bo->handle;
- va.in.operation = AMDGPU_VA_OP_MAP;
- va.in.flags = AMDGPU_VM_PAGE_READABLE |
- AMDGPU_VM_PAGE_WRITEABLE |
- AMDGPU_VM_PAGE_EXECUTABLE;
- va.in.va_address = bo->virtual_mc_base_address;
-
- r = drmCommandWriteRead(dev->fd, DRM_AMDGPU_GEM_VA, &va, sizeof(va));
- if (r || va.out.result == AMDGPU_VA_RESULT_ERROR) {
- amdgpu_bo_free_internal(bo);
- return r;
- }
+ r = amdgpu_bo_map(bo, alloc_buffer->phys_alignment);
+ if (r) {
+ amdgpu_bo_free_internal(bo);
+ return r;
}
info->buf_handle = bo;
@@ -314,7 +325,6 @@ int amdgpu_bo_import(amdgpu_device_handle dev,
struct amdgpu_bo_import_result *output)
{
struct drm_gem_open open_arg = {};
- union drm_amdgpu_gem_va va;
struct amdgpu_bo *bo = NULL;
int r;
int dma_fd;
@@ -439,26 +449,10 @@ int amdgpu_bo_import(amdgpu_device_handle dev,
atomic_set(&bo->refcount, 1);
bo->dev = dev;
pthread_mutex_init(&bo->cpu_access_mutex, NULL);
+ pthread_mutex_unlock(&dev->bo_table_mutex);
- bo->virtual_mc_base_address = amdgpu_vamgr_find_va(&dev->vamgr, bo->alloc_size, 1 << 20);
-
- if (bo->virtual_mc_base_address == AMDGPU_INVALID_VA_ADDRESS) {
- pthread_mutex_unlock(&dev->bo_table_mutex);
- amdgpu_bo_reference(&bo, NULL);
- return -ENOSPC;
- }
-
- memset(&va, 0, sizeof(va));
- va.in.handle = bo->handle;
- va.in.operation = AMDGPU_VA_OP_MAP;
- va.in.va_address = bo->virtual_mc_base_address;
- va.in.flags = AMDGPU_VM_PAGE_READABLE | AMDGPU_VM_PAGE_WRITEABLE |
- AMDGPU_VM_PAGE_EXECUTABLE;
-
- r = drmCommandWriteRead(dev->fd, DRM_AMDGPU_GEM_VA, &va, sizeof(va));
- if (r || va.out.result == AMDGPU_VA_RESULT_ERROR) {
- pthread_mutex_unlock(&dev->bo_table_mutex);
- amdgpu_vamgr_free_va(&dev->vamgr, bo->virtual_mc_base_address, bo->alloc_size);
+ r = amdgpu_bo_map(bo, 1 << 20);
+ if (r) {
amdgpu_bo_reference(&bo, NULL);
return r;
}
@@ -592,7 +586,6 @@ int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
int r;
struct amdgpu_bo *bo;
struct drm_amdgpu_gem_userptr args;
- union drm_amdgpu_gem_va va;
uintptr_t cpu0;
uint32_t ps, off;
@@ -619,24 +612,13 @@ int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
bo->dev = dev;
bo->alloc_size = size;
bo->handle = args.handle;
- bo->virtual_mc_base_address = amdgpu_vamgr_find_va(&dev->vamgr, size, 4 * 1024);
-
- if (bo->virtual_mc_base_address == AMDGPU_INVALID_VA_ADDRESS) {
- amdgpu_bo_free_internal(bo);
- return -ENOSPC;
- }
- memset(&va, 0, sizeof(va));
- va.in.handle = bo->handle;
- va.in.operation = AMDGPU_VA_OP_MAP;
- va.in.flags = AMDGPU_VM_PAGE_READABLE | AMDGPU_VM_PAGE_WRITEABLE |
- AMDGPU_VM_PAGE_EXECUTABLE;
- va.in.va_address = bo->virtual_mc_base_address;
- r = drmCommandWriteRead(dev->fd, DRM_AMDGPU_GEM_VA, &va, sizeof(va));
- if (r || va.out.result == AMDGPU_VA_RESULT_ERROR) {
+ r = amdgpu_bo_map(bo, 1 << 12);
+ if (r) {
amdgpu_bo_free_internal(bo);
return r;
}
+
info->buf_handle = bo;
info->virtual_mc_base_address = bo->virtual_mc_base_address;
info->virtual_mc_base_address += off;