aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1321-drm-amdkfd-Fix-doorbell-initialization-and-finalizat.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1321-drm-amdkfd-Fix-doorbell-initialization-and-finalizat.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1321-drm-amdkfd-Fix-doorbell-initialization-and-finalizat.patch106
1 files changed, 106 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1321-drm-amdkfd-Fix-doorbell-initialization-and-finalizat.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1321-drm-amdkfd-Fix-doorbell-initialization-and-finalizat.patch
new file mode 100644
index 00000000..f9d66da1
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1321-drm-amdkfd-Fix-doorbell-initialization-and-finalizat.patch
@@ -0,0 +1,106 @@
+From 1590796b55d30220a2df158daebfa888ea4d01b9 Mon Sep 17 00:00:00 2001
+From: Felix Kuehling <Felix.Kuehling@amd.com>
+Date: Fri, 28 Jul 2017 15:51:15 -0400
+Subject: [PATCH 1321/4131] drm/amdkfd: Fix doorbell initialization and
+ finalization
+
+Handle errors in doorbell aperture initialization instead of BUG_ON.
+iounmap doorbell aperture during finalization.
+
+Change-Id: I45971955f13c66ea230994d2471264514043b158
+Signed-off-by: Felix Kuehling <Felix.Kuehling@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 35c0b554..d8b6489 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
+@@ -611,7 +611,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) != 0) {
+ dev_err(kfd_device,
+@@ -678,6 +682,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);
+@@ -699,6 +705,7 @@ void kgd2kfd_device_exit(struct kfd_dev *kfd)
+ device_queue_manager_uninit(kfd->dqm);
+ 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 f4833b2..55a0fda 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c
+@@ -58,7 +58,7 @@ size_t kfd_doorbell_process_slice(struct kfd_dev *kfd)
+ }
+
+ /* 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;
+@@ -94,7 +94,8 @@ void kfd_doorbell_init(struct kfd_dev *kfd)
+ kfd->doorbell_kernel_ptr = ioremap(kfd->doorbell_base,
+ kfd_doorbell_process_slice(kfd));
+
+- WARN_ON(!kfd->doorbell_kernel_ptr);
++ if (!kfd->doorbell_kernel_ptr)
++ return -ENOMEM;
+
+ pr_debug("Doorbell initialization:\n");
+ pr_debug("doorbell base == 0x%08lX\n",
+@@ -114,6 +115,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_dev *dev, struct kfd_process *process,
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+index 50fe6ca..c8af486 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+@@ -817,7 +817,8 @@ void kfd_pasid_free(unsigned int pasid);
+
+ /* Doorbells */
+ size_t kfd_doorbell_process_slice(struct kfd_dev *kfd);
+-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_dev *kfd, struct kfd_process *process,
+ struct vm_area_struct *vma);
+ void __iomem *kfd_get_kernel_doorbell(struct kfd_dev *kfd,
+--
+2.7.4
+