From: Boyuan Zhang <boyuan.zh...@amd.com>

Pass instance parameter to amdgpu_vcn_suspend(), and perform
suspend ONLY for the given vcn instance, instead of for all
vcn instances. Modify each vcn generation accordingly.

Signed-off-by: Boyuan Zhang <boyuan.zh...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 35 ++++++++++++-------------
 drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h |  2 +-
 drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c   |  7 ++---
 drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c   |  6 +++--
 drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c   |  6 +++--
 drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c   |  6 +++--
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c   |  6 +++--
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c |  6 +++--
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c |  6 +++--
 drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c |  6 +++--
 10 files changed, 50 insertions(+), 36 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index 307615ffeb79..968355228095 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -294,40 +294,39 @@ bool amdgpu_vcn_is_disabled_vcn(struct amdgpu_device 
*adev, enum vcn_ring_type t
        return ret;
 }
 
-int amdgpu_vcn_suspend(struct amdgpu_device *adev)
+int amdgpu_vcn_suspend(struct amdgpu_device *adev, int inst)
 {
        unsigned int size;
        void *ptr;
-       int i, idx;
+       int idx;
 
        bool in_ras_intr = amdgpu_ras_intr_triggered();
 
-       for (i = 0; i < adev->vcn.num_vcn_inst; ++i)
-               cancel_delayed_work_sync(&adev->vcn.inst[i].idle_work);
+       cancel_delayed_work_sync(&adev->vcn.inst[inst].idle_work);
 
        /* err_event_athub will corrupt VCPU buffer, so we need to
         * restore fw data and clear buffer in amdgpu_vcn_resume() */
        if (in_ras_intr)
                return 0;
 
-       for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
-               if (adev->vcn.harvest_config & (1 << i))
-                       continue;
-               if (adev->vcn.inst[i].vcpu_bo == NULL)
-                       return 0;
+       if (adev->vcn.harvest_config & (1 << inst))
+               return 0;
 
-               size = amdgpu_bo_size(adev->vcn.inst[i].vcpu_bo);
-               ptr = adev->vcn.inst[i].cpu_addr;
+       if (adev->vcn.inst[inst].vcpu_bo == NULL)
+               return 0;
 
-               adev->vcn.inst[i].saved_bo = kvmalloc(size, GFP_KERNEL);
-               if (!adev->vcn.inst[i].saved_bo)
-                       return -ENOMEM;
+       size = amdgpu_bo_size(adev->vcn.inst[inst].vcpu_bo);
+       ptr = adev->vcn.inst[inst].cpu_addr;
 
-               if (drm_dev_enter(adev_to_drm(adev), &idx)) {
-                       memcpy_fromio(adev->vcn.inst[i].saved_bo, ptr, size);
-                       drm_dev_exit(idx);
-               }
+       adev->vcn.inst[inst].saved_bo = kvmalloc(size, GFP_KERNEL);
+       if (!adev->vcn.inst[inst].saved_bo)
+               return -ENOMEM;
+
+       if (drm_dev_enter(adev_to_drm(adev), &idx)) {
+               memcpy_fromio(adev->vcn.inst[inst].saved_bo, ptr, size);
+               drm_dev_exit(idx);
        }
+
        return 0;
 }
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
index 883b9f9776a1..0695433a269c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
@@ -486,7 +486,7 @@ enum vcn_ring_type {
 int amdgpu_vcn_early_init(struct amdgpu_device *adev, int inst);
 int amdgpu_vcn_sw_init(struct amdgpu_device *adev, int inst);
 int amdgpu_vcn_sw_fini(struct amdgpu_device *adev, int inst);
-int amdgpu_vcn_suspend(struct amdgpu_device *adev);
+int amdgpu_vcn_suspend(struct amdgpu_device *adev, int inst);
 int amdgpu_vcn_resume(struct amdgpu_device *adev);
 void amdgpu_vcn_ring_begin_use(struct amdgpu_ring *ring);
 void amdgpu_vcn_ring_end_use(struct amdgpu_ring *ring);
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
index 8203f80be316..806ed6c550fb 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
@@ -226,7 +226,7 @@ static int vcn_v1_0_sw_fini(struct amdgpu_ip_block 
*ip_block)
        int inst = ip_block->instance;
        int r;
 
-       r = amdgpu_vcn_suspend(adev);
+       r = amdgpu_vcn_suspend(adev, inst);
        if (r)
                return r;
 
@@ -300,9 +300,10 @@ static int vcn_v1_0_hw_fini(struct amdgpu_ip_block 
*ip_block)
  */
 static int vcn_v1_0_suspend(struct amdgpu_ip_block *ip_block)
 {
-       int r;
        struct amdgpu_device *adev = ip_block->adev;
+       int inst = ip_block->instance;
        bool idle_work_unexecuted;
+       int r;
 
        idle_work_unexecuted = 
cancel_delayed_work_sync(&adev->vcn.inst[0].idle_work);
        if (idle_work_unexecuted) {
@@ -314,7 +315,7 @@ static int vcn_v1_0_suspend(struct amdgpu_ip_block 
*ip_block)
        if (r)
                return r;
 
-       r = amdgpu_vcn_suspend(adev);
+       r = amdgpu_vcn_suspend(adev, inst);
 
        return r;
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
index 0481a07054eb..397aec069862 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
@@ -257,7 +257,7 @@ static int vcn_v2_0_sw_fini(struct amdgpu_ip_block 
*ip_block)
 
        amdgpu_virt_free_mm_table(adev);
 
-       r = amdgpu_vcn_suspend(adev);
+       r = amdgpu_vcn_suspend(adev, inst);
        if (r)
                return r;
 
@@ -335,13 +335,15 @@ static int vcn_v2_0_hw_fini(struct amdgpu_ip_block 
*ip_block)
  */
 static int vcn_v2_0_suspend(struct amdgpu_ip_block *ip_block)
 {
+       struct amdgpu_device *adev = ip_block->adev;
+       int inst = ip_block->instance;
        int r;
 
        r = vcn_v2_0_hw_fini(ip_block);
        if (r)
                return r;
 
-       r = amdgpu_vcn_suspend(ip_block->adev);
+       r = amdgpu_vcn_suspend(adev, inst);
 
        return r;
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
index f225a0b214d0..088a3521ac5a 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
@@ -316,7 +316,7 @@ static int vcn_v2_5_sw_fini(struct amdgpu_ip_block 
*ip_block)
        if (amdgpu_sriov_vf(adev))
                amdgpu_virt_free_mm_table(adev);
 
-       r = amdgpu_vcn_suspend(adev);
+       r = amdgpu_vcn_suspend(adev, inst);
        if (r)
                return r;
 
@@ -412,13 +412,15 @@ static int vcn_v2_5_hw_fini(struct amdgpu_ip_block 
*ip_block)
  */
 static int vcn_v2_5_suspend(struct amdgpu_ip_block *ip_block)
 {
+       struct amdgpu_device *adev = ip_block->adev;
+       int inst = ip_block->instance;
        int r;
 
        r = vcn_v2_5_hw_fini(ip_block);
        if (r)
                return r;
 
-       r = amdgpu_vcn_suspend(ip_block->adev);
+       r = amdgpu_vcn_suspend(adev, inst);
 
        return r;
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
index 2d1835d06ecb..bd8322cdbcfe 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
@@ -325,7 +325,7 @@ static int vcn_v3_0_sw_fini(struct amdgpu_ip_block 
*ip_block)
        if (amdgpu_sriov_vf(adev))
                amdgpu_virt_free_mm_table(adev);
 
-       r = amdgpu_vcn_suspend(adev);
+       r = amdgpu_vcn_suspend(adev, inst);
        if (r)
                return r;
 
@@ -444,13 +444,15 @@ static int vcn_v3_0_hw_fini(struct amdgpu_ip_block 
*ip_block)
  */
 static int vcn_v3_0_suspend(struct amdgpu_ip_block *ip_block)
 {
+       struct amdgpu_device *adev = ip_block->adev;
+       int inst = ip_block->instance;
        int r;
 
        r = vcn_v3_0_hw_fini(ip_block);
        if (r)
                return r;
 
-       r = amdgpu_vcn_suspend(ip_block->adev);
+       r = amdgpu_vcn_suspend(adev, inst);
 
        return r;
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
index afe2eba9aac4..c195742ee4f7 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
@@ -277,7 +277,7 @@ static int vcn_v4_0_sw_fini(struct amdgpu_ip_block 
*ip_block)
        if (amdgpu_sriov_vf(adev))
                amdgpu_virt_free_mm_table(adev);
 
-       r = amdgpu_vcn_suspend(adev);
+       r = amdgpu_vcn_suspend(adev, inst);
        if (r)
                return r;
 
@@ -372,13 +372,15 @@ static int vcn_v4_0_hw_fini(struct amdgpu_ip_block 
*ip_block)
  */
 static int vcn_v4_0_suspend(struct amdgpu_ip_block *ip_block)
 {
+       struct amdgpu_device *adev = ip_block->adev;
+       int inst = ip_block->instance;
        int r;
 
        r = vcn_v4_0_hw_fini(ip_block);
        if (r)
                return r;
 
-       r = amdgpu_vcn_suspend(ip_block->adev);
+       r = amdgpu_vcn_suspend(adev, inst);
 
        return r;
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
index 0dc26dc173cb..ed0f25f7ff5f 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
@@ -235,7 +235,7 @@ static int vcn_v4_0_3_sw_fini(struct amdgpu_ip_block 
*ip_block)
        if (amdgpu_sriov_vf(adev))
                amdgpu_virt_free_mm_table(adev);
 
-       r = amdgpu_vcn_suspend(adev);
+       r = amdgpu_vcn_suspend(adev, inst);
        if (r)
                return r;
 
@@ -331,13 +331,15 @@ static int vcn_v4_0_3_hw_fini(struct amdgpu_ip_block 
*ip_block)
  */
 static int vcn_v4_0_3_suspend(struct amdgpu_ip_block *ip_block)
 {
+       struct amdgpu_device *adev = ip_block->adev;
+       int inst = ip_block->instance;
        int r;
 
        r = vcn_v4_0_3_hw_fini(ip_block);
        if (r)
                return r;
 
-       r = amdgpu_vcn_suspend(ip_block->adev);
+       r = amdgpu_vcn_suspend(adev, inst);
 
        return r;
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
index 36e4477c99f3..75ea91749276 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
@@ -246,7 +246,7 @@ static int vcn_v4_0_5_sw_fini(struct amdgpu_ip_block 
*ip_block)
        if (amdgpu_sriov_vf(adev))
                amdgpu_virt_free_mm_table(adev);
 
-       r = amdgpu_vcn_suspend(adev);
+       r = amdgpu_vcn_suspend(adev, inst);
        if (r)
                return r;
 
@@ -323,13 +323,15 @@ static int vcn_v4_0_5_hw_fini(struct amdgpu_ip_block 
*ip_block)
  */
 static int vcn_v4_0_5_suspend(struct amdgpu_ip_block *ip_block)
 {
+       struct amdgpu_device *adev = ip_block->adev;
+       int inst = ip_block->instance;
        int r;
 
        r = vcn_v4_0_5_hw_fini(ip_block);
        if (r)
                return r;
 
-       r = amdgpu_vcn_suspend(ip_block->adev);
+       r = amdgpu_vcn_suspend(adev, inst);
 
        return r;
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
index 687d413a50b7..69aa555b7227 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
@@ -210,7 +210,7 @@ static int vcn_v5_0_0_sw_fini(struct amdgpu_ip_block 
*ip_block)
                drm_dev_exit(idx);
        }
 
-       r = amdgpu_vcn_suspend(adev);
+       r = amdgpu_vcn_suspend(adev, inst);
        if (r)
                return r;
 
@@ -287,13 +287,15 @@ static int vcn_v5_0_0_hw_fini(struct amdgpu_ip_block 
*ip_block)
  */
 static int vcn_v5_0_0_suspend(struct amdgpu_ip_block *ip_block)
 {
+       struct amdgpu_device *adev = ip_block->adev;
+       int inst = ip_block->instance;
        int r;
 
        r = vcn_v5_0_0_hw_fini(ip_block);
        if (r)
                return r;
 
-       r = amdgpu_vcn_suspend(ip_block->adev);
+       r = amdgpu_vcn_suspend(adev, inst);
 
        return r;
 }
-- 
2.34.1

Reply via email to