diff options
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.patch | 116 |
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 + |