diff options
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 22 |
3 files changed, 19 insertions, 11 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 3bd709600a15..ea8ad69fa65d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
| @@ -554,7 +554,7 @@ int amdgpu_gart_table_vram_pin(struct amdgpu_device *adev); | |||
| 554 | void amdgpu_gart_table_vram_unpin(struct amdgpu_device *adev); | 554 | void amdgpu_gart_table_vram_unpin(struct amdgpu_device *adev); |
| 555 | int amdgpu_gart_init(struct amdgpu_device *adev); | 555 | int amdgpu_gart_init(struct amdgpu_device *adev); |
| 556 | void amdgpu_gart_fini(struct amdgpu_device *adev); | 556 | void amdgpu_gart_fini(struct amdgpu_device *adev); |
| 557 | void amdgpu_gart_unbind(struct amdgpu_device *adev, uint64_t offset, | 557 | int amdgpu_gart_unbind(struct amdgpu_device *adev, uint64_t offset, |
| 558 | int pages); | 558 | int pages); |
| 559 | int amdgpu_gart_bind(struct amdgpu_device *adev, uint64_t offset, | 559 | int amdgpu_gart_bind(struct amdgpu_device *adev, uint64_t offset, |
| 560 | int pages, struct page **pagelist, | 560 | int pages, struct page **pagelist, |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c index 902e6015abca..a57abc1a25fb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c | |||
| @@ -224,8 +224,9 @@ void amdgpu_gart_table_vram_free(struct amdgpu_device *adev) | |||
| 224 | * | 224 | * |
| 225 | * Unbinds the requested pages from the gart page table and | 225 | * Unbinds the requested pages from the gart page table and |
| 226 | * replaces them with the dummy page (all asics). | 226 | * replaces them with the dummy page (all asics). |
| 227 | * Returns 0 for success, -EINVAL for failure. | ||
| 227 | */ | 228 | */ |
| 228 | void amdgpu_gart_unbind(struct amdgpu_device *adev, uint64_t offset, | 229 | int amdgpu_gart_unbind(struct amdgpu_device *adev, uint64_t offset, |
| 229 | int pages) | 230 | int pages) |
| 230 | { | 231 | { |
| 231 | unsigned t; | 232 | unsigned t; |
| @@ -237,7 +238,7 @@ void amdgpu_gart_unbind(struct amdgpu_device *adev, uint64_t offset, | |||
| 237 | 238 | ||
| 238 | if (!adev->gart.ready) { | 239 | if (!adev->gart.ready) { |
| 239 | WARN(1, "trying to unbind memory from uninitialized GART !\n"); | 240 | WARN(1, "trying to unbind memory from uninitialized GART !\n"); |
| 240 | return; | 241 | return -EINVAL; |
| 241 | } | 242 | } |
| 242 | 243 | ||
| 243 | t = offset / AMDGPU_GPU_PAGE_SIZE; | 244 | t = offset / AMDGPU_GPU_PAGE_SIZE; |
| @@ -258,6 +259,7 @@ void amdgpu_gart_unbind(struct amdgpu_device *adev, uint64_t offset, | |||
| 258 | } | 259 | } |
| 259 | mb(); | 260 | mb(); |
| 260 | amdgpu_gart_flush_gpu_tlb(adev, 0); | 261 | amdgpu_gart_flush_gpu_tlb(adev, 0); |
| 262 | return 0; | ||
| 261 | } | 263 | } |
| 262 | 264 | ||
| 263 | /** | 265 | /** |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 5db0230e45c6..fcf617c237ef 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | |||
| @@ -745,6 +745,7 @@ int amdgpu_ttm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *bo_mem) | |||
| 745 | return r; | 745 | return r; |
| 746 | } | 746 | } |
| 747 | 747 | ||
| 748 | spin_lock(>t->adev->gtt_list_lock); | ||
| 748 | flags = amdgpu_ttm_tt_pte_flags(gtt->adev, ttm, bo_mem); | 749 | flags = amdgpu_ttm_tt_pte_flags(gtt->adev, ttm, bo_mem); |
| 749 | gtt->offset = (u64)bo_mem->start << PAGE_SHIFT; | 750 | gtt->offset = (u64)bo_mem->start << PAGE_SHIFT; |
| 750 | r = amdgpu_gart_bind(gtt->adev, gtt->offset, ttm->num_pages, | 751 | r = amdgpu_gart_bind(gtt->adev, gtt->offset, ttm->num_pages, |
| @@ -753,12 +754,13 @@ int amdgpu_ttm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *bo_mem) | |||
| 753 | if (r) { | 754 | if (r) { |
| 754 | DRM_ERROR("failed to bind %lu pages at 0x%08llX\n", | 755 | DRM_ERROR("failed to bind %lu pages at 0x%08llX\n", |
| 755 | ttm->num_pages, gtt->offset); | 756 | ttm->num_pages, gtt->offset); |
| 756 | return r; | 757 | goto error_gart_bind; |
| 757 | } | 758 | } |
| 758 | spin_lock(>t->adev->gtt_list_lock); | 759 | |
| 759 | list_add_tail(>t->list, >t->adev->gtt_list); | 760 | list_add_tail(>t->list, >t->adev->gtt_list); |
| 761 | error_gart_bind: | ||
| 760 | spin_unlock(>t->adev->gtt_list_lock); | 762 | spin_unlock(>t->adev->gtt_list_lock); |
| 761 | return 0; | 763 | return r; |
| 762 | } | 764 | } |
| 763 | 765 | ||
| 764 | int amdgpu_ttm_recover_gart(struct amdgpu_device *adev) | 766 | int amdgpu_ttm_recover_gart(struct amdgpu_device *adev) |
| @@ -789,6 +791,7 @@ int amdgpu_ttm_recover_gart(struct amdgpu_device *adev) | |||
| 789 | static int amdgpu_ttm_backend_unbind(struct ttm_tt *ttm) | 791 | static int amdgpu_ttm_backend_unbind(struct ttm_tt *ttm) |
| 790 | { | 792 | { |
| 791 | struct amdgpu_ttm_tt *gtt = (void *)ttm; | 793 | struct amdgpu_ttm_tt *gtt = (void *)ttm; |
| 794 | int r; | ||
| 792 | 795 | ||
| 793 | if (gtt->userptr) | 796 | if (gtt->userptr) |
| 794 | amdgpu_ttm_tt_unpin_userptr(ttm); | 797 | amdgpu_ttm_tt_unpin_userptr(ttm); |
| @@ -797,14 +800,17 @@ static int amdgpu_ttm_backend_unbind(struct ttm_tt *ttm) | |||
| 797 | return 0; | 800 | return 0; |
| 798 | 801 | ||
| 799 | /* unbind shouldn't be done for GDS/GWS/OA in ttm_bo_clean_mm */ | 802 | /* unbind shouldn't be done for GDS/GWS/OA in ttm_bo_clean_mm */ |
| 800 | if (gtt->adev->gart.ready) | ||
| 801 | amdgpu_gart_unbind(gtt->adev, gtt->offset, ttm->num_pages); | ||
| 802 | |||
| 803 | spin_lock(>t->adev->gtt_list_lock); | 803 | spin_lock(>t->adev->gtt_list_lock); |
| 804 | r = amdgpu_gart_unbind(gtt->adev, gtt->offset, ttm->num_pages); | ||
| 805 | if (r) { | ||
| 806 | DRM_ERROR("failed to unbind %lu pages at 0x%08llX\n", | ||
| 807 | gtt->ttm.ttm.num_pages, gtt->offset); | ||
| 808 | goto error_unbind; | ||
| 809 | } | ||
| 804 | list_del_init(>t->list); | 810 | list_del_init(>t->list); |
| 811 | error_unbind: | ||
| 805 | spin_unlock(>t->adev->gtt_list_lock); | 812 | spin_unlock(>t->adev->gtt_list_lock); |
| 806 | 813 | return r; | |
| 807 | return 0; | ||
| 808 | } | 814 | } |
| 809 | 815 | ||
| 810 | static void amdgpu_ttm_backend_destroy(struct ttm_tt *ttm) | 816 | static void amdgpu_ttm_backend_destroy(struct ttm_tt *ttm) |
