[PATCH 11/19] drm/amdkfd: Fix doorbell initialization and finalization

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, Aug 12, 2017 at 12:56 AM, Felix Kuehling <Felix.Kuehling at amd.com> wrote:
> Handle errors in doorbell aperture initialization instead of BUG_ON.
> iounmap doorbell aperture during finalization.
>
> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
> ---
>  drivers/gpu/drm/amd/amdkfd/kfd_device.c   |  9 ++++++++-
>  drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c | 13 +++++++++++--
>  drivers/gpu/drm/amd/amdkfd/kfd_priv.h     |  3 ++-
>  3 files changed, 21 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
> index e28e818..cb7ed02 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
> @@ -260,7 +260,11 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
>                 goto kfd_gtt_sa_init_error;
>         }
>
> -       kfd_doorbell_init(kfd);
> +       if (kfd_doorbell_init(kfd)) {
> +               dev_err(kfd_device,
> +                       "Error initializing doorbell aperture\n");
> +               goto kfd_doorbell_error;
> +       }
>
>         if (kfd_topology_add_device(kfd)) {
>                 dev_err(kfd_device, "Error adding device to topology\n");
> @@ -315,6 +319,8 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
>  kfd_interrupt_error:
>         kfd_topology_remove_device(kfd);
>  kfd_topology_add_device_error:
> +       kfd_doorbell_fini(kfd);
> +kfd_doorbell_error:
>         kfd_gtt_sa_fini(kfd);
>  kfd_gtt_sa_init_error:
>         kfd->kfd2kgd->free_gtt_mem(kfd->kgd, kfd->gtt_mem);
> @@ -332,6 +338,7 @@ void kgd2kfd_device_exit(struct kfd_dev *kfd)
>                 amd_iommu_free_device(kfd->pdev);
>                 kfd_interrupt_exit(kfd);
>                 kfd_topology_remove_device(kfd);
> +               kfd_doorbell_fini(kfd);
>                 kfd_gtt_sa_fini(kfd);
>                 kfd->kfd2kgd->free_gtt_mem(kfd->kgd, kfd->gtt_mem);
>         }
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c b/drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c
> index 0055270..acf4d2a 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c
> @@ -59,7 +59,7 @@ static inline size_t doorbell_process_allocation(void)
>  }
>
>  /* Doorbell calculations for device init. */
> -void kfd_doorbell_init(struct kfd_dev *kfd)
> +int kfd_doorbell_init(struct kfd_dev *kfd)
>  {
>         size_t doorbell_start_offset;
>         size_t doorbell_aperture_size;
> @@ -95,7 +95,8 @@ void kfd_doorbell_init(struct kfd_dev *kfd)
>         kfd->doorbell_kernel_ptr = ioremap(kfd->doorbell_base,
>                                                 doorbell_process_allocation());
>
> -       BUG_ON(!kfd->doorbell_kernel_ptr);
> +       if (!kfd->doorbell_kernel_ptr)
> +               return -ENOMEM;
>
>         pr_debug("Doorbell initialization:\n");
>         pr_debug("doorbell base           == 0x%08lX\n",
> @@ -115,6 +116,14 @@ void kfd_doorbell_init(struct kfd_dev *kfd)
>
>         pr_debug("doorbell kernel address == 0x%08lX\n",
>                         (uintptr_t)kfd->doorbell_kernel_ptr);
> +
> +       return 0;
> +}
> +
> +void kfd_doorbell_fini(struct kfd_dev *kfd)
> +{
> +       if (kfd->doorbell_kernel_ptr)
> +               iounmap(kfd->doorbell_kernel_ptr);
>  }
>
>  int kfd_doorbell_mmap(struct kfd_process *process, struct vm_area_struct *vma)
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
> index 469b7ea..f0d55cc0 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
> @@ -576,7 +576,8 @@ unsigned int kfd_pasid_alloc(void);
>  void kfd_pasid_free(unsigned int pasid);
>
>  /* Doorbells */
> -void kfd_doorbell_init(struct kfd_dev *kfd);
> +int kfd_doorbell_init(struct kfd_dev *kfd);
> +void kfd_doorbell_fini(struct kfd_dev *kfd);
>  int kfd_doorbell_mmap(struct kfd_process *process, struct vm_area_struct *vma);
>  u32 __iomem *kfd_get_kernel_doorbell(struct kfd_dev *kfd,
>                                         unsigned int *doorbell_off);
> --
> 2.7.4
>

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


[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux