aboutsummaryrefslogtreecommitdiffstats
path: root/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1487-drm-amdkfd-use-standard-kernel-kfifo-for-IH.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1487-drm-amdkfd-use-standard-kernel-kfifo-for-IH.patch')
-rw-r--r--meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1487-drm-amdkfd-use-standard-kernel-kfifo-for-IH.patch170
1 files changed, 0 insertions, 170 deletions
diff --git a/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1487-drm-amdkfd-use-standard-kernel-kfifo-for-IH.patch b/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1487-drm-amdkfd-use-standard-kernel-kfifo-for-IH.patch
deleted file mode 100644
index f059b2f6..00000000
--- a/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1487-drm-amdkfd-use-standard-kernel-kfifo-for-IH.patch
+++ /dev/null
@@ -1,170 +0,0 @@
-From 4b505ce3867a98bdd69b1176b47b9b03fbbdb65a Mon Sep 17 00:00:00 2001
-From: Andres Rodriguez <andres.rodriguez@amd.com>
-Date: Wed, 17 Aug 2016 17:42:44 -0400
-Subject: [PATCH 1487/4131] drm/amdkfd: use standard kernel kfifo for IH
-
-Replace our implementation of a lockless ring buffer with the standard
-linux kernel kfifo.
-
-We shouldn't maintain our own version of a standard data structure.
-
-Change-Id: I7ee9298a834a577c2fb803f680e2b87fe8213c1a
-Signed-off-by: Andres Rodriguez <andres.rodriguez@amd.com>
-Signed-off-by: kalyan alle <kalyan.alle@amd.com>
----
- drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c | 80 +++++++++++-------------------
- drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 6 +--
- 2 files changed, 30 insertions(+), 56 deletions(-)
-
-diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c b/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c
-index a8cdbc8..6dac60d 100644
---- a/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c
-+++ b/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c
-@@ -42,25 +42,24 @@
-
- #include <linux/slab.h>
- #include <linux/device.h>
-+#include <linux/kfifo.h>
- #include "kfd_priv.h"
-
--#define KFD_INTERRUPT_RING_SIZE 1024
-+#define KFD_IH_NUM_ENTRIES 1024
-
- static void interrupt_wq(struct work_struct *);
-
- int kfd_interrupt_init(struct kfd_dev *kfd)
- {
-- void *interrupt_ring = kmalloc_array(KFD_INTERRUPT_RING_SIZE,
-- kfd->device_info->ih_ring_entry_size,
-- GFP_KERNEL);
-- if (!interrupt_ring)
-- return -ENOMEM;
--
-- kfd->interrupt_ring = interrupt_ring;
-- kfd->interrupt_ring_size =
-- KFD_INTERRUPT_RING_SIZE * kfd->device_info->ih_ring_entry_size;
-- atomic_set(&kfd->interrupt_ring_wptr, 0);
-- atomic_set(&kfd->interrupt_ring_rptr, 0);
-+ int r;
-+
-+ r = kfifo_alloc(&kfd->ih_fifo,
-+ KFD_IH_NUM_ENTRIES * kfd->device_info->ih_ring_entry_size,
-+ GFP_KERNEL);
-+ if (r) {
-+ dev_err(kfd_chardev(), "Failed to allocate IH fifo\n");
-+ return r;
-+ }
-
- spin_lock_init(&kfd->interrupt_lock);
-
-@@ -98,66 +97,43 @@ void kfd_interrupt_exit(struct kfd_dev *kfd)
- */
- flush_scheduled_work();
-
-- kfree(kfd->interrupt_ring);
-+ kfifo_free(&kfd->ih_fifo);
- }
-
- /*
-- * This assumes that it can't be called concurrently with itself
-- * but only with dequeue_ih_ring_entry.
-+ * Assumption: single reader/writer. This function is not re-entrant
- */
- bool enqueue_ih_ring_entry(struct kfd_dev *kfd, const void *ih_ring_entry)
- {
-- unsigned int rptr = atomic_read(&kfd->interrupt_ring_rptr);
-- unsigned int wptr = atomic_read(&kfd->interrupt_ring_wptr);
-+ int count;
-
-- if ((rptr - wptr) % kfd->interrupt_ring_size ==
-- kfd->device_info->ih_ring_entry_size) {
-- /* This is very bad, the system is likely to hang. */
-+ count = kfifo_in(&kfd->ih_fifo, ih_ring_entry,
-+ kfd->device_info->ih_ring_entry_size);
-+ if (count != kfd->device_info->ih_ring_entry_size) {
- dev_err_ratelimited(kfd_chardev(),
-- "Interrupt ring overflow, dropping interrupt.\n");
-+ "Interrupt ring overflow, dropping interrupt %d\n",
-+ count);
- return false;
- }
-
-- memcpy(kfd->interrupt_ring + wptr, ih_ring_entry,
-- kfd->device_info->ih_ring_entry_size);
--
-- wptr = (wptr + kfd->device_info->ih_ring_entry_size) %
-- kfd->interrupt_ring_size;
-- smp_wmb(); /* Ensure memcpy'd data is visible before wptr update. */
-- atomic_set(&kfd->interrupt_ring_wptr, wptr);
--
- return true;
- }
-
- /*
-- * This assumes that it can't be called concurrently with itself
-- * but only with enqueue_ih_ring_entry.
-+ * Assumption: single reader/writer. This function is not re-entrant
- */
- static bool dequeue_ih_ring_entry(struct kfd_dev *kfd, void *ih_ring_entry)
- {
-- /*
-- * Assume that wait queues have an implicit barrier, i.e. anything that
-- * happened in the ISR before it queued work is visible.
-- */
--
-- unsigned int wptr = atomic_read(&kfd->interrupt_ring_wptr);
-- unsigned int rptr = atomic_read(&kfd->interrupt_ring_rptr);
-+ int count;
-
-- if (rptr == wptr)
-+ count = kfifo_out(&kfd->ih_fifo, ih_ring_entry,
-+ kfd->device_info->ih_ring_entry_size);
-+ if (count != kfd->device_info->ih_ring_entry_size) {
-+ dev_err_ratelimited(kfd_chardev(),
-+ "IH dequeued unexpected number of entries %d\n",
-+ count);
- return false;
--
-- memcpy(ih_ring_entry, kfd->interrupt_ring + rptr,
-- kfd->device_info->ih_ring_entry_size);
--
-- rptr = (rptr + kfd->device_info->ih_ring_entry_size) %
-- kfd->interrupt_ring_size;
--
-- /*
-- * Ensure the rptr write update is not visible until
-- * memcpy has finished reading.
-- */
-- smp_mb();
-- atomic_set(&kfd->interrupt_ring_rptr, rptr);
-+ }
-
- return true;
- }
-diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
-index f0459c7..0cff1f0 100644
---- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
-+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
-@@ -36,6 +36,7 @@
- #include <linux/interval_tree.h>
- #include <linux/seq_file.h>
- #include <linux/kref.h>
-+#include <linux/kfifo.h>
- #include <kgd_kfd_interface.h>
-
- #include <drm/amd_rdma.h>
-@@ -247,10 +248,7 @@ struct kfd_dev {
- bool init_complete;
-
- /* Interrupts */
-- void *interrupt_ring;
-- size_t interrupt_ring_size;
-- atomic_t interrupt_ring_rptr;
-- atomic_t interrupt_ring_wptr;
-+ struct kfifo ih_fifo;
- struct work_struct interrupt_work;
- spinlock_t interrupt_lock;
-
---
-2.7.4
-