aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2015-05-21 11:03:46 -0400
committerAlex Deucher <alexander.deucher@amd.com>2015-06-03 21:03:49 -0400
commit5fb1941d0ce70d8ce56b12edcb1a1f2ba07629dd (patch)
treeebbb0ba69831b7395f768562c94a7f7dbef87fe3 /drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
parent564ea7900cffbe2eddb3bcfb09b700ad7942aef4 (diff)
drm/amdgpu: port fault_reserve_notify changes from radeon
Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_object.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.c55
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,
549int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo) 549int 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