[PATCH v3 1/1] drm/amdgpu: flush gart changes after all BO recovery
Das, Nirmoy
nirmoy.das at amd.com
Fri May 28 16:25:10 UTC 2021
On 5/28/2021 5:59 PM, Christian König wrote:
>
>
> Am 28.05.21 um 17:54 schrieb Nirmoy Das:
>> Don't flush gart changes after recovering each BO instead
>> do it after recovering all the BOs. Flishing gart also needed
>> for amdgpu_ttm_alloc_gart().
>>
>> v3: rename amdgpu_gart_tlb_flush() -> amdgpu_gart_invalidate_tlb()
>> v2: abstract out gart tlb flushing logic to amdgpu_gart.c
>>
>> Signed-off-by: Nirmoy Das <nirmoy.das at amd.com>
>> ---
>> drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c | 20 +++++++++++++++-----
>> drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h | 2 +-
>> drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 6 ++++++
>> drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 1 +
>> 4 files changed, 23 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
>> index 5562b5c90c03..992b59c29dd7 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
>> @@ -322,16 +322,26 @@ int amdgpu_gart_bind(struct amdgpu_device
>> *adev, uint64_t offset,
>> if (!adev->gart.ptr)
>> return 0;
>>
>> - r = amdgpu_gart_map(adev, offset, pages, dma_addr, flags,
>> - adev->gart.ptr);
>> - if (r)
>> - return r;
>> + return amdgpu_gart_map(adev, offset, pages, dma_addr, flags,
>> + adev->gart.ptr);
>> +}
>> +
>> +/**
>> + * amdgpu_gart_invalidate_tlb - invalidate gart TLB
>> + *
>> + * @adev: amdgpu device driver pointer
>> + *
>> + * Invalidate gart TLB which can be use as a way to flush gart changes
>> + *
>> + */
>> +void amdgpu_gart_invalidate_tlb(struct amdgpu_device *adev)
>> +{
>> + int i;
>>
>> mb();
>> amdgpu_asic_flush_hdp(adev, NULL);
>> for (i = 0; i < adev->num_vmhubs; i++)
>> amdgpu_gmc_flush_gpu_tlb(adev, 0, i, 0);
>> - return 0;
>> }
>>
>> /**
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h
>> index a25fe97b0196..e104022197ae 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h
>> @@ -66,5 +66,5 @@ int amdgpu_gart_map(struct amdgpu_device *adev,
>> uint64_t offset,
>> int amdgpu_gart_bind(struct amdgpu_device *adev, uint64_t offset,
>> int pages, struct page **pagelist,
>> dma_addr_t *dma_addr, uint64_t flags);
>> -
>> +void amdgpu_gart_invalidate_tlb(struct amdgpu_device *adev);
>> #endif
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
>> index 8860545344c7..b01bc2346082 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
>> @@ -205,6 +205,7 @@ uint64_t amdgpu_gtt_mgr_usage(struct
>> ttm_resource_manager *man)
>> */
>> int amdgpu_gtt_mgr_recover(struct ttm_resource_manager *man)
>> {
>> + struct amdgpu_device *adev = NULL;
>> struct amdgpu_gtt_mgr *mgr = to_gtt_mgr(man);
>> struct amdgpu_gtt_node *node;
>> struct drm_mm_node *mm_node;
>> @@ -216,9 +217,14 @@ int amdgpu_gtt_mgr_recover(struct
>> ttm_resource_manager *man)
>> r = amdgpu_ttm_recover_gart(node->tbo);
>> if (r)
>> break;
>> + if (!adev)
>> + adev = amdgpu_ttm_adev(node->tbo->bdev);
>
> container_of(mgr, typeof(*adev), mman.gtt_mgr) is probably a bit
> cleaner than this.
This was bothering me as well, thanks for this!
Nirmoy
>
> Christian.
>
>> }
>> spin_unlock(&mgr->lock);
>>
>> + if (adev)
>> + amdgpu_gart_invalidate_tlb(adev);
>> +
>> return r;
>> }
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>> index c0aef327292a..786650a4a493 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>> @@ -1014,6 +1014,7 @@ int amdgpu_ttm_alloc_gart(struct
>> ttm_buffer_object *bo)
>> return r;
>> }
>>
>> + amdgpu_gart_invalidate_tlb(adev);
>> ttm_resource_free(bo, &bo->mem);
>> bo->mem = tmp;
>> }
>> --
>> 2.31.1
>>
>
More information about the amd-gfx
mailing list