aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1523-drm-amdgpu-Ignore-kfd-eviction-fence-in-sync_resv.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1523-drm-amdgpu-Ignore-kfd-eviction-fence-in-sync_resv.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1523-drm-amdgpu-Ignore-kfd-eviction-fence-in-sync_resv.patch132
1 files changed, 132 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1523-drm-amdgpu-Ignore-kfd-eviction-fence-in-sync_resv.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1523-drm-amdgpu-Ignore-kfd-eviction-fence-in-sync_resv.patch
new file mode 100644
index 00000000..e4f2ab60
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1523-drm-amdgpu-Ignore-kfd-eviction-fence-in-sync_resv.patch
@@ -0,0 +1,132 @@
+From b9c27ae38d45a3c9cbd1b841aa5fcc8b9c34e920 Mon Sep 17 00:00:00 2001
+From: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
+Date: Wed, 20 Jul 2016 11:28:54 -0400
+Subject: [PATCH 1523/4131] drm/amdgpu: Ignore kfd eviction fence in sync_resv
+
+Change-Id: I61fcd385319ea9fa0bf9451124996c65e590184b
+Signed-off-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
+
+ Conflicts:
+ drivers/gpu/drm/amd/amdgpu/amdgpu.h
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 1 +
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c | 2 +-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 1 +
+ drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 26 +++++++++++++++++++-----
+ 4 files changed, 24 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+index 2db28e5..ed753fc 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+@@ -83,6 +83,7 @@ struct amdgpu_amdkfd_fence {
+ struct amdgpu_amdkfd_fence *amdgpu_amdkfd_fence_create(u64 context,
+ void *mm);
+ bool amd_kfd_fence_check_mm(struct fence *f, void *mm);
++struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct fence *f);
+
+ /* struct amdkfd_vm -
+ * For Memory Eviction KGD requires a mechanism to keep track of all KFD BOs
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c
+index 7026781..ac167c8 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c
+@@ -83,7 +83,7 @@ struct amdgpu_amdkfd_fence *amdgpu_amdkfd_fence_create(u64 context,
+ return fence;
+ }
+
+-static struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct fence *f)
++struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct fence *f)
+ {
+ struct amdgpu_amdkfd_fence *fence;
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
+index 322d2529..af8e544 100755
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
+@@ -36,6 +36,7 @@
+ /* some special values for the owner field */
+ #define AMDGPU_FENCE_OWNER_UNDEFINED ((void*)0ul)
+ #define AMDGPU_FENCE_OWNER_VM ((void*)1ul)
++#define AMDGPU_FENCE_OWNER_KFD ((void *)2ul)
+
+ #define AMDGPU_FENCE_FLAG_64BIT (1 << 0)
+ #define AMDGPU_FENCE_FLAG_INT (1 << 1)
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
+index 8492a26..bc79ef8 100755
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
+@@ -31,6 +31,7 @@
+ #include <drm/drmP.h>
+ #include "amdgpu.h"
+ #include "amdgpu_trace.h"
++#include "amdgpu_amdkfd.h"
+
+ struct amdgpu_sync_entry {
+ struct hlist_node node;
+@@ -84,11 +85,20 @@ static bool amdgpu_sync_same_dev(struct amdgpu_device *adev,
+ */
+ static void *amdgpu_sync_get_owner(struct dma_fence *f)
+ {
+- struct amd_sched_fence *s_fence = to_amd_sched_fence(f);
++ struct amd_sched_fence *s_fence;
++ struct amdgpu_amdkfd_fence *kfd_fence;
++
++ if (f == NULL)
++ return AMDGPU_FENCE_OWNER_UNDEFINED;
+
++ s_fence = to_amd_sched_fence(f);
+ if (s_fence)
+ return s_fence->owner;
+
++ kfd_fence = to_amdgpu_amdkfd_fence(f);
++ if (kfd_fence)
++ return AMDGPU_FENCE_OWNER_KFD;
++
+ return AMDGPU_FENCE_OWNER_UNDEFINED;
+ }
+
+@@ -170,7 +180,8 @@ int amdgpu_sync_fence(struct amdgpu_device *adev, struct amdgpu_sync *sync,
+ * @sync: sync object to add fences from reservation object to
+ * @resv: reservation object with embedded fence
+ * @shared: true if we should only sync to the exclusive fence
+- * Sync to the fence
++ * Sync to the fence except if it is KFD eviction fence and owner is
++ * AMDGPU_FENCE_OWNER_VM.
+ */
+ int amdgpu_sync_resv(struct amdgpu_device *adev,
+ struct amdgpu_sync *sync,
+@@ -186,9 +197,11 @@ int amdgpu_sync_resv(struct amdgpu_device *adev,
+ if (resv == NULL)
+ return -EINVAL;
+
+- /* always sync to the exclusive fence */
+ f = reservation_object_get_excl(resv);
+- r = amdgpu_sync_fence(adev, sync, f);
++ fence_owner = amdgpu_sync_get_owner(f);
++ if (fence_owner != AMDGPU_FENCE_OWNER_KFD ||
++ owner != AMDGPU_FENCE_OWNER_VM)
++ r = amdgpu_sync_fence(adev, sync, f);
+
+ flist = reservation_object_get_list(resv);
+ if (!flist || r)
+@@ -197,12 +210,15 @@ int amdgpu_sync_resv(struct amdgpu_device *adev,
+ for (i = 0; i < flist->shared_count; ++i) {
+ f = rcu_dereference_protected(flist->shared[i],
+ reservation_object_held(resv));
++ fence_owner = amdgpu_sync_get_owner(f);
++ if (fence_owner == AMDGPU_FENCE_OWNER_KFD &&
++ owner == AMDGPU_FENCE_OWNER_VM)
++ continue;
+
+ if (amdgpu_sync_same_dev(adev, f)) {
+ /* VM updates are only interesting
+ * for other VM updates and moves.
+ */
+- fence_owner = amdgpu_sync_get_owner(f);
+ if ((owner != AMDGPU_FENCE_OWNER_UNDEFINED) &&
+ (fence_owner != AMDGPU_FENCE_OWNER_UNDEFINED) &&
+ ((owner == AMDGPU_FENCE_OWNER_VM) !=
+--
+2.7.4
+