aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/5457-drm-amdgpu-move-more-interrupt-processing-into-amdgp.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5457-drm-amdgpu-move-more-interrupt-processing-into-amdgp.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/5457-drm-amdgpu-move-more-interrupt-processing-into-amdgp.patch144
1 files changed, 144 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5457-drm-amdgpu-move-more-interrupt-processing-into-amdgp.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5457-drm-amdgpu-move-more-interrupt-processing-into-amdgp.patch
new file mode 100644
index 00000000..61be4ef4
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5457-drm-amdgpu-move-more-interrupt-processing-into-amdgp.patch
@@ -0,0 +1,144 @@
+From c3669eccc5527c52c079c987d09c103c0b2613eb Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Mon, 17 Sep 2018 15:18:37 +0200
+Subject: [PATCH 5457/5725] drm/amdgpu: move more interrupt processing into
+ amdgpu_irq.c
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Add a callback to amdgpu_ih_process to remove most of the IV logic.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Acked-by: Huang Rui <ray.huang@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c | 24 +++++-------------------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h | 4 +++-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 31 ++++++++++++++++++++++++++++++-
+ 3 files changed, 38 insertions(+), 21 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
+index 15fb0f9..8af67f6 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
+@@ -24,7 +24,6 @@
+ #include <drm/drmP.h>
+ #include "amdgpu.h"
+ #include "amdgpu_ih.h"
+-#include "amdgpu_amdkfd.h"
+
+ /**
+ * amdgpu_ih_ring_init - initialize the IH state
+@@ -129,9 +128,10 @@ void amdgpu_ih_ring_fini(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih)
+ * Interrupt hander (VI), walk the IH ring.
+ * Returns irq process return code.
+ */
+-int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih)
++int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih,
++ void (*callback)(struct amdgpu_device *adev,
++ struct amdgpu_ih_ring *ih))
+ {
+- struct amdgpu_iv_entry entry;
+ u32 wptr;
+
+ if (!ih->enabled || adev->shutdown)
+@@ -150,24 +150,10 @@ int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih)
+ rmb();
+
+ while (ih->rptr != wptr) {
+- u32 ring_index = ih->rptr >> 2;
+-
+- /* Prescreening of high-frequency interrupts */
+- if (!amdgpu_ih_prescreen_iv(adev)) {
+- ih->rptr &= ih->ptr_mask;
+- continue;
+- }
+-
+- /* Before dispatching irq to IP blocks, send it to amdkfd */
+- amdgpu_amdkfd_interrupt(adev,
+- (const void *) &ih->ring[ring_index]);
+-
+- entry.iv_entry = (const uint32_t *)&ih->ring[ring_index];
+- amdgpu_ih_decode_iv(adev, &entry);
++ callback(adev, ih);
+ ih->rptr &= ih->ptr_mask;
+-
+- amdgpu_irq_dispatch(adev, &entry);
+ }
++
+ amdgpu_ih_set_rptr(adev);
+ atomic_set(&ih->lock, 0);
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h
+index 3e55f98..fd2bbaa 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h
+@@ -85,6 +85,8 @@ struct amdgpu_ih_funcs {
+ int amdgpu_ih_ring_init(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih,
+ unsigned ring_size, bool use_bus_addr);
+ void amdgpu_ih_ring_fini(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih);
+-int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih);
++int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih,
++ void (*callback)(struct amdgpu_device *adev,
++ struct amdgpu_ih_ring *ih));
+
+ #endif
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
+index ba004fe..d15410b 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
+@@ -51,6 +51,7 @@
+ #include "atom.h"
+ #include "amdgpu_connectors.h"
+ #include "amdgpu_trace.h"
++#include "amdgpu_amdkfd.h"
+
+ #include <linux/pm_runtime.h>
+
+@@ -147,6 +148,34 @@ void amdgpu_irq_disable_all(struct amdgpu_device *adev)
+ }
+
+ /**
++ * amdgpu_irq_callback - callback from the IH ring
++ *
++ * @adev: amdgpu device pointer
++ * @ih: amdgpu ih ring
++ *
++ * Callback from IH ring processing to handle the entry at the current position
++ * and advance the read pointer.
++ */
++static void amdgpu_irq_callback(struct amdgpu_device *adev,
++ struct amdgpu_ih_ring *ih)
++{
++ u32 ring_index = ih->rptr >> 2;
++ struct amdgpu_iv_entry entry;
++
++ /* Prescreening of high-frequency interrupts */
++ if (!amdgpu_ih_prescreen_iv(adev))
++ return;
++
++ /* Before dispatching irq to IP blocks, send it to amdkfd */
++ amdgpu_amdkfd_interrupt(adev, (const void *) &ih->ring[ring_index]);
++
++ entry.iv_entry = (const uint32_t *)&ih->ring[ring_index];
++ amdgpu_ih_decode_iv(adev, &entry);
++
++ amdgpu_irq_dispatch(adev, &entry);
++}
++
++/**
+ * amdgpu_irq_handler - IRQ handler
+ *
+ * @irq: IRQ number (unused)
+@@ -163,7 +192,7 @@ irqreturn_t amdgpu_irq_handler(int irq, void *arg)
+ struct amdgpu_device *adev = dev->dev_private;
+ irqreturn_t ret;
+
+- ret = amdgpu_ih_process(adev, &adev->irq.ih);
++ ret = amdgpu_ih_process(adev, &adev->irq.ih, amdgpu_irq_callback);
+ if (ret == IRQ_HANDLED)
+ pm_runtime_mark_last_busy(dev->dev);
+ return ret;
+--
+2.7.4
+