else
                        places[c].flags |= TTM_PL_FLAG_TOPDOWN;
 
-               if (flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS)
+               if (abo->tbo.type == ttm_bo_type_kernel &&
+                   flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS)
                        places[c].flags |= TTM_PL_FLAG_CONTIGUOUS;
+
                c++;
        }
 
                if (!bo->placements[i].lpfn ||
                    (lpfn && lpfn < bo->placements[i].lpfn))
                        bo->placements[i].lpfn = lpfn;
+
+               if (bo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS &&
+                   bo->placements[i].mem_type == TTM_PL_VRAM)
+                       bo->placements[i].flags |= TTM_PL_FLAG_CONTIGUOUS;
        }
 
        r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
 
 {
        struct amdgpu_vram_mgr *mgr = to_vram_mgr(man);
        struct amdgpu_device *adev = to_amdgpu_device(mgr);
+       struct amdgpu_bo *bo = ttm_to_amdgpu_bo(tbo);
        u64 vis_usage = 0, max_bytes, min_block_size;
        struct amdgpu_vram_mgr_resource *vres;
        u64 size, remaining_size, lpfn, fpfn;
        if (tbo->type != ttm_bo_type_kernel)
                max_bytes -= AMDGPU_VM_RESERVED_VRAM;
 
-       if (place->flags & TTM_PL_FLAG_CONTIGUOUS) {
+       if (bo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS) {
                pages_per_block = ~0ul;
        } else {
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
                /* default to 2MB */
                pages_per_block = 2UL << (20UL - PAGE_SHIFT);
 #endif
-               pages_per_block = max_t(uint32_t, pages_per_block,
+               pages_per_block = max_t(u32, pages_per_block,
                                        tbo->page_alignment);
        }
 
        if (place->flags & TTM_PL_FLAG_TOPDOWN)
                vres->flags |= DRM_BUDDY_TOPDOWN_ALLOCATION;
 
-       if (place->flags & TTM_PL_FLAG_CONTIGUOUS)
+       if (bo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS)
                vres->flags |= DRM_BUDDY_CONTIGUOUS_ALLOCATION;
 
        if (fpfn || lpfn != mgr->mm.size)
                else
                        min_block_size = mgr->default_page_size;
 
-               BUG_ON(min_block_size < mm->chunk_size);
-
                /* Limit maximum size to 2GiB due to SG table limitations */
                size = min(remaining_size, 2ULL << 30);
 
                if ((size >= (u64)pages_per_block << PAGE_SHIFT) &&
-                               !(size & (((u64)pages_per_block << PAGE_SHIFT) - 1)))
+                   !(size & (((u64)pages_per_block << PAGE_SHIFT) - 1)))
                        min_block_size = (u64)pages_per_block << PAGE_SHIFT;
 
+               BUG_ON(min_block_size < mm->chunk_size);
+
                r = drm_buddy_alloc_blocks(mm, fpfn,
                                           lpfn,
                                           size,
                                           min_block_size,
                                           &vres->blocks,
                                           vres->flags);
+
+               if (unlikely(r == -ENOSPC) && pages_per_block == ~0ul &&
+                   !(place->flags & TTM_PL_FLAG_CONTIGUOUS)) {
+                       vres->flags &= ~DRM_BUDDY_CONTIGUOUS_ALLOCATION;
+                       pages_per_block = max_t(u32, 2UL << (20UL - PAGE_SHIFT),
+                                               tbo->page_alignment);
+
+                       continue;
+               }
+
                if (unlikely(r))
                        goto error_free_blocks;