All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 1/1] drm/amdgpu: flush gart changes after all BO recovery
@ 2021-05-28 15:54 Nirmoy Das
  2021-05-28 15:59 ` Christian König
  0 siblings, 1 reply; 3+ messages in thread
From: Nirmoy Das @ 2021-05-28 15:54 UTC (permalink / raw)
  To: amd-gfx; +Cc: Nirmoy Das, Christian.Koenig

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@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);
 	}
 	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

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v3 1/1] drm/amdgpu: flush gart changes after all BO recovery
  2021-05-28 15:54 [PATCH v3 1/1] drm/amdgpu: flush gart changes after all BO recovery Nirmoy Das
@ 2021-05-28 15:59 ` Christian König
  2021-05-28 16:25   ` Das, Nirmoy
  0 siblings, 1 reply; 3+ messages in thread
From: Christian König @ 2021-05-28 15:59 UTC (permalink / raw)
  To: Nirmoy Das, amd-gfx



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@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.

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
>

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v3 1/1] drm/amdgpu: flush gart changes after all BO recovery
  2021-05-28 15:59 ` Christian König
@ 2021-05-28 16:25   ` Das, Nirmoy
  0 siblings, 0 replies; 3+ messages in thread
From: Das, Nirmoy @ 2021-05-28 16:25 UTC (permalink / raw)
  To: Christian König, amd-gfx


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@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
>>
>
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-05-28 16:25 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-28 15:54 [PATCH v3 1/1] drm/amdgpu: flush gart changes after all BO recovery Nirmoy Das
2021-05-28 15:59 ` Christian König
2021-05-28 16:25   ` Das, Nirmoy

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.