diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index d09650c..cf9c8a4 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c @@ -46,7 +46,7 @@ int radeon_gem_object_create(struct radeon_device *rdev, int size, struct drm_gem_object **obj) { struct radeon_bo *robj; - unsigned long max_size; + static unsigned long max_size; int r; *obj = NULL; @@ -55,8 +55,26 @@ int radeon_gem_object_create(struct radeon_device *rdev, int size, alignment = PAGE_SIZE; } - /* maximun bo size is the minimun btw visible vram and gtt size */ - max_size = min(rdev->mc.visible_vram_size, rdev->mc.gtt_size); + if (!max_size) { + struct ttm_mem_type_manager *man; + unsigned vram_size, gtt_size; + unsigned i; + + man = &rdev->mman.bdev.man[TTM_PL_VRAM]; + + vram_size = (u64)man->size << PAGE_SHIFT; + if (rdev->stollen_vga_memory) + vram_size -= radeon_bo_size(rdev->stollen_vga_memory); + vram_size -= size /*radeon_fbdev_total_size(rdev)*/; + + gtt_size = rdev->mc.gtt_size - 4096 - RADEON_IB_POOL_SIZE*64*1024; + for(i = 0; i < RADEON_NUM_RINGS; ++i) + gtt_size -= rdev->ring[i].ring_size; + + /* maximum bo size is the minimum of vram and gtt size */ + max_size = min(vram_size, gtt_size); + } + if (size > max_size) { printk(KERN_WARNING "%s:%d alloc size %dMb bigger than %ldMb limit\n", __func__, __LINE__, size >> 20, max_size >> 20);