From 4081e088962315b5c3f4e7030868faf01e7c4a69 Mon Sep 17 00:00:00 2001 From: Michal Navratil Date: Sun, 4 Feb 2018 20:24:02 +0100 Subject: winsys/amdgpu: allow non page-aligned size bo creation from pointer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix INVALID_OPERATION caused by BufferData with target EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD when the buffer size is not page aligned. Signed-off-by: Marek Olšák Cc: 17.3 18.0 --- src/gallium/winsys/amdgpu/drm/amdgpu_bo.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'src/gallium/winsys') diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c index 5d565ff4624..ba48cade133 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c @@ -1388,19 +1388,22 @@ static struct pb_buffer *amdgpu_bo_from_ptr(struct radeon_winsys *rws, struct amdgpu_winsys_bo *bo; uint64_t va; amdgpu_va_handle va_handle; + /* Avoid failure when the size is not page aligned */ + uint64_t aligned_size = align64(size, ws->info.gart_page_size); bo = CALLOC_STRUCT(amdgpu_winsys_bo); if (!bo) return NULL; - if (amdgpu_create_bo_from_user_mem(ws->dev, pointer, size, &buf_handle)) + if (amdgpu_create_bo_from_user_mem(ws->dev, pointer, + aligned_size, &buf_handle)) goto error; if (amdgpu_va_range_alloc(ws->dev, amdgpu_gpu_va_range_general, - size, 1 << 12, 0, &va, &va_handle, 0)) + aligned_size, 1 << 12, 0, &va, &va_handle, 0)) goto error_va_alloc; - if (amdgpu_bo_va_op(buf_handle, 0, size, va, 0, AMDGPU_VA_OP_MAP)) + if (amdgpu_bo_va_op(buf_handle, 0, aligned_size, va, 0, AMDGPU_VA_OP_MAP)) goto error_va_map; /* Initialize it. */ @@ -1416,7 +1419,7 @@ static struct pb_buffer *amdgpu_bo_from_ptr(struct radeon_winsys *rws, bo->initial_domain = RADEON_DOMAIN_GTT; bo->unique_id = __sync_fetch_and_add(&ws->next_bo_unique_id, 1); - ws->allocated_gtt += align64(bo->base.size, ws->info.gart_page_size); + ws->allocated_gtt += aligned_size; amdgpu_add_buffer_to_global_list(bo); -- cgit v1.2.3