aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3341-drm-amdkfd-Use-PASID-manager-from-KGD.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3341-drm-amdkfd-Use-PASID-manager-from-KGD.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3341-drm-amdkfd-Use-PASID-manager-from-KGD.patch169
1 files changed, 169 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3341-drm-amdkfd-Use-PASID-manager-from-KGD.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3341-drm-amdkfd-Use-PASID-manager-from-KGD.patch
new file mode 100644
index 00000000..1c691311
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3341-drm-amdkfd-Use-PASID-manager-from-KGD.patch
@@ -0,0 +1,169 @@
+From 71592a05c9189e4a2df4480fa001bd3ac6e38b29 Mon Sep 17 00:00:00 2001
+From: Felix Kuehling <Felix.Kuehling@amd.com>
+Date: Sat, 26 Aug 2017 02:10:12 -0400
+Subject: [PATCH 3341/4131] drm/amdkfd: Use PASID manager from KGD
+
+Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdkfd/kfd_module.c | 6 ---
+ drivers/gpu/drm/amd/amdkfd/kfd_pasid.c | 90 ++++++++++++++-------------------
+ 2 files changed, 38 insertions(+), 58 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_module.c b/drivers/gpu/drm/amd/amdkfd/kfd_module.c
+index 0d73bea..6c5a9ca 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_module.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_module.c
+@@ -103,10 +103,6 @@ static int __init kfd_module_init(void)
+ return -1;
+ }
+
+- err = kfd_pasid_init();
+- if (err < 0)
+- return err;
+-
+ err = kfd_chardev_init();
+ if (err < 0)
+ goto err_ioctl;
+@@ -126,7 +122,6 @@ static int __init kfd_module_init(void)
+ err_topology:
+ kfd_chardev_exit();
+ err_ioctl:
+- kfd_pasid_exit();
+ return err;
+ }
+
+@@ -137,7 +132,6 @@ static void __exit kfd_module_exit(void)
+ kfd_process_destroy_wq();
+ kfd_topology_shutdown();
+ kfd_chardev_exit();
+- kfd_pasid_exit();
+ dev_info(kfd_device, "Removed module\n");
+ }
+
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_pasid.c b/drivers/gpu/drm/amd/amdkfd/kfd_pasid.c
+index 1e06de0..d6a7961 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_pasid.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_pasid.c
+@@ -20,78 +20,64 @@
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+-#include <linux/slab.h>
+ #include <linux/types.h>
+ #include "kfd_priv.h"
+
+-static unsigned long *pasid_bitmap;
+-static unsigned int pasid_limit;
+-static DEFINE_MUTEX(pasid_mutex);
+-
+-int kfd_pasid_init(void)
+-{
+- pasid_limit = KFD_MAX_NUM_OF_PROCESSES;
+-
+- pasid_bitmap = kcalloc(BITS_TO_LONGS(pasid_limit), sizeof(long),
+- GFP_KERNEL);
+- if (!pasid_bitmap)
+- return -ENOMEM;
+-
+- set_bit(0, pasid_bitmap); /* PASID 0 is reserved. */
+-
+- return 0;
+-}
+-
+-void kfd_pasid_exit(void)
+-{
+- kfree(pasid_bitmap);
+-}
++static unsigned int pasid_bits = 16;
++static const struct kfd2kgd_calls *kfd2kgd;
+
+ bool kfd_set_pasid_limit(unsigned int new_limit)
+ {
+- if (new_limit < pasid_limit) {
+- bool ok;
+-
+- mutex_lock(&pasid_mutex);
+-
+- /* ensure that no pasids >= new_limit are in-use */
+- ok = (find_next_bit(pasid_bitmap, pasid_limit, new_limit) ==
+- pasid_limit);
+- if (ok)
+- pasid_limit = new_limit;
+-
+- mutex_unlock(&pasid_mutex);
+-
+- return ok;
++ if (new_limit < 2)
++ return false;
++
++ if (new_limit < (1U << pasid_bits)) {
++ if (kfd2kgd)
++ /* We've already allocated user PASIDs, too late to
++ * change the limit
++ */
++ return false;
++
++ while (new_limit < (1U << pasid_bits))
++ pasid_bits--;
+ }
+
+ return true;
+ }
+
+-inline unsigned int kfd_get_pasid_limit(void)
++unsigned int kfd_get_pasid_limit(void)
+ {
+- return pasid_limit;
++ return 1U << pasid_bits;
+ }
+
+ unsigned int kfd_pasid_alloc(void)
+ {
+- unsigned int found;
+-
+- mutex_lock(&pasid_mutex);
+-
+- found = find_first_zero_bit(pasid_bitmap, pasid_limit);
+- if (found == pasid_limit)
+- found = 0;
+- else
+- set_bit(found, pasid_bitmap);
++ int r;
++
++ /* Find the first best KFD device for calling KGD */
++ if (!kfd2kgd) {
++ struct kfd_dev *dev = NULL;
++ unsigned int i = 0;
++
++ while ((dev = kfd_topology_enum_kfd_devices(i)) != NULL) {
++ if (dev && dev->kfd2kgd) {
++ kfd2kgd = dev->kfd2kgd;
++ break;
++ }
++ i++;
++ }
++
++ if (!kfd2kgd)
++ return false;
++ }
+
+- mutex_unlock(&pasid_mutex);
++ r = kfd2kgd->alloc_pasid(pasid_bits);
+
+- return found;
++ return r > 0 ? r : 0;
+ }
+
+ void kfd_pasid_free(unsigned int pasid)
+ {
+- if (!WARN_ON(pasid == 0 || pasid >= pasid_limit))
+- clear_bit(pasid, pasid_bitmap);
++ if (kfd2kgd)
++ kfd2kgd->free_pasid(pasid);
+ }
+--
+2.7.4
+