diff options
author | Christian König <christian.koenig@amd.com> | 2017-06-30 04:41:07 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-07-14 11:05:59 -0400 |
commit | 98a7f88ce9a9ed26cea939558f33e3d483cfb4f0 (patch) | |
tree | 9a7b8c40e96b9e8ec7128cc66b2f369f30c39bfe /drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | |
parent | 92c60d9cf6636fdf740ebc98af0d68426f07b19b (diff) |
drm/amdgpu: bind BOs with GTT space allocated directly v2
This avoids binding them later on.
v2: fix typo in function name
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Acked-by: Felix Kuehling <Felix.Kuehling@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 49 |
1 files changed, 30 insertions, 19 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index e97dfe888d55..7064d31f0be5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | |||
@@ -681,6 +681,31 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm) | |||
681 | sg_free_table(ttm->sg); | 681 | sg_free_table(ttm->sg); |
682 | } | 682 | } |
683 | 683 | ||
684 | static int amdgpu_ttm_do_bind(struct ttm_tt *ttm, struct ttm_mem_reg *mem) | ||
685 | { | ||
686 | struct amdgpu_ttm_tt *gtt = (void *)ttm; | ||
687 | uint64_t flags; | ||
688 | int r; | ||
689 | |||
690 | spin_lock(>t->adev->gtt_list_lock); | ||
691 | flags = amdgpu_ttm_tt_pte_flags(gtt->adev, ttm, mem); | ||
692 | gtt->offset = (u64)mem->start << PAGE_SHIFT; | ||
693 | r = amdgpu_gart_bind(gtt->adev, gtt->offset, ttm->num_pages, | ||
694 | ttm->pages, gtt->ttm.dma_address, flags); | ||
695 | |||
696 | if (r) { | ||
697 | DRM_ERROR("failed to bind %lu pages at 0x%08llX\n", | ||
698 | ttm->num_pages, gtt->offset); | ||
699 | goto error_gart_bind; | ||
700 | } | ||
701 | |||
702 | list_add_tail(>t->list, >t->adev->gtt_list); | ||
703 | error_gart_bind: | ||
704 | spin_unlock(>t->adev->gtt_list_lock); | ||
705 | return r; | ||
706 | |||
707 | } | ||
708 | |||
684 | static int amdgpu_ttm_backend_bind(struct ttm_tt *ttm, | 709 | static int amdgpu_ttm_backend_bind(struct ttm_tt *ttm, |
685 | struct ttm_mem_reg *bo_mem) | 710 | struct ttm_mem_reg *bo_mem) |
686 | { | 711 | { |
@@ -704,7 +729,10 @@ static int amdgpu_ttm_backend_bind(struct ttm_tt *ttm, | |||
704 | bo_mem->mem_type == AMDGPU_PL_OA) | 729 | bo_mem->mem_type == AMDGPU_PL_OA) |
705 | return -EINVAL; | 730 | return -EINVAL; |
706 | 731 | ||
707 | return 0; | 732 | if (amdgpu_gtt_mgr_is_allocated(bo_mem)) |
733 | r = amdgpu_ttm_do_bind(ttm, bo_mem); | ||
734 | |||
735 | return r; | ||
708 | } | 736 | } |
709 | 737 | ||
710 | bool amdgpu_ttm_is_bound(struct ttm_tt *ttm) | 738 | bool amdgpu_ttm_is_bound(struct ttm_tt *ttm) |
@@ -717,8 +745,6 @@ bool amdgpu_ttm_is_bound(struct ttm_tt *ttm) | |||
717 | int amdgpu_ttm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *bo_mem) | 745 | int amdgpu_ttm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *bo_mem) |
718 | { | 746 | { |
719 | struct ttm_tt *ttm = bo->ttm; | 747 | struct ttm_tt *ttm = bo->ttm; |
720 | struct amdgpu_ttm_tt *gtt = (void *)bo->ttm; | ||
721 | uint64_t flags; | ||
722 | int r; | 748 | int r; |
723 | 749 | ||
724 | if (!ttm || amdgpu_ttm_is_bound(ttm)) | 750 | if (!ttm || amdgpu_ttm_is_bound(ttm)) |
@@ -731,22 +757,7 @@ int amdgpu_ttm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *bo_mem) | |||
731 | return r; | 757 | return r; |
732 | } | 758 | } |
733 | 759 | ||
734 | spin_lock(>t->adev->gtt_list_lock); | 760 | return amdgpu_ttm_do_bind(ttm, bo_mem); |
735 | flags = amdgpu_ttm_tt_pte_flags(gtt->adev, ttm, bo_mem); | ||
736 | gtt->offset = (u64)bo_mem->start << PAGE_SHIFT; | ||
737 | r = amdgpu_gart_bind(gtt->adev, gtt->offset, ttm->num_pages, | ||
738 | ttm->pages, gtt->ttm.dma_address, flags); | ||
739 | |||
740 | if (r) { | ||
741 | DRM_ERROR("failed to bind %lu pages at 0x%08llX\n", | ||
742 | ttm->num_pages, gtt->offset); | ||
743 | goto error_gart_bind; | ||
744 | } | ||
745 | |||
746 | list_add_tail(>t->list, >t->adev->gtt_list); | ||
747 | error_gart_bind: | ||
748 | spin_unlock(>t->adev->gtt_list_lock); | ||
749 | return r; | ||
750 | } | 761 | } |
751 | 762 | ||
752 | int amdgpu_ttm_recover_gart(struct amdgpu_device *adev) | 763 | int amdgpu_ttm_recover_gart(struct amdgpu_device *adev) |