diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_object.c | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index 19bec0dbfa38..72705fb40d55 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c | |||
| @@ -699,22 +699,30 @@ int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo) | |||
| 699 | rbo = container_of(bo, struct radeon_bo, tbo); | 699 | rbo = container_of(bo, struct radeon_bo, tbo); |
| 700 | radeon_bo_check_tiling(rbo, 0, 0); | 700 | radeon_bo_check_tiling(rbo, 0, 0); |
| 701 | rdev = rbo->rdev; | 701 | rdev = rbo->rdev; |
| 702 | if (bo->mem.mem_type == TTM_PL_VRAM) { | 702 | if (bo->mem.mem_type != TTM_PL_VRAM) |
| 703 | size = bo->mem.num_pages << PAGE_SHIFT; | 703 | return 0; |
| 704 | offset = bo->mem.start << PAGE_SHIFT; | 704 | |
| 705 | if ((offset + size) > rdev->mc.visible_vram_size) { | 705 | size = bo->mem.num_pages << PAGE_SHIFT; |
| 706 | /* hurrah the memory is not visible ! */ | 706 | offset = bo->mem.start << PAGE_SHIFT; |
| 707 | radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_VRAM); | 707 | if ((offset + size) <= rdev->mc.visible_vram_size) |
| 708 | rbo->placement.lpfn = rdev->mc.visible_vram_size >> PAGE_SHIFT; | 708 | return 0; |
| 709 | r = ttm_bo_validate(bo, &rbo->placement, false, false); | 709 | |
| 710 | if (unlikely(r != 0)) | 710 | /* hurrah the memory is not visible ! */ |
| 711 | return r; | 711 | radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_VRAM); |
| 712 | offset = bo->mem.start << PAGE_SHIFT; | 712 | rbo->placement.lpfn = rdev->mc.visible_vram_size >> PAGE_SHIFT; |
| 713 | /* this should not happen */ | 713 | r = ttm_bo_validate(bo, &rbo->placement, false, false); |
| 714 | if ((offset + size) > rdev->mc.visible_vram_size) | 714 | if (unlikely(r == -ENOMEM)) { |
| 715 | return -EINVAL; | 715 | radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT); |
| 716 | } | 716 | return ttm_bo_validate(bo, &rbo->placement, false, false); |
| 717 | } else if (unlikely(r != 0)) { | ||
| 718 | return r; | ||
| 717 | } | 719 | } |
| 720 | |||
| 721 | offset = bo->mem.start << PAGE_SHIFT; | ||
| 722 | /* this should never happen */ | ||
| 723 | if ((offset + size) > rdev->mc.visible_vram_size) | ||
| 724 | return -EINVAL; | ||
| 725 | |||
| 718 | return 0; | 726 | return 0; |
| 719 | } | 727 | } |
| 720 | 728 | ||
