Signed-off-by: Junwei Zhang <Jerry.Zhang at amd.com> --- amdgpu/amdgpu.h | 7 +++++++ amdgpu/amdgpu_bo.c | 40 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h index 84ab688..a9fddd6 100644 --- a/amdgpu/amdgpu.h +++ b/amdgpu/amdgpu.h @@ -1429,6 +1429,13 @@ int amdgpu_bo_va_op(amdgpu_bo_handle bo, uint64_t flags, uint32_t ops); +int amdgpu_bo_va_op2(amdgpu_device_handle dev, + amdgpu_bo_handle bo, + uint64_t offset, + uint64_t size, + uint64_t addr, + uint64_t flags, + uint32_t ops); /** * VA mapping/unmapping for the buffer object * diff --git a/amdgpu/amdgpu_bo.c b/amdgpu/amdgpu_bo.c index 800b77a..421e440 100644 --- a/amdgpu/amdgpu_bo.c +++ b/amdgpu/amdgpu_bo.c @@ -924,13 +924,51 @@ int amdgpu_bo_list_update(amdgpu_bo_list_handle handle, return r; } -int amdgpu_bo_va_op(amdgpu_bo_handle bo, +int amdgpu_bo_va_op2(amdgpu_device_handle dev, + amdgpu_bo_handle bo, uint64_t offset, uint64_t size, uint64_t addr, uint64_t flags, uint32_t ops) { + struct drm_amdgpu_gem_va va; + int r; + + if (ops != AMDGPU_VA_OP_MAP && ops != AMDGPU_VA_OP_UNMAP && + ops != AMDGPU_VA_OP_REPLACE && + ops != AMDGPU_VA_OP_CLEAR) + return -EINVAL; + + memset(&va, 0, sizeof(va)); + if (bo) + va.handle = bo->handle; + else + va.handle = NULL; + if (flags & AMDGPU_VM_PAGE_PRT) + flags &= AMDGPU_VM_PAGE_PRT; + else + flags |= AMDGPU_VM_PAGE_READABLE | AMDGPU_VM_PAGE_WRITEABLE | + AMDGPU_VM_PAGE_EXECUTABLE; + + va.operation = ops; + va.flags = flags; + va.va_address = addr; + va.offset_in_bo = offset; + va.map_size = ALIGN(size, getpagesize()); + + r = drmCommandWriteRead(dev->fd, DRM_AMDGPU_GEM_VA, &va, sizeof(va)); + + return r; +} + +int amdgpu_bo_va_op(amdgpu_bo_handle bo, + uint64_t offset, + uint64_t size, + uint64_t addr, + uint64_t flags, + uint32_t ops) +{ amdgpu_device_handle dev = bo->dev; struct drm_amdgpu_gem_va va; int r; -- 1.9.1