aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2134-drm-amdgpu-Fix-TLB-flushing-via-KIQ.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2134-drm-amdgpu-Fix-TLB-flushing-via-KIQ.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2134-drm-amdgpu-Fix-TLB-flushing-via-KIQ.patch90
1 files changed, 90 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2134-drm-amdgpu-Fix-TLB-flushing-via-KIQ.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2134-drm-amdgpu-Fix-TLB-flushing-via-KIQ.patch
new file mode 100644
index 00000000..bf1c31ee
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2134-drm-amdgpu-Fix-TLB-flushing-via-KIQ.patch
@@ -0,0 +1,90 @@
+From 225741b22890d58f9d00a2e98fd0faa958a981fd Mon Sep 17 00:00:00 2001
+From: Felix Kuehling <Felix.Kuehling@amd.com>
+Date: Wed, 25 Oct 2017 18:29:50 -0400
+Subject: [PATCH 2134/4131] drm/amdgpu: Fix TLB flushing via KIQ
+
+Use amdgpu_fence_emit_polling to avoid sleeping while holding a
+spin-lock.
+
+Change-Id: Ia17987637979008971bd67b57a2e9b44e24db020
+Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 13 +++++++------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c | 13 +++++++------
+ 2 files changed, 14 insertions(+), 12 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+index 3cf283f..59a1036 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+@@ -795,7 +795,7 @@ static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid)
+ static int invalidate_tlbs_with_kiq(struct amdgpu_device *adev, uint16_t pasid)
+ {
+ signed long r;
+- struct dma_fence *f;
++ uint32_t seq;
+ struct amdgpu_ring *ring = &adev->gfx.kiq.ring;
+
+ spin_lock(&adev->gfx.kiq.ring_lock);
+@@ -804,16 +804,17 @@ static int invalidate_tlbs_with_kiq(struct amdgpu_device *adev, uint16_t pasid)
+ amdgpu_ring_write(ring,
+ PACKET3_INVALIDATE_TLBS_DST_SEL(1) |
+ PACKET3_INVALIDATE_TLBS_PASID(pasid));
+- amdgpu_fence_emit(ring, &f);
++ amdgpu_fence_emit_polling(ring, &seq);
+ amdgpu_ring_commit(ring);
+ spin_unlock(&adev->gfx.kiq.ring_lock);
+
+- r = dma_fence_wait(f, false);
+- if (r)
++ r = amdgpu_fence_wait_polling(ring, seq, adev->usec_timeout);
++ if (r < 1) {
+ DRM_ERROR("wait for kiq fence error: %ld.\n", r);
+- dma_fence_put(f);
++ return -ETIME;
++ }
+
+- return r;
++ return 0;
+ }
+ #endif
+ static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
+index 667360e..c649376 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
+@@ -971,7 +971,7 @@ static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid)
+ static int invalidate_tlbs_with_kiq(struct amdgpu_device *adev, uint16_t pasid)
+ {
+ signed long r;
+- struct dma_fence *f;
++ uint32_t seq;
+ struct amdgpu_ring *ring = &adev->gfx.kiq.ring;
+
+ spin_lock(&adev->gfx.kiq.ring_lock);
+@@ -982,16 +982,17 @@ static int invalidate_tlbs_with_kiq(struct amdgpu_device *adev, uint16_t pasid)
+ PACKET3_INVALIDATE_TLBS_ALL_HUB(1) |
+ PACKET3_INVALIDATE_TLBS_PASID(pasid) |
+ PACKET3_INVALIDATE_TLBS_FLUSH_TYPE(2));
+- amdgpu_fence_emit(ring, &f);
++ amdgpu_fence_emit_polling(ring, &seq);
+ amdgpu_ring_commit(ring);
+ spin_unlock(&adev->gfx.kiq.ring_lock);
+
+- r = dma_fence_wait(f, false);
+- if (r)
++ r = amdgpu_fence_wait_polling(ring, seq, adev->usec_timeout);
++ if (r < 1) {
+ DRM_ERROR("wait for kiq fence error: %ld.\n", r);
+- dma_fence_put(f);
++ return -ETIME;
++ }
+
+- return r;
++ return 0;
+ }
+
+ static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
+--
+2.7.4
+