diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 8b2c294f6f79..1efe1cba7e11 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | |||
@@ -824,20 +824,39 @@ bool amdgpu_ttm_is_bound(struct ttm_tt *ttm) | |||
824 | 824 | ||
825 | int amdgpu_ttm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *bo_mem) | 825 | int amdgpu_ttm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *bo_mem) |
826 | { | 826 | { |
827 | struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev); | ||
827 | struct ttm_tt *ttm = bo->ttm; | 828 | struct ttm_tt *ttm = bo->ttm; |
829 | struct ttm_mem_reg tmp; | ||
830 | |||
831 | struct ttm_placement placement; | ||
832 | struct ttm_place placements; | ||
828 | int r; | 833 | int r; |
829 | 834 | ||
830 | if (!ttm || amdgpu_ttm_is_bound(ttm)) | 835 | if (!ttm || amdgpu_ttm_is_bound(ttm)) |
831 | return 0; | 836 | return 0; |
832 | 837 | ||
833 | r = amdgpu_gtt_mgr_alloc(&bo->bdev->man[TTM_PL_TT], bo, | 838 | tmp = bo->mem; |
834 | NULL, bo_mem); | 839 | tmp.mm_node = NULL; |
835 | if (r) { | 840 | placement.num_placement = 1; |
836 | DRM_ERROR("Failed to allocate GTT address space (%d)\n", r); | 841 | placement.placement = &placements; |
842 | placement.num_busy_placement = 1; | ||
843 | placement.busy_placement = &placements; | ||
844 | placements.fpfn = 0; | ||
845 | placements.lpfn = adev->mc.gart_size >> PAGE_SHIFT; | ||
846 | placements.flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT; | ||
847 | |||
848 | r = ttm_bo_mem_space(bo, &placement, &tmp, true, false); | ||
849 | if (unlikely(r)) | ||
837 | return r; | 850 | return r; |
838 | } | ||
839 | 851 | ||
840 | return amdgpu_ttm_do_bind(ttm, bo_mem); | 852 | r = ttm_bo_move_ttm(bo, true, false, &tmp); |
853 | if (unlikely(r)) | ||
854 | ttm_bo_mem_put(bo, &tmp); | ||
855 | else | ||
856 | bo->offset = (bo->mem.start << PAGE_SHIFT) + | ||
857 | bo->bdev->man[bo->mem.mem_type].gpu_offset; | ||
858 | |||
859 | return r; | ||
841 | } | 860 | } |
842 | 861 | ||
843 | int amdgpu_ttm_recover_gart(struct amdgpu_device *adev) | 862 | int amdgpu_ttm_recover_gart(struct amdgpu_device *adev) |