diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_ttm.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_ttm.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index 8624979afb65..d02aa1d0f588 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c | |||
@@ -196,9 +196,32 @@ static void radeon_evict_flags(struct ttm_buffer_object *bo, | |||
196 | rbo = container_of(bo, struct radeon_bo, tbo); | 196 | rbo = container_of(bo, struct radeon_bo, tbo); |
197 | switch (bo->mem.mem_type) { | 197 | switch (bo->mem.mem_type) { |
198 | case TTM_PL_VRAM: | 198 | case TTM_PL_VRAM: |
199 | if (rbo->rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready == false) | 199 | if (rbo->rdev->ring[radeon_copy_ring_index(rbo->rdev)].ready == false) |
200 | radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_CPU); | 200 | radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_CPU); |
201 | else | 201 | else if (rbo->rdev->mc.visible_vram_size < rbo->rdev->mc.real_vram_size && |
202 | bo->mem.start < (rbo->rdev->mc.visible_vram_size >> PAGE_SHIFT)) { | ||
203 | unsigned fpfn = rbo->rdev->mc.visible_vram_size >> PAGE_SHIFT; | ||
204 | int i; | ||
205 | |||
206 | /* Try evicting to the CPU inaccessible part of VRAM | ||
207 | * first, but only set GTT as busy placement, so this | ||
208 | * BO will be evicted to GTT rather than causing other | ||
209 | * BOs to be evicted from VRAM | ||
210 | */ | ||
211 | radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_VRAM | | ||
212 | RADEON_GEM_DOMAIN_GTT); | ||
213 | rbo->placement.num_busy_placement = 0; | ||
214 | for (i = 0; i < rbo->placement.num_placement; i++) { | ||
215 | if (rbo->placements[i].flags & TTM_PL_FLAG_VRAM) { | ||
216 | if (rbo->placements[0].fpfn < fpfn) | ||
217 | rbo->placements[0].fpfn = fpfn; | ||
218 | } else { | ||
219 | rbo->placement.busy_placement = | ||
220 | &rbo->placements[i]; | ||
221 | rbo->placement.num_busy_placement = 1; | ||
222 | } | ||
223 | } | ||
224 | } else | ||
202 | radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT); | 225 | radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT); |
203 | break; | 226 | break; |
204 | case TTM_PL_TT: | 227 | case TTM_PL_TT: |