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>