aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2050-drm-amdgpu-cleanup-force_completion.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2050-drm-amdgpu-cleanup-force_completion.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2050-drm-amdgpu-cleanup-force_completion.patch116
1 files changed, 116 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2050-drm-amdgpu-cleanup-force_completion.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2050-drm-amdgpu-cleanup-force_completion.patch
new file mode 100644
index 00000000..efd422d5
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2050-drm-amdgpu-cleanup-force_completion.patch
@@ -0,0 +1,116 @@
+From 45f079a43a02bcf3a40059f257a78fa944f06bef Mon Sep 17 00:00:00 2001
+From: Monk Liu <Monk.Liu@amd.com>
+Date: Mon, 16 Oct 2017 14:38:10 +0800
+Subject: [PATCH 2050/4131] drm/amdgpu:cleanup force_completion
+
+cleanups, now only operate on the given ring
+
+Change-Id: I42ee081696ac348660d38be68807f34090ffcce2
+Signed-off-by: Monk Liu <Monk.Liu@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 6 +++---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 29 +++++++----------------------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 3 +--
+ 3 files changed, 11 insertions(+), 27 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+index 199bb88..d0aaed4 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+@@ -2899,7 +2899,7 @@ int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, struct amdgpu_job *job)
+ amd_sched_hw_job_reset(&ring->sched);
+
+ /* after all hw jobs are reset, hw fence is meaningless, so force_completion */
+- amdgpu_fence_driver_force_completion_ring(ring);
++ amdgpu_fence_driver_force_completion(ring);
+ }
+
+ /* request to take full control of GPU before re-initialization */
+@@ -3018,9 +3018,9 @@ int amdgpu_gpu_reset(struct amdgpu_device *adev)
+ continue;
+ kthread_park(ring->sched.thread);
+ amd_sched_hw_job_reset(&ring->sched);
++ /* after all hw jobs are reset, hw fence is meaningless, so force_completion */
++ amdgpu_fence_driver_force_completion(ring);
+ }
+- /* after all hw jobs are reset, hw fence is meaningless, so force_completion */
+- amdgpu_fence_driver_force_completion(adev);
+
+ need_full_reset = amdgpu_need_full_reset(adev);
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
+index fb9f88ef..2167dac 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
+@@ -499,7 +499,7 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)
+ r = amdgpu_fence_wait_empty(ring);
+ if (r) {
+ /* no need to trigger GPU reset as we are unloading */
+- amdgpu_fence_driver_force_completion(adev);
++ amdgpu_fence_driver_force_completion(ring);
+ }
+ amdgpu_irq_put(adev, ring->fence_drv.irq_src,
+ ring->fence_drv.irq_type);
+@@ -534,7 +534,7 @@ void amdgpu_fence_driver_suspend(struct amdgpu_device *adev)
+ r = amdgpu_fence_wait_empty(ring);
+ if (r) {
+ /* delay GPU reset to resume */
+- amdgpu_fence_driver_force_completion(adev);
++ amdgpu_fence_driver_force_completion(ring);
+ }
+
+ /* disable the interrupt */
+@@ -571,30 +571,15 @@ void amdgpu_fence_driver_resume(struct amdgpu_device *adev)
+ }
+
+ /**
+- * amdgpu_fence_driver_force_completion - force all fence waiter to complete
++ * amdgpu_fence_driver_force_completion - force signal latest fence of ring
+ *
+- * @adev: amdgpu device pointer
++ * @ring: fence of the ring to signal
+ *
+- * In case of GPU reset failure make sure no process keep waiting on fence
+- * that will never complete.
+ */
+-void amdgpu_fence_driver_force_completion(struct amdgpu_device *adev)
++void amdgpu_fence_driver_force_completion(struct amdgpu_ring *ring)
+ {
+- int i;
+-
+- for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
+- struct amdgpu_ring *ring = adev->rings[i];
+- if (!ring || !ring->fence_drv.initialized)
+- continue;
+-
+- amdgpu_fence_write(ring, ring->fence_drv.sync_seq);
+- }
+-}
+-
+-void amdgpu_fence_driver_force_completion_ring(struct amdgpu_ring *ring)
+-{
+- if (ring)
+- amdgpu_fence_write(ring, ring->fence_drv.sync_seq);
++ amdgpu_fence_write(ring, ring->fence_drv.sync_seq);
++ amdgpu_fence_process(ring);
+ }
+
+ /*
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
+index 9fef7c7..907e1e0 100755
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
+@@ -80,8 +80,7 @@ struct amdgpu_fence_driver {
+
+ int amdgpu_fence_driver_init(struct amdgpu_device *adev);
+ void amdgpu_fence_driver_fini(struct amdgpu_device *adev);
+-void amdgpu_fence_driver_force_completion(struct amdgpu_device *adev);
+-void amdgpu_fence_driver_force_completion_ring(struct amdgpu_ring *ring);
++void amdgpu_fence_driver_force_completion(struct amdgpu_ring *ring);
+
+ int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring,
+ unsigned num_hw_submission);
+--
+2.7.4
+