[PATCH 01/11] drm/amdkfd: Reorganize kfd resume code

Oded Gabbay oded.gabbay at gmail.com
Sun Sep 17 11:18:39 UTC 2017


On Sat, Sep 16, 2017 at 2:42 AM, Felix Kuehling <Felix.Kuehling at amd.com> wrote:
> From: Yong Zhao <yong.zhao at amd.com>
>
> The idea is to let kfd init and resume function share the same code path
> as much as possible, rather than to have two copies of almost identical
> code. That way improves the code readability and maintainability.
>
> Signed-off-by: Yong Zhao <yong.zhao at amd.com>
> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
> ---
>  drivers/gpu/drm/amd/amdkfd/kfd_device.c | 78 +++++++++++++++++----------------
>  1 file changed, 40 insertions(+), 38 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
> index 61fff25..cc8af11 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
> @@ -92,6 +92,8 @@ static int kfd_gtt_sa_init(struct kfd_dev *kfd, unsigned int buf_size,
>                                 unsigned int chunk_size);
>  static void kfd_gtt_sa_fini(struct kfd_dev *kfd);
>
> +static int kfd_resume(struct kfd_dev *kfd);
> +
>  static const struct kfd_device_info *lookup_device_info(unsigned short did)
>  {
>         size_t i;
> @@ -176,15 +178,8 @@ static bool device_iommu_pasid_init(struct kfd_dev *kfd)
>                                 pasid_limit,
>                                 kfd->doorbell_process_limit - 1);
>
> -       err = amd_iommu_init_device(kfd->pdev, pasid_limit);
> -       if (err < 0) {
> -               dev_err(kfd_device, "error initializing iommu device\n");
> -               return false;
> -       }
> -
>         if (!kfd_set_pasid_limit(pasid_limit)) {
>                 dev_err(kfd_device, "error setting pasid limit\n");
> -               amd_iommu_free_device(kfd->pdev);
>                 return false;
>         }
>
> @@ -280,29 +275,22 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
>                 goto kfd_interrupt_error;
>         }
>
> -       if (!device_iommu_pasid_init(kfd)) {
> -               dev_err(kfd_device,
> -                       "Error initializing iommuv2 for device %x:%x\n",
> -                       kfd->pdev->vendor, kfd->pdev->device);
> -               goto device_iommu_pasid_error;
> -       }
> -       amd_iommu_set_invalidate_ctx_cb(kfd->pdev,
> -                                               iommu_pasid_shutdown_callback);
> -       amd_iommu_set_invalid_ppr_cb(kfd->pdev, iommu_invalid_ppr_cb);
> -
>         kfd->dqm = device_queue_manager_init(kfd);
>         if (!kfd->dqm) {
>                 dev_err(kfd_device, "Error initializing queue manager\n");
>                 goto device_queue_manager_error;
>         }
>
> -       if (kfd->dqm->ops.start(kfd->dqm)) {
> +       if (!device_iommu_pasid_init(kfd)) {
>                 dev_err(kfd_device,
> -                       "Error starting queue manager for device %x:%x\n",
> +                       "Error initializing iommuv2 for device %x:%x\n",
>                         kfd->pdev->vendor, kfd->pdev->device);
> -               goto dqm_start_error;
> +               goto device_iommu_pasid_error;
>         }
>
> +       if (kfd_resume(kfd))
> +               goto kfd_resume_error;
> +
>         kfd->dbgmgr = NULL;
>
>         kfd->init_complete = true;
> @@ -314,11 +302,10 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
>
>         goto out;
>
> -dqm_start_error:
> +kfd_resume_error:
> +device_iommu_pasid_error:
>         device_queue_manager_uninit(kfd->dqm);
>  device_queue_manager_error:
> -       amd_iommu_free_device(kfd->pdev);
> -device_iommu_pasid_error:
>         kfd_interrupt_exit(kfd);
>  kfd_interrupt_error:
>         kfd_topology_remove_device(kfd);
> @@ -338,8 +325,8 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
>  void kgd2kfd_device_exit(struct kfd_dev *kfd)
>  {
>         if (kfd->init_complete) {
> +               kgd2kfd_suspend(kfd);
>                 device_queue_manager_uninit(kfd->dqm);
> -               amd_iommu_free_device(kfd->pdev);
>                 kfd_interrupt_exit(kfd);
>                 kfd_topology_remove_device(kfd);
>                 kfd_doorbell_fini(kfd);
> @@ -362,25 +349,40 @@ void kgd2kfd_suspend(struct kfd_dev *kfd)
>
>  int kgd2kfd_resume(struct kfd_dev *kfd)
>  {
> -       unsigned int pasid_limit;
> -       int err;
> +       if (!kfd->init_complete)
> +               return 0;
>
> -       pasid_limit = kfd_get_pasid_limit();
> +       return kfd_resume(kfd);
>
> -       if (kfd->init_complete) {
> -               err = amd_iommu_init_device(kfd->pdev, pasid_limit);
> -               if (err < 0) {
> -                       dev_err(kfd_device, "failed to initialize iommu\n");
> -                       return -ENXIO;
> -               }
> +}
>
> -               amd_iommu_set_invalidate_ctx_cb(kfd->pdev,
> -                                               iommu_pasid_shutdown_callback);
> -               amd_iommu_set_invalid_ppr_cb(kfd->pdev, iommu_invalid_ppr_cb);
> -               kfd->dqm->ops.start(kfd->dqm);
> +static int kfd_resume(struct kfd_dev *kfd)
> +{
> +       int err = 0;
> +       unsigned int pasid_limit = kfd_get_pasid_limit();
> +
> +       err = amd_iommu_init_device(kfd->pdev, pasid_limit);
> +       if (err)
> +               return -ENXIO;
> +       amd_iommu_set_invalidate_ctx_cb(kfd->pdev,
> +                                       iommu_pasid_shutdown_callback);
> +       amd_iommu_set_invalid_ppr_cb(kfd->pdev,
> +                                    iommu_invalid_ppr_cb);
> +
> +       err = kfd->dqm->ops.start(kfd->dqm);
> +       if (err) {
> +               dev_err(kfd_device,
> +                       "Error starting queue manager for device %x:%x\n",
> +                       kfd->pdev->vendor, kfd->pdev->device);
> +               goto dqm_start_error;
>         }
>
> -       return 0;
> +       return err;
> +
> +dqm_start_error:
> +       amd_iommu_free_device(kfd->pdev);
> +
> +       return err;
>  }
>
>  /* This is called directly from KGD at ISR. */
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx

This patch is:
Reviewed-by: Oded Gabbay <oded.gabbay at gmail.com>


More information about the amd-gfx mailing list