On 7/13/26 20:27, Alex Deucher wrote:
> Adds a new helper to do TLB invalidation using SDMA.

We already have that. See function amdgpu_gmc_flush_gpu_tlb().

Regards,
Christian.

> 
> Signed-off-by: Alex Deucher <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 36 +++++++++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h |  2 ++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 42 +++++++++++++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h |  6 ++++
>  4 files changed, 86 insertions(+)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> index 3f0b1b7a557b9..5c1237a30b865 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> @@ -928,6 +928,42 @@ void amdgpu_gmc_fw_reg_write_reg_wait(struct 
> amdgpu_device *adev,
>       dev_err(adev->dev, "failed to write reg %x wait reg %x\n", reg0, reg1);
>  }
>  
> +int amdgpu_gmc_flush_gpu_tlb_helper(struct amdgpu_device *adev, uint32_t 
> vmid,
> +                                 uint32_t vmhub, uint32_t flush_type)
> +{
> +     struct dma_fence *fence;
> +     /* Use register 17 for GART */
> +     u32 inst, eng = 17;
> +     int r;
> +
> +     if (AMDGPU_IS_GFXHUB(vmhub) && !adev->gfx.is_poweron)
> +             return 0;
> +
> +     if (vmhub >= AMDGPU_MMHUB0(0))
> +             inst = 0;
> +     else
> +             inst = vmhub;
> +
> +     /* flush hdp cache */
> +     amdgpu_device_flush_hdp(adev, NULL);
> +
> +     mutex_lock(&adev->mman.default_entity.lock);
> +     r = amdgpu_ttm_tlb_inv(adev, vmid, vmhub, eng, flush_type, inst,
> +                            &adev->mman.default_entity,
> +                            NULL, &fence);
> +     if (r)
> +             goto exit;
> +     r = dma_fence_wait(fence, false);
> +     dma_fence_put(fence);
> +     if (r)
> +             goto exit;
> +
> +exit:
> +     mutex_unlock(&adev->mman.default_entity.lock);
> +
> +     return r;
> +}
> +
>  /**
>   * amdgpu_gmc_tmz_set -- check and set if a device supports TMZ
>   * @adev: amdgpu_device pointer
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
> index 3ca187f5ade85..0135be1418a91 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
> @@ -450,6 +450,8 @@ void amdgpu_gmc_fw_reg_write_reg_wait(struct 
> amdgpu_device *adev,
>                                     uint32_t reg0, uint32_t reg1,
>                                     uint32_t ref, uint32_t mask,
>                                     uint32_t xcc_inst);
> +int amdgpu_gmc_flush_gpu_tlb_helper(struct amdgpu_device *adev, uint32_t 
> vmid,
> +                                 uint32_t vmhub, uint32_t flush_type);
>  
>  extern void amdgpu_gmc_tmz_set(struct amdgpu_device *adev);
>  extern void amdgpu_gmc_noretry_set(struct amdgpu_device *adev);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index 74ada995bd8e5..03e74b7ca0003 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -2513,6 +2513,48 @@ int amdgpu_copy_buffer(struct amdgpu_device *adev,
>       return r;
>  }
>  
> +int amdgpu_ttm_tlb_inv(struct amdgpu_device *adev,
> +                    unsigned int vmid, u32 vmhub, u32 eng,
> +                    u32 flush_type, u32 xcc_inst,
> +                    struct amdgpu_ttm_buffer_entity *entity,
> +                    struct dma_resv *resv,
> +                    struct dma_fence **fence)
> +{
> +     struct amdgpu_ring *ring;
> +     struct amdgpu_job *job;
> +     int r, num_dw;
> +
> +     if (!adev->mman.buffer_funcs_enabled)
> +             return -EINVAL;
> +
> +     ring = to_amdgpu_ring(adev->mman.buffer_funcs_scheds[0]);
> +
> +     if (!ring->sched.ready) {
> +             dev_err(adev->dev,
> +                     "Trying to inv tlbs with ring turned off.\n");
> +             return -EINVAL;
> +     }
> +
> +     num_dw = ALIGN(adev->mman.buffer_funcs->tlb_inv_num_dw, 8);
> +     r = amdgpu_ttm_prepare_job(adev, entity, num_dw,
> +                                resv, false, &job,
> +                                AMDGPU_KERNEL_JOB_ID_VM_UPDATE);
> +     if (r)
> +             goto error_free;
> +
> +     amdgpu_emit_tlb_inv(adev, &job->ibs[0], vmid, vmhub, eng,
> +                         flush_type, xcc_inst);
> +
> +     *fence = amdgpu_ttm_job_submit(adev, entity, job, num_dw);
> +
> +     return 0;
> +
> +error_free:
> +     amdgpu_job_free(job);
> +     dev_err(adev->dev, "Error scheduling IBs (%d)\n", r);
> +     return r;
> +}
> +
>  static int amdgpu_ttm_fill_mem(struct amdgpu_device *adev,
>                              struct amdgpu_ttm_buffer_entity *entity,
>                              uint32_t src_data,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> index ff9e2e3466099..f6a69c5a5ee86 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> @@ -195,6 +195,12 @@ int amdgpu_copy_buffer(struct amdgpu_device *adev,
>                      struct dma_resv *resv,
>                      struct dma_fence **fence,
>                      bool vm_needs_flush, uint32_t copy_flags);
> +int amdgpu_ttm_tlb_inv(struct amdgpu_device *adev,
> +                    unsigned int vmid, u32 vmhub, u32 eng,
> +                    u32 flush_type, u32 xcc_inst,
> +                    struct amdgpu_ttm_buffer_entity *entity,
> +                    struct dma_resv *resv,
> +                    struct dma_fence **fence);
>  int amdgpu_ttm_clear_buffer(struct amdgpu_ttm_buffer_entity *entity,
>                           struct amdgpu_bo *bo,
>                           struct dma_resv *resv,

Reply via email to