aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/1237-drm-amdgpu-cleanup-amdgpu_ih_process-a-bit-more.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/1237-drm-amdgpu-cleanup-amdgpu_ih_process-a-bit-more.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/1237-drm-amdgpu-cleanup-amdgpu_ih_process-a-bit-more.patch181
1 files changed, 181 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/1237-drm-amdgpu-cleanup-amdgpu_ih_process-a-bit-more.patch b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/1237-drm-amdgpu-cleanup-amdgpu_ih_process-a-bit-more.patch
new file mode 100644
index 00000000..72b396a7
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/1237-drm-amdgpu-cleanup-amdgpu_ih_process-a-bit-more.patch
@@ -0,0 +1,181 @@
+From fe24d0c51b75141049375b4a8282e70acbbb59fd Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Wed, 9 Jan 2019 15:36:29 +0100
+Subject: [PATCH 1237/2940] drm/amdgpu: cleanup amdgpu_ih_process a bit more
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Remove the callback and call the dispatcher directly.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
+Signed-off-by: Chaudhary Amit Kumar <Chaudharyamit.Kumar@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c | 6 +--
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h | 4 +-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 49 +++++++++----------------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h | 2 +-
+ 4 files changed, 21 insertions(+), 40 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
+index d0a5db777b6d..1c50be3ab8a9 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
+@@ -140,9 +140,7 @@ 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,
+- void (*callback)(struct amdgpu_device *adev,
+- struct amdgpu_ih_ring *ih))
++int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih)
+ {
+ u32 wptr;
+
+@@ -162,7 +160,7 @@ int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih,
+ rmb();
+
+ while (ih->rptr != wptr) {
+- callback(adev, ih);
++ amdgpu_irq_dispatch(adev, ih);
+ ih->rptr &= ih->ptr_mask;
+ }
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h
+index 1ccb1831382a..113a1ba13d4a 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h
+@@ -69,8 +69,6 @@ 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,
+- void (*callback)(struct amdgpu_device *adev,
+- struct amdgpu_ih_ring *ih));
++int amdgpu_ih_process(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 97ce4a356368..8175a248cf69 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
+@@ -130,29 +130,6 @@ void amdgpu_irq_disable_all(struct amdgpu_device *adev)
+ spin_unlock_irqrestore(&adev->irq.lock, irqflags);
+ }
+
+-/**
+- * 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;
+-
+- entry.iv_entry = (const uint32_t *)&ih->ring[ring_index];
+- amdgpu_ih_decode_iv(adev, &entry);
+-
+- trace_amdgpu_iv(ih - &adev->irq.ih, &entry);
+-
+- amdgpu_irq_dispatch(adev, &entry);
+-}
+-
+ /**
+ * amdgpu_irq_handler - IRQ handler
+ *
+@@ -170,7 +147,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, amdgpu_irq_callback);
++ ret = amdgpu_ih_process(adev, &adev->irq.ih);
+ if (ret == IRQ_HANDLED)
+ pm_runtime_mark_last_busy(dev->dev);
+ return ret;
+@@ -188,7 +165,7 @@ static void amdgpu_irq_handle_ih1(struct work_struct *work)
+ struct amdgpu_device *adev = container_of(work, struct amdgpu_device,
+ irq.ih1_work);
+
+- amdgpu_ih_process(adev, &adev->irq.ih1, amdgpu_irq_callback);
++ amdgpu_ih_process(adev, &adev->irq.ih1);
+ }
+
+ /**
+@@ -203,7 +180,7 @@ static void amdgpu_irq_handle_ih2(struct work_struct *work)
+ struct amdgpu_device *adev = container_of(work, struct amdgpu_device,
+ irq.ih2_work);
+
+- amdgpu_ih_process(adev, &adev->irq.ih2, amdgpu_irq_callback);
++ amdgpu_ih_process(adev, &adev->irq.ih2);
+ }
+
+ /**
+@@ -394,14 +371,23 @@ int amdgpu_irq_add_id(struct amdgpu_device *adev,
+ * Dispatches IRQ to IP blocks.
+ */
+ void amdgpu_irq_dispatch(struct amdgpu_device *adev,
+- struct amdgpu_iv_entry *entry)
++ struct amdgpu_ih_ring *ih)
+ {
+- unsigned client_id = entry->client_id;
+- unsigned src_id = entry->src_id;
++ u32 ring_index = ih->rptr >> 2;
++ struct amdgpu_iv_entry entry;
++ unsigned client_id, src_id;
+ struct amdgpu_irq_src *src;
+ bool handled = false;
+ int r;
+
++ entry.iv_entry = (const uint32_t *)&ih->ring[ring_index];
++ amdgpu_ih_decode_iv(adev, &entry);
++
++ trace_amdgpu_iv(ih - &adev->irq.ih, &entry);
++
++ client_id = entry.client_id;
++ src_id = entry.src_id;
++
+ if (client_id >= AMDGPU_IRQ_CLIENTID_MAX) {
+ DRM_DEBUG("Invalid client_id in IV: %d\n", client_id);
+
+@@ -416,8 +402,7 @@ void amdgpu_irq_dispatch(struct amdgpu_device *adev,
+ client_id, src_id);
+
+ } else if ((src = adev->irq.client[client_id].sources[src_id])) {
+-
+- r = src->funcs->process(adev, src, entry);
++ r = src->funcs->process(adev, src, &entry);
+ if (r < 0)
+ DRM_ERROR("error processing interrupt (%d)\n", r);
+ else if (r)
+@@ -429,7 +414,7 @@ void amdgpu_irq_dispatch(struct amdgpu_device *adev,
+
+ /* Send it to amdkfd as well if it isn't already handled */
+ if (!handled)
+- amdgpu_amdkfd_interrupt(adev, entry->iv_entry);
++ amdgpu_amdkfd_interrupt(adev, entry.iv_entry);
+ }
+
+ /**
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
+index 005267d6efe8..f4324f0c22ba 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
+@@ -108,7 +108,7 @@ int amdgpu_irq_add_id(struct amdgpu_device *adev,
+ unsigned client_id, unsigned src_id,
+ struct amdgpu_irq_src *source);
+ void amdgpu_irq_dispatch(struct amdgpu_device *adev,
+- struct amdgpu_iv_entry *entry);
++ struct amdgpu_ih_ring *ih);
+ int amdgpu_irq_update(struct amdgpu_device *adev, struct amdgpu_irq_src *src,
+ unsigned type);
+ int amdgpu_irq_get(struct amdgpu_device *adev, struct amdgpu_irq_src *src,
+--
+2.17.1
+