amdgpu: add helper for VM mapping v2
Less code and also provides the map_size parameter. v2: Also set offset_in_bo, use *_handle defines. Signed-off-by: Christian König <christian.koenig@amd.com>main
parent
d5c0b2a172
commit
12a23b1964
|
@ -40,6 +40,7 @@
|
||||||
#include "amdgpu_drm.h"
|
#include "amdgpu_drm.h"
|
||||||
#include "amdgpu_internal.h"
|
#include "amdgpu_internal.h"
|
||||||
#include "util_hash_table.h"
|
#include "util_hash_table.h"
|
||||||
|
#include "util_math.h"
|
||||||
|
|
||||||
static void amdgpu_close_kms_handle(amdgpu_device_handle dev,
|
static void amdgpu_close_kms_handle(amdgpu_device_handle dev,
|
||||||
uint32_t handle)
|
uint32_t handle)
|
||||||
|
@ -74,6 +75,39 @@ void amdgpu_bo_free_internal(amdgpu_bo_handle bo)
|
||||||
free(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,
|
int amdgpu_bo_alloc(amdgpu_device_handle dev,
|
||||||
struct amdgpu_bo_alloc_request *alloc_buffer,
|
struct amdgpu_bo_alloc_request *alloc_buffer,
|
||||||
struct amdgpu_bo_alloc_result *info)
|
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);
|
pthread_mutex_init(&bo->cpu_access_mutex, NULL);
|
||||||
|
|
||||||
/* map the buffer to the GPU virtual address space */
|
r = amdgpu_bo_map(bo, alloc_buffer->phys_alignment);
|
||||||
{
|
if (r) {
|
||||||
union drm_amdgpu_gem_va va;
|
amdgpu_bo_free_internal(bo);
|
||||||
|
return r;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
info->buf_handle = bo;
|
info->buf_handle = bo;
|
||||||
|
@ -314,7 +325,6 @@ int amdgpu_bo_import(amdgpu_device_handle dev,
|
||||||
struct amdgpu_bo_import_result *output)
|
struct amdgpu_bo_import_result *output)
|
||||||
{
|
{
|
||||||
struct drm_gem_open open_arg = {};
|
struct drm_gem_open open_arg = {};
|
||||||
union drm_amdgpu_gem_va va;
|
|
||||||
struct amdgpu_bo *bo = NULL;
|
struct amdgpu_bo *bo = NULL;
|
||||||
int r;
|
int r;
|
||||||
int dma_fd;
|
int dma_fd;
|
||||||
|
@ -439,26 +449,10 @@ int amdgpu_bo_import(amdgpu_device_handle dev,
|
||||||
atomic_set(&bo->refcount, 1);
|
atomic_set(&bo->refcount, 1);
|
||||||
bo->dev = dev;
|
bo->dev = dev;
|
||||||
pthread_mutex_init(&bo->cpu_access_mutex, NULL);
|
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);
|
r = amdgpu_bo_map(bo, 1 << 20);
|
||||||
|
if (r) {
|
||||||
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);
|
|
||||||
amdgpu_bo_reference(&bo, NULL);
|
amdgpu_bo_reference(&bo, NULL);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
@ -592,7 +586,6 @@ int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
|
||||||
int r;
|
int r;
|
||||||
struct amdgpu_bo *bo;
|
struct amdgpu_bo *bo;
|
||||||
struct drm_amdgpu_gem_userptr args;
|
struct drm_amdgpu_gem_userptr args;
|
||||||
union drm_amdgpu_gem_va va;
|
|
||||||
uintptr_t cpu0;
|
uintptr_t cpu0;
|
||||||
uint32_t ps, off;
|
uint32_t ps, off;
|
||||||
|
|
||||||
|
@ -619,24 +612,13 @@ int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
|
||||||
bo->dev = dev;
|
bo->dev = dev;
|
||||||
bo->alloc_size = size;
|
bo->alloc_size = size;
|
||||||
bo->handle = args.handle;
|
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) {
|
r = amdgpu_bo_map(bo, 1 << 12);
|
||||||
amdgpu_bo_free_internal(bo);
|
if (r) {
|
||||||
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) {
|
|
||||||
amdgpu_bo_free_internal(bo);
|
amdgpu_bo_free_internal(bo);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
info->buf_handle = bo;
|
info->buf_handle = bo;
|
||||||
info->virtual_mc_base_address = bo->virtual_mc_base_address;
|
info->virtual_mc_base_address = bo->virtual_mc_base_address;
|
||||||
info->virtual_mc_base_address += off;
|
info->virtual_mc_base_address += off;
|
||||||
|
|
Loading…
Reference in New Issue