During vcn suspends, stop ring continue to receive new requests,
and try to wait for all vcn jobs to finish gracefully.

Signed-off-by: James Zhu <james....@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index 2016459..7e9f5cb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -275,9 +275,27 @@ int amdgpu_vcn_suspend(struct amdgpu_device *adev)
 {
        unsigned size;
        void *ptr;
+       int retry_max = 6;
        int i;
 
-       cancel_delayed_work_sync(&adev->vcn.idle_work);
+       for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
+               if (adev->vcn.harvest_config & (1 << i))
+                       continue;
+               ring = &adev->vcn.inst[i].ring_dec;
+               ring->sched.ready = false;
+
+               for (j = 0; j < adev->vcn.num_enc_rings; ++j) {
+                       ring = &adev->vcn.inst[i].ring_enc[j];
+                       ring->sched.ready = false;
+               }
+       }
+
+       while (retry_max--) {
+               if (cancel_delayed_work_sync(&adev->vcn.idle_work)) {
+                       dev_warn(adev->dev, "Waiting for left VCN job(s) to 
finish gracefully ...");
+                       mdelay(5);
+               }
+       }
 
        for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
                if (adev->vcn.harvest_config & (1 << i))
-- 
2.7.4

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to