[PATCH 4/8] drm/amd: Update kgd_kfd interface for resuming SDMA queues

Oded Gabbay oded.gabbay at gmail.com
Thu Nov 2 14:55:15 UTC 2017


On Thu, Nov 2, 2017 at 1:21 AM, Felix Kuehling <Felix.Kuehling at amd.com> wrote:
> Add wptr and mm parameters to hqd_sdma_load and pass these parameters
> from device_queue_manager through the mqd_manager.
>
> SDMA doesn't support polling while the engine believes it's idle. The
> driver must update the wptr. The new parameters will be used for looking
> up the updated value from the specified mm when SDMA queues are resumed
> after being disabled.
>
> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 6 ++++--
>  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 6 ++++--
>  drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c  | 4 +++-
>  drivers/gpu/drm/amd/include/kgd_kfd_interface.h   | 3 ++-
>  4 files changed, 13 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> index 1e3e9be..a55d794 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> @@ -105,7 +105,8 @@ static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
>                         uint32_t queue_id, uint32_t __user *wptr,
>                         uint32_t wptr_shift, uint32_t wptr_mask,
>                         struct mm_struct *mm);
> -static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd);
> +static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd,
> +                            uint32_t __user *wptr, struct mm_struct *mm);
>  static bool kgd_hqd_is_occupied(struct kgd_dev *kgd, uint64_t queue_address,
>                                 uint32_t pipe_id, uint32_t queue_id);
>
> @@ -375,7 +376,8 @@ static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
>         return 0;
>  }
>
> -static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd)
> +static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd,
> +                            uint32_t __user *wptr, struct mm_struct *mm)
>  {
>         struct amdgpu_device *adev = get_amdgpu_device(kgd);
>         struct cik_sdma_rlc_registers *m;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> index 056929b..1017ff5 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> @@ -64,7 +64,8 @@ static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
>                         uint32_t queue_id, uint32_t __user *wptr,
>                         uint32_t wptr_shift, uint32_t wptr_mask,
>                         struct mm_struct *mm);
> -static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd);
> +static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd,
> +                            uint32_t __user *wptr, struct mm_struct *mm);
>  static bool kgd_hqd_is_occupied(struct kgd_dev *kgd, uint64_t queue_address,
>                 uint32_t pipe_id, uint32_t queue_id);
>  static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd);
> @@ -358,7 +359,8 @@ static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
>         return 0;
>  }
>
> -static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd)
> +static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd,
> +                            uint32_t __user *wptr, struct mm_struct *mm)
>  {
>         return 0;
>  }
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
> index 4728fad..ea02bfa 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
> @@ -160,7 +160,9 @@ static int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
>                          uint32_t pipe_id, uint32_t queue_id,
>                          struct queue_properties *p, struct mm_struct *mms)
>  {
> -       return mm->dev->kfd2kgd->hqd_sdma_load(mm->dev->kgd, mqd);
> +       return mm->dev->kfd2kgd->hqd_sdma_load(mm->dev->kgd, mqd,
> +                                              (uint32_t __user *)p->write_ptr,
> +                                              mms);
>  }
>
>  static int update_mqd(struct mqd_manager *mm, void *mqd,
> diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
> index f516fd1..c6d4e64 100644
> --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
> +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
> @@ -184,7 +184,8 @@ struct kfd2kgd_calls {
>                         uint32_t wptr_shift, uint32_t wptr_mask,
>                         struct mm_struct *mm);
>
> -       int (*hqd_sdma_load)(struct kgd_dev *kgd, void *mqd);
> +       int (*hqd_sdma_load)(struct kgd_dev *kgd, void *mqd,
> +                            uint32_t __user *wptr, struct mm_struct *mm);
>
>         bool (*hqd_is_occupied)(struct kgd_dev *kgd, uint64_t queue_address,
>                                 uint32_t pipe_id, uint32_t queue_id);
> --
> 2.7.4
>
This patch is:
Reviewed-by: Oded Gabbay <oded.gabbay at gmail.com>


More information about the amd-gfx mailing list