diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_object.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 55 |
1 files changed, 35 insertions, 20 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index b545f614628c..dcc6af97f59d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | |||
@@ -549,30 +549,45 @@ void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, | |||
549 | int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo) | 549 | int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo) |
550 | { | 550 | { |
551 | struct amdgpu_device *adev; | 551 | struct amdgpu_device *adev; |
552 | struct amdgpu_bo *rbo; | 552 | struct amdgpu_bo *abo; |
553 | unsigned long offset, size; | 553 | unsigned long offset, size, lpfn; |
554 | int r; | 554 | int i, r; |
555 | 555 | ||
556 | if (!amdgpu_ttm_bo_is_amdgpu_bo(bo)) | 556 | if (!amdgpu_ttm_bo_is_amdgpu_bo(bo)) |
557 | return 0; | 557 | return 0; |
558 | rbo = container_of(bo, struct amdgpu_bo, tbo); | 558 | |
559 | adev = rbo->adev; | 559 | abo = container_of(bo, struct amdgpu_bo, tbo); |
560 | if (bo->mem.mem_type == TTM_PL_VRAM) { | 560 | adev = abo->adev; |
561 | size = bo->mem.num_pages << PAGE_SHIFT; | 561 | if (bo->mem.mem_type != TTM_PL_VRAM) |
562 | offset = bo->mem.start << PAGE_SHIFT; | 562 | return 0; |
563 | if ((offset + size) > adev->mc.visible_vram_size) { | 563 | |
564 | /* hurrah the memory is not visible ! */ | 564 | size = bo->mem.num_pages << PAGE_SHIFT; |
565 | amdgpu_ttm_placement_from_domain(rbo, AMDGPU_GEM_DOMAIN_VRAM); | 565 | offset = bo->mem.start << PAGE_SHIFT; |
566 | rbo->placements[0].lpfn = adev->mc.visible_vram_size >> PAGE_SHIFT; | 566 | if ((offset + size) <= adev->mc.visible_vram_size) |
567 | r = ttm_bo_validate(bo, &rbo->placement, false, false); | 567 | return 0; |
568 | if (unlikely(r != 0)) | 568 | |
569 | return r; | 569 | /* hurrah the memory is not visible ! */ |
570 | offset = bo->mem.start << PAGE_SHIFT; | 570 | amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_VRAM); |
571 | /* this should not happen */ | 571 | lpfn = adev->mc.visible_vram_size >> PAGE_SHIFT; |
572 | if ((offset + size) > adev->mc.visible_vram_size) | 572 | for (i = 0; i < abo->placement.num_placement; i++) { |
573 | return -EINVAL; | 573 | /* Force into visible VRAM */ |
574 | } | 574 | if ((abo->placements[i].flags & TTM_PL_FLAG_VRAM) && |
575 | (!abo->placements[i].lpfn || abo->placements[i].lpfn > lpfn)) | ||
576 | abo->placements[i].lpfn = lpfn; | ||
577 | } | ||
578 | r = ttm_bo_validate(bo, &abo->placement, false, false); | ||
579 | if (unlikely(r == -ENOMEM)) { | ||
580 | amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_GTT); | ||
581 | return ttm_bo_validate(bo, &abo->placement, false, false); | ||
582 | } else if (unlikely(r != 0)) { | ||
583 | return r; | ||
575 | } | 584 | } |
585 | |||
586 | offset = bo->mem.start << PAGE_SHIFT; | ||
587 | /* this should never happen */ | ||
588 | if ((offset + size) > adev->mc.visible_vram_size) | ||
589 | return -EINVAL; | ||
590 | |||
576 | return 0; | 591 | return 0; |
577 | } | 592 | } |
578 | 593 | ||