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>

authored by Alex Deucher and committed by Dave Airlie 268b2510 2f5993cc

+25 -23
+1 -1
drivers/gpu/drm/radeon/evergreen_blit_kms.c
··· 459 obj_size += evergreen_ps_size * 4; 460 obj_size = ALIGN(obj_size, 256); 461 462 - r = radeon_bo_create(rdev, NULL, obj_size, true, RADEON_GEM_DOMAIN_VRAM, 463 &rdev->r600_blit.shader_obj); 464 if (r) { 465 DRM_ERROR("evergreen failed to allocate shader\n");
··· 459 obj_size += evergreen_ps_size * 4; 460 obj_size = ALIGN(obj_size, 256); 461 462 + r = radeon_bo_create(rdev, NULL, obj_size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, 463 &rdev->r600_blit.shader_obj); 464 if (r) { 465 DRM_ERROR("evergreen failed to allocate shader\n");
+1 -1
drivers/gpu/drm/radeon/r600.c
··· 2718 /* Allocate ring buffer */ 2719 if (rdev->ih.ring_obj == NULL) { 2720 r = radeon_bo_create(rdev, NULL, rdev->ih.ring_size, 2721 - true, 2722 RADEON_GEM_DOMAIN_GTT, 2723 &rdev->ih.ring_obj); 2724 if (r) {
··· 2718 /* Allocate ring buffer */ 2719 if (rdev->ih.ring_obj == NULL) { 2720 r = radeon_bo_create(rdev, NULL, rdev->ih.ring_size, 2721 + PAGE_SIZE, true, 2722 RADEON_GEM_DOMAIN_GTT, 2723 &rdev->ih.ring_obj); 2724 if (r) {
+1 -1
drivers/gpu/drm/radeon/r600_blit_kms.c
··· 501 obj_size += r6xx_ps_size * 4; 502 obj_size = ALIGN(obj_size, 256); 503 504 - r = radeon_bo_create(rdev, NULL, obj_size, true, RADEON_GEM_DOMAIN_VRAM, 505 &rdev->r600_blit.shader_obj); 506 if (r) { 507 DRM_ERROR("r600 failed to allocate shader\n");
··· 501 obj_size += r6xx_ps_size * 4; 502 obj_size = ALIGN(obj_size, 256); 503 504 + r = radeon_bo_create(rdev, NULL, obj_size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, 505 &rdev->r600_blit.shader_obj); 506 if (r) { 507 DRM_ERROR("r600 failed to allocate shader\n");
+2 -2
drivers/gpu/drm/radeon/radeon_benchmark.c
··· 41 42 size = bsize; 43 n = 1024; 44 - r = radeon_bo_create(rdev, NULL, size, true, sdomain, &sobj); 45 if (r) { 46 goto out_cleanup; 47 } ··· 53 if (r) { 54 goto out_cleanup; 55 } 56 - r = radeon_bo_create(rdev, NULL, size, true, ddomain, &dobj); 57 if (r) { 58 goto out_cleanup; 59 }
··· 41 42 size = bsize; 43 n = 1024; 44 + r = radeon_bo_create(rdev, NULL, size, PAGE_SIZE, true, sdomain, &sobj); 45 if (r) { 46 goto out_cleanup; 47 } ··· 53 if (r) { 54 goto out_cleanup; 55 } 56 + r = radeon_bo_create(rdev, NULL, size, PAGE_SIZE, true, ddomain, &dobj); 57 if (r) { 58 goto out_cleanup; 59 }
+1 -1
drivers/gpu/drm/radeon/radeon_device.c
··· 180 int r; 181 182 if (rdev->wb.wb_obj == NULL) { 183 - r = radeon_bo_create(rdev, NULL, RADEON_GPU_PAGE_SIZE, true, 184 RADEON_GEM_DOMAIN_GTT, &rdev->wb.wb_obj); 185 if (r) { 186 dev_warn(rdev->dev, "(%d) create WB bo failed\n", r);
··· 180 int r; 181 182 if (rdev->wb.wb_obj == NULL) { 183 + r = radeon_bo_create(rdev, NULL, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true, 184 RADEON_GEM_DOMAIN_GTT, &rdev->wb.wb_obj); 185 if (r) { 186 dev_warn(rdev->dev, "(%d) create WB bo failed\n", r);
+2 -2
drivers/gpu/drm/radeon/radeon_gart.c
··· 79 80 if (rdev->gart.table.vram.robj == NULL) { 81 r = radeon_bo_create(rdev, NULL, rdev->gart.table_size, 82 - true, RADEON_GEM_DOMAIN_VRAM, 83 - &rdev->gart.table.vram.robj); 84 if (r) { 85 return r; 86 }
··· 79 80 if (rdev->gart.table.vram.robj == NULL) { 81 r = radeon_bo_create(rdev, NULL, rdev->gart.table_size, 82 + PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, 83 + &rdev->gart.table.vram.robj); 84 if (r) { 85 return r; 86 }
+1 -1
drivers/gpu/drm/radeon/radeon_gem.c
··· 67 if (alignment < PAGE_SIZE) { 68 alignment = PAGE_SIZE; 69 } 70 - r = radeon_bo_create(rdev, gobj, size, kernel, initial_domain, &robj); 71 if (r) { 72 if (r != -ERESTARTSYS) 73 DRM_ERROR("Failed to allocate GEM object (%d, %d, %u, %d)\n",
··· 67 if (alignment < PAGE_SIZE) { 68 alignment = PAGE_SIZE; 69 } 70 + r = radeon_bo_create(rdev, gobj, size, alignment, kernel, initial_domain, &robj); 71 if (r) { 72 if (r != -ERESTARTSYS) 73 DRM_ERROR("Failed to allocate GEM object (%d, %d, %u, %d)\n",
+4 -3
drivers/gpu/drm/radeon/radeon_object.c
··· 86 } 87 88 int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj, 89 - unsigned long size, bool kernel, u32 domain, 90 - struct radeon_bo **bo_ptr) 91 { 92 struct radeon_bo *bo; 93 enum ttm_bo_type type; 94 int r; 95 96 if (unlikely(rdev->mman.bdev.dev_mapping == NULL)) { ··· 116 /* Kernel allocation are uninterruptible */ 117 mutex_lock(&rdev->vram_mutex); 118 r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type, 119 - &bo->placement, 0, 0, !kernel, NULL, size, 120 &radeon_ttm_bo_destroy); 121 mutex_unlock(&rdev->vram_mutex); 122 if (unlikely(r != 0)) {
··· 86 } 87 88 int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj, 89 + unsigned long size, int byte_align, bool kernel, u32 domain, 90 + struct radeon_bo **bo_ptr) 91 { 92 struct radeon_bo *bo; 93 enum ttm_bo_type type; 94 + int page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT; 95 int r; 96 97 if (unlikely(rdev->mman.bdev.dev_mapping == NULL)) { ··· 115 /* Kernel allocation are uninterruptible */ 116 mutex_lock(&rdev->vram_mutex); 117 r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type, 118 + &bo->placement, page_align, 0, !kernel, NULL, size, 119 &radeon_ttm_bo_destroy); 120 mutex_unlock(&rdev->vram_mutex); 121 if (unlikely(r != 0)) {
+4 -3
drivers/gpu/drm/radeon/radeon_object.h
··· 137 } 138 139 extern int radeon_bo_create(struct radeon_device *rdev, 140 - struct drm_gem_object *gobj, unsigned long size, 141 - bool kernel, u32 domain, 142 - struct radeon_bo **bo_ptr); 143 extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr); 144 extern void radeon_bo_kunmap(struct radeon_bo *bo); 145 extern void radeon_bo_unref(struct radeon_bo **bo);
··· 137 } 138 139 extern int radeon_bo_create(struct radeon_device *rdev, 140 + struct drm_gem_object *gobj, unsigned long size, 141 + int byte_align, 142 + bool kernel, u32 domain, 143 + struct radeon_bo **bo_ptr); 144 extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr); 145 extern void radeon_bo_kunmap(struct radeon_bo *bo); 146 extern void radeon_bo_unref(struct radeon_bo **bo);
+3 -3
drivers/gpu/drm/radeon/radeon_ring.c
··· 176 INIT_LIST_HEAD(&rdev->ib_pool.bogus_ib); 177 /* Allocate 1M object buffer */ 178 r = radeon_bo_create(rdev, NULL, RADEON_IB_POOL_SIZE*64*1024, 179 - true, RADEON_GEM_DOMAIN_GTT, 180 - &rdev->ib_pool.robj); 181 if (r) { 182 DRM_ERROR("radeon: failed to ib pool (%d).\n", r); 183 return r; ··· 332 rdev->cp.ring_size = ring_size; 333 /* Allocate ring buffer */ 334 if (rdev->cp.ring_obj == NULL) { 335 - r = radeon_bo_create(rdev, NULL, rdev->cp.ring_size, true, 336 RADEON_GEM_DOMAIN_GTT, 337 &rdev->cp.ring_obj); 338 if (r) {
··· 176 INIT_LIST_HEAD(&rdev->ib_pool.bogus_ib); 177 /* Allocate 1M object buffer */ 178 r = radeon_bo_create(rdev, NULL, RADEON_IB_POOL_SIZE*64*1024, 179 + PAGE_SIZE, true, RADEON_GEM_DOMAIN_GTT, 180 + &rdev->ib_pool.robj); 181 if (r) { 182 DRM_ERROR("radeon: failed to ib pool (%d).\n", r); 183 return r; ··· 332 rdev->cp.ring_size = ring_size; 333 /* Allocate ring buffer */ 334 if (rdev->cp.ring_obj == NULL) { 335 + r = radeon_bo_create(rdev, NULL, rdev->cp.ring_size, PAGE_SIZE, true, 336 RADEON_GEM_DOMAIN_GTT, 337 &rdev->cp.ring_obj); 338 if (r) {
+2 -2
drivers/gpu/drm/radeon/radeon_test.c
··· 52 goto out_cleanup; 53 } 54 55 - r = radeon_bo_create(rdev, NULL, size, true, RADEON_GEM_DOMAIN_VRAM, 56 &vram_obj); 57 if (r) { 58 DRM_ERROR("Failed to create VRAM object\n"); ··· 71 void **gtt_start, **gtt_end; 72 void **vram_start, **vram_end; 73 74 - r = radeon_bo_create(rdev, NULL, size, true, 75 RADEON_GEM_DOMAIN_GTT, gtt_obj + i); 76 if (r) { 77 DRM_ERROR("Failed to create GTT object %d\n", i);
··· 52 goto out_cleanup; 53 } 54 55 + r = radeon_bo_create(rdev, NULL, size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, 56 &vram_obj); 57 if (r) { 58 DRM_ERROR("Failed to create VRAM object\n"); ··· 71 void **gtt_start, **gtt_end; 72 void **vram_start, **vram_end; 73 74 + r = radeon_bo_create(rdev, NULL, size, PAGE_SIZE, true, 75 RADEON_GEM_DOMAIN_GTT, gtt_obj + i); 76 if (r) { 77 DRM_ERROR("Failed to create GTT object %d\n", i);
+1 -1
drivers/gpu/drm/radeon/radeon_ttm.c
··· 529 DRM_ERROR("Failed initializing VRAM heap.\n"); 530 return r; 531 } 532 - r = radeon_bo_create(rdev, NULL, 256 * 1024, true, 533 RADEON_GEM_DOMAIN_VRAM, 534 &rdev->stollen_vga_memory); 535 if (r) {
··· 529 DRM_ERROR("Failed initializing VRAM heap.\n"); 530 return r; 531 } 532 + r = radeon_bo_create(rdev, NULL, 256 * 1024, PAGE_SIZE, true, 533 RADEON_GEM_DOMAIN_VRAM, 534 &rdev->stollen_vga_memory); 535 if (r) {
+2 -2
drivers/gpu/drm/radeon/rv770.c
··· 915 916 if (rdev->vram_scratch.robj == NULL) { 917 r = radeon_bo_create(rdev, NULL, RADEON_GPU_PAGE_SIZE, 918 - true, RADEON_GEM_DOMAIN_VRAM, 919 - &rdev->vram_scratch.robj); 920 if (r) { 921 return r; 922 }
··· 915 916 if (rdev->vram_scratch.robj == NULL) { 917 r = radeon_bo_create(rdev, NULL, RADEON_GPU_PAGE_SIZE, 918 + PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, 919 + &rdev->vram_scratch.robj); 920 if (r) { 921 return r; 922 }