forked from Minki/linux
drm/radeon/kms: fix alignment when allocating buffers
We were previously dropping alignment requests on the floor when allocating buffers so we always ended up page aligned. Certain tiling modes on 6xx+ require larger alignment which wasn't happening before. Signed-off-by: Alex Deucher <alexdeucher@gmail.com> Cc: Jerome Glisse <j.glisse@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
2f5993cca6
commit
268b2510de
@ -459,7 +459,7 @@ int evergreen_blit_init(struct radeon_device *rdev)
|
|||||||
obj_size += evergreen_ps_size * 4;
|
obj_size += evergreen_ps_size * 4;
|
||||||
obj_size = ALIGN(obj_size, 256);
|
obj_size = ALIGN(obj_size, 256);
|
||||||
|
|
||||||
r = radeon_bo_create(rdev, NULL, obj_size, true, RADEON_GEM_DOMAIN_VRAM,
|
r = radeon_bo_create(rdev, NULL, obj_size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
|
||||||
&rdev->r600_blit.shader_obj);
|
&rdev->r600_blit.shader_obj);
|
||||||
if (r) {
|
if (r) {
|
||||||
DRM_ERROR("evergreen failed to allocate shader\n");
|
DRM_ERROR("evergreen failed to allocate shader\n");
|
||||||
|
@ -2718,7 +2718,7 @@ static int r600_ih_ring_alloc(struct radeon_device *rdev)
|
|||||||
/* Allocate ring buffer */
|
/* Allocate ring buffer */
|
||||||
if (rdev->ih.ring_obj == NULL) {
|
if (rdev->ih.ring_obj == NULL) {
|
||||||
r = radeon_bo_create(rdev, NULL, rdev->ih.ring_size,
|
r = radeon_bo_create(rdev, NULL, rdev->ih.ring_size,
|
||||||
true,
|
PAGE_SIZE, true,
|
||||||
RADEON_GEM_DOMAIN_GTT,
|
RADEON_GEM_DOMAIN_GTT,
|
||||||
&rdev->ih.ring_obj);
|
&rdev->ih.ring_obj);
|
||||||
if (r) {
|
if (r) {
|
||||||
|
@ -501,7 +501,7 @@ int r600_blit_init(struct radeon_device *rdev)
|
|||||||
obj_size += r6xx_ps_size * 4;
|
obj_size += r6xx_ps_size * 4;
|
||||||
obj_size = ALIGN(obj_size, 256);
|
obj_size = ALIGN(obj_size, 256);
|
||||||
|
|
||||||
r = radeon_bo_create(rdev, NULL, obj_size, true, RADEON_GEM_DOMAIN_VRAM,
|
r = radeon_bo_create(rdev, NULL, obj_size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
|
||||||
&rdev->r600_blit.shader_obj);
|
&rdev->r600_blit.shader_obj);
|
||||||
if (r) {
|
if (r) {
|
||||||
DRM_ERROR("r600 failed to allocate shader\n");
|
DRM_ERROR("r600 failed to allocate shader\n");
|
||||||
|
@ -41,7 +41,7 @@ void radeon_benchmark_move(struct radeon_device *rdev, unsigned bsize,
|
|||||||
|
|
||||||
size = bsize;
|
size = bsize;
|
||||||
n = 1024;
|
n = 1024;
|
||||||
r = radeon_bo_create(rdev, NULL, size, true, sdomain, &sobj);
|
r = radeon_bo_create(rdev, NULL, size, PAGE_SIZE, true, sdomain, &sobj);
|
||||||
if (r) {
|
if (r) {
|
||||||
goto out_cleanup;
|
goto out_cleanup;
|
||||||
}
|
}
|
||||||
@ -53,7 +53,7 @@ void radeon_benchmark_move(struct radeon_device *rdev, unsigned bsize,
|
|||||||
if (r) {
|
if (r) {
|
||||||
goto out_cleanup;
|
goto out_cleanup;
|
||||||
}
|
}
|
||||||
r = radeon_bo_create(rdev, NULL, size, true, ddomain, &dobj);
|
r = radeon_bo_create(rdev, NULL, size, PAGE_SIZE, true, ddomain, &dobj);
|
||||||
if (r) {
|
if (r) {
|
||||||
goto out_cleanup;
|
goto out_cleanup;
|
||||||
}
|
}
|
||||||
|
@ -180,7 +180,7 @@ int radeon_wb_init(struct radeon_device *rdev)
|
|||||||
int r;
|
int r;
|
||||||
|
|
||||||
if (rdev->wb.wb_obj == NULL) {
|
if (rdev->wb.wb_obj == NULL) {
|
||||||
r = radeon_bo_create(rdev, NULL, RADEON_GPU_PAGE_SIZE, true,
|
r = radeon_bo_create(rdev, NULL, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true,
|
||||||
RADEON_GEM_DOMAIN_GTT, &rdev->wb.wb_obj);
|
RADEON_GEM_DOMAIN_GTT, &rdev->wb.wb_obj);
|
||||||
if (r) {
|
if (r) {
|
||||||
dev_warn(rdev->dev, "(%d) create WB bo failed\n", r);
|
dev_warn(rdev->dev, "(%d) create WB bo failed\n", r);
|
||||||
|
@ -79,8 +79,8 @@ int radeon_gart_table_vram_alloc(struct radeon_device *rdev)
|
|||||||
|
|
||||||
if (rdev->gart.table.vram.robj == NULL) {
|
if (rdev->gart.table.vram.robj == NULL) {
|
||||||
r = radeon_bo_create(rdev, NULL, rdev->gart.table_size,
|
r = radeon_bo_create(rdev, NULL, rdev->gart.table_size,
|
||||||
true, RADEON_GEM_DOMAIN_VRAM,
|
PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
|
||||||
&rdev->gart.table.vram.robj);
|
&rdev->gart.table.vram.robj);
|
||||||
if (r) {
|
if (r) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,7 @@ int radeon_gem_object_create(struct radeon_device *rdev, int size,
|
|||||||
if (alignment < PAGE_SIZE) {
|
if (alignment < PAGE_SIZE) {
|
||||||
alignment = PAGE_SIZE;
|
alignment = PAGE_SIZE;
|
||||||
}
|
}
|
||||||
r = radeon_bo_create(rdev, gobj, size, kernel, initial_domain, &robj);
|
r = radeon_bo_create(rdev, gobj, size, alignment, kernel, initial_domain, &robj);
|
||||||
if (r) {
|
if (r) {
|
||||||
if (r != -ERESTARTSYS)
|
if (r != -ERESTARTSYS)
|
||||||
DRM_ERROR("Failed to allocate GEM object (%d, %d, %u, %d)\n",
|
DRM_ERROR("Failed to allocate GEM object (%d, %d, %u, %d)\n",
|
||||||
|
@ -86,11 +86,12 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,
|
int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,
|
||||||
unsigned long size, bool kernel, u32 domain,
|
unsigned long size, int byte_align, bool kernel, u32 domain,
|
||||||
struct radeon_bo **bo_ptr)
|
struct radeon_bo **bo_ptr)
|
||||||
{
|
{
|
||||||
struct radeon_bo *bo;
|
struct radeon_bo *bo;
|
||||||
enum ttm_bo_type type;
|
enum ttm_bo_type type;
|
||||||
|
int page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
if (unlikely(rdev->mman.bdev.dev_mapping == NULL)) {
|
if (unlikely(rdev->mman.bdev.dev_mapping == NULL)) {
|
||||||
@ -115,7 +116,7 @@ retry:
|
|||||||
/* Kernel allocation are uninterruptible */
|
/* Kernel allocation are uninterruptible */
|
||||||
mutex_lock(&rdev->vram_mutex);
|
mutex_lock(&rdev->vram_mutex);
|
||||||
r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,
|
r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,
|
||||||
&bo->placement, 0, 0, !kernel, NULL, size,
|
&bo->placement, page_align, 0, !kernel, NULL, size,
|
||||||
&radeon_ttm_bo_destroy);
|
&radeon_ttm_bo_destroy);
|
||||||
mutex_unlock(&rdev->vram_mutex);
|
mutex_unlock(&rdev->vram_mutex);
|
||||||
if (unlikely(r != 0)) {
|
if (unlikely(r != 0)) {
|
||||||
|
@ -137,9 +137,10 @@ static inline int radeon_bo_wait(struct radeon_bo *bo, u32 *mem_type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
extern int radeon_bo_create(struct radeon_device *rdev,
|
extern int radeon_bo_create(struct radeon_device *rdev,
|
||||||
struct drm_gem_object *gobj, unsigned long size,
|
struct drm_gem_object *gobj, unsigned long size,
|
||||||
bool kernel, u32 domain,
|
int byte_align,
|
||||||
struct radeon_bo **bo_ptr);
|
bool kernel, u32 domain,
|
||||||
|
struct radeon_bo **bo_ptr);
|
||||||
extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr);
|
extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr);
|
||||||
extern void radeon_bo_kunmap(struct radeon_bo *bo);
|
extern void radeon_bo_kunmap(struct radeon_bo *bo);
|
||||||
extern void radeon_bo_unref(struct radeon_bo **bo);
|
extern void radeon_bo_unref(struct radeon_bo **bo);
|
||||||
|
@ -176,8 +176,8 @@ int radeon_ib_pool_init(struct radeon_device *rdev)
|
|||||||
INIT_LIST_HEAD(&rdev->ib_pool.bogus_ib);
|
INIT_LIST_HEAD(&rdev->ib_pool.bogus_ib);
|
||||||
/* Allocate 1M object buffer */
|
/* Allocate 1M object buffer */
|
||||||
r = radeon_bo_create(rdev, NULL, RADEON_IB_POOL_SIZE*64*1024,
|
r = radeon_bo_create(rdev, NULL, RADEON_IB_POOL_SIZE*64*1024,
|
||||||
true, RADEON_GEM_DOMAIN_GTT,
|
PAGE_SIZE, true, RADEON_GEM_DOMAIN_GTT,
|
||||||
&rdev->ib_pool.robj);
|
&rdev->ib_pool.robj);
|
||||||
if (r) {
|
if (r) {
|
||||||
DRM_ERROR("radeon: failed to ib pool (%d).\n", r);
|
DRM_ERROR("radeon: failed to ib pool (%d).\n", r);
|
||||||
return r;
|
return r;
|
||||||
@ -332,7 +332,7 @@ int radeon_ring_init(struct radeon_device *rdev, unsigned ring_size)
|
|||||||
rdev->cp.ring_size = ring_size;
|
rdev->cp.ring_size = ring_size;
|
||||||
/* Allocate ring buffer */
|
/* Allocate ring buffer */
|
||||||
if (rdev->cp.ring_obj == NULL) {
|
if (rdev->cp.ring_obj == NULL) {
|
||||||
r = radeon_bo_create(rdev, NULL, rdev->cp.ring_size, true,
|
r = radeon_bo_create(rdev, NULL, rdev->cp.ring_size, PAGE_SIZE, true,
|
||||||
RADEON_GEM_DOMAIN_GTT,
|
RADEON_GEM_DOMAIN_GTT,
|
||||||
&rdev->cp.ring_obj);
|
&rdev->cp.ring_obj);
|
||||||
if (r) {
|
if (r) {
|
||||||
|
@ -52,7 +52,7 @@ void radeon_test_moves(struct radeon_device *rdev)
|
|||||||
goto out_cleanup;
|
goto out_cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = radeon_bo_create(rdev, NULL, size, true, RADEON_GEM_DOMAIN_VRAM,
|
r = radeon_bo_create(rdev, NULL, size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
|
||||||
&vram_obj);
|
&vram_obj);
|
||||||
if (r) {
|
if (r) {
|
||||||
DRM_ERROR("Failed to create VRAM object\n");
|
DRM_ERROR("Failed to create VRAM object\n");
|
||||||
@ -71,7 +71,7 @@ void radeon_test_moves(struct radeon_device *rdev)
|
|||||||
void **gtt_start, **gtt_end;
|
void **gtt_start, **gtt_end;
|
||||||
void **vram_start, **vram_end;
|
void **vram_start, **vram_end;
|
||||||
|
|
||||||
r = radeon_bo_create(rdev, NULL, size, true,
|
r = radeon_bo_create(rdev, NULL, size, PAGE_SIZE, true,
|
||||||
RADEON_GEM_DOMAIN_GTT, gtt_obj + i);
|
RADEON_GEM_DOMAIN_GTT, gtt_obj + i);
|
||||||
if (r) {
|
if (r) {
|
||||||
DRM_ERROR("Failed to create GTT object %d\n", i);
|
DRM_ERROR("Failed to create GTT object %d\n", i);
|
||||||
|
@ -529,7 +529,7 @@ int radeon_ttm_init(struct radeon_device *rdev)
|
|||||||
DRM_ERROR("Failed initializing VRAM heap.\n");
|
DRM_ERROR("Failed initializing VRAM heap.\n");
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
r = radeon_bo_create(rdev, NULL, 256 * 1024, true,
|
r = radeon_bo_create(rdev, NULL, 256 * 1024, PAGE_SIZE, true,
|
||||||
RADEON_GEM_DOMAIN_VRAM,
|
RADEON_GEM_DOMAIN_VRAM,
|
||||||
&rdev->stollen_vga_memory);
|
&rdev->stollen_vga_memory);
|
||||||
if (r) {
|
if (r) {
|
||||||
|
@ -915,8 +915,8 @@ static int rv770_vram_scratch_init(struct radeon_device *rdev)
|
|||||||
|
|
||||||
if (rdev->vram_scratch.robj == NULL) {
|
if (rdev->vram_scratch.robj == NULL) {
|
||||||
r = radeon_bo_create(rdev, NULL, RADEON_GPU_PAGE_SIZE,
|
r = radeon_bo_create(rdev, NULL, RADEON_GPU_PAGE_SIZE,
|
||||||
true, RADEON_GEM_DOMAIN_VRAM,
|
PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
|
||||||
&rdev->vram_scratch.robj);
|
&rdev->vram_scratch.robj);
|
||||||
if (r) {
|
if (r) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user