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

Pass instance parameter to amdgpu_vcn_resume(), and perform
resume 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 | 60 ++++++++++++-------------
 drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h |  2 +-
 drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c   |  4 +-
 drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c   |  4 +-
 drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c   |  4 +-
 drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c   |  4 +-
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c   |  4 +-
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c |  4 +-
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c |  4 +-
 drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c |  4 +-
 10 files changed, 47 insertions(+), 47 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index 968355228095..67081fb4e96d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -330,47 +330,47 @@ int amdgpu_vcn_suspend(struct amdgpu_device *adev, int 
inst)
        return 0;
 }
 
-int amdgpu_vcn_resume(struct amdgpu_device *adev)
+int amdgpu_vcn_resume(struct amdgpu_device *adev, int inst)
 {
        unsigned int size;
        void *ptr;
-       int i, idx;
+       int idx;
+
+       if (adev->vcn.harvest_config & (1 << inst))
+               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 -EINVAL;
+       if (adev->vcn.inst[inst].vcpu_bo == NULL)
+               return -EINVAL;
+
+       size = amdgpu_bo_size(adev->vcn.inst[inst].vcpu_bo);
+       ptr = adev->vcn.inst[inst].cpu_addr;
 
-               size = amdgpu_bo_size(adev->vcn.inst[i].vcpu_bo);
-               ptr = adev->vcn.inst[i].cpu_addr;
+       if (adev->vcn.inst[inst].saved_bo != NULL) {
+               if (drm_dev_enter(adev_to_drm(adev), &idx)) {
+                       memcpy_toio(ptr, adev->vcn.inst[inst].saved_bo, size);
+                       drm_dev_exit(idx);
+               }
+               kvfree(adev->vcn.inst[inst].saved_bo);
+               adev->vcn.inst[inst].saved_bo = NULL;
+       } else {
+               const struct common_firmware_header *hdr;
+               unsigned int offset;
 
-               if (adev->vcn.inst[i].saved_bo != NULL) {
+               hdr = (const struct common_firmware_header 
*)adev->vcn.inst[inst].fw->data;
+               if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) {
+                       offset = le32_to_cpu(hdr->ucode_array_offset_bytes);
                        if (drm_dev_enter(adev_to_drm(adev), &idx)) {
-                               memcpy_toio(ptr, adev->vcn.inst[i].saved_bo, 
size);
+                               memcpy_toio(adev->vcn.inst[inst].cpu_addr,
+                                               adev->vcn.inst[inst].fw->data + 
offset,
+                                               
le32_to_cpu(hdr->ucode_size_bytes));
                                drm_dev_exit(idx);
                        }
-                       kvfree(adev->vcn.inst[i].saved_bo);
-                       adev->vcn.inst[i].saved_bo = NULL;
-               } else {
-                       const struct common_firmware_header *hdr;
-                       unsigned int offset;
-
-                       hdr = (const struct common_firmware_header 
*)adev->vcn.inst[i].fw->data;
-                       if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) {
-                               offset = 
le32_to_cpu(hdr->ucode_array_offset_bytes);
-                               if (drm_dev_enter(adev_to_drm(adev), &idx)) {
-                                       memcpy_toio(adev->vcn.inst[i].cpu_addr,
-                                                   adev->vcn.inst[i].fw->data 
+ offset,
-                                                   
le32_to_cpu(hdr->ucode_size_bytes));
-                                       drm_dev_exit(idx);
-                               }
-                               size -= le32_to_cpu(hdr->ucode_size_bytes);
-                               ptr += le32_to_cpu(hdr->ucode_size_bytes);
-                       }
-                       memset_io(ptr, 0, size);
+                       size -= le32_to_cpu(hdr->ucode_size_bytes);
+                       ptr += le32_to_cpu(hdr->ucode_size_bytes);
                }
+               memset_io(ptr, 0, size);
        }
+
        return 0;
 }
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
index 0695433a269c..72341b7027a2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
@@ -487,7 +487,7 @@ 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 inst);
-int amdgpu_vcn_resume(struct amdgpu_device *adev);
+int amdgpu_vcn_resume(struct amdgpu_device *adev, int inst);
 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 806ed6c550fb..11153ca0c3d9 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
@@ -156,7 +156,7 @@ static int vcn_v1_0_sw_init(struct amdgpu_ip_block 
*ip_block)
 
        amdgpu_vcn_setup_ucode(adev);
 
-       r = amdgpu_vcn_resume(adev);
+       r = amdgpu_vcn_resume(adev, inst);
        if (r)
                return r;
 
@@ -331,7 +331,7 @@ static int vcn_v1_0_resume(struct amdgpu_ip_block *ip_block)
 {
        int r;
 
-       r = amdgpu_vcn_resume(ip_block->adev);
+       r = amdgpu_vcn_resume(ip_block->adev, ip_block->instance);
        if (r)
                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 397aec069862..d36ab4368a25 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
@@ -161,7 +161,7 @@ static int vcn_v2_0_sw_init(struct amdgpu_ip_block 
*ip_block)
 
        amdgpu_vcn_setup_ucode(adev);
 
-       r = amdgpu_vcn_resume(adev);
+       r = amdgpu_vcn_resume(adev, inst);
        if (r)
                return r;
 
@@ -359,7 +359,7 @@ static int vcn_v2_0_resume(struct amdgpu_ip_block *ip_block)
 {
        int r;
 
-       r = amdgpu_vcn_resume(ip_block->adev);
+       r = amdgpu_vcn_resume(ip_block->adev, ip_block->instance);
        if (r)
                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 088a3521ac5a..963086b47b1d 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
@@ -191,7 +191,7 @@ static int vcn_v2_5_sw_init(struct amdgpu_ip_block 
*ip_block)
 
        amdgpu_vcn_setup_ucode(adev);
 
-       r = amdgpu_vcn_resume(adev);
+       r = amdgpu_vcn_resume(adev, inst);
        if (r)
                return r;
 
@@ -436,7 +436,7 @@ static int vcn_v2_5_resume(struct amdgpu_ip_block *ip_block)
 {
        int r;
 
-       r = amdgpu_vcn_resume(ip_block->adev);
+       r = amdgpu_vcn_resume(ip_block->adev, ip_block->instance);
        if (r)
                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 bd8322cdbcfe..098a523073b8 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
@@ -174,7 +174,7 @@ static int vcn_v3_0_sw_init(struct amdgpu_ip_block 
*ip_block)
 
        amdgpu_vcn_setup_ucode(adev);
 
-       r = amdgpu_vcn_resume(adev);
+       r = amdgpu_vcn_resume(adev, inst);
        if (r)
                return r;
 
@@ -468,7 +468,7 @@ static int vcn_v3_0_resume(struct amdgpu_ip_block *ip_block)
 {
        int r;
 
-       r = amdgpu_vcn_resume(ip_block->adev);
+       r = amdgpu_vcn_resume(ip_block->adev, ip_block->instance);
        if (r)
                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 c195742ee4f7..bdc3f37fe44a 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
@@ -182,7 +182,7 @@ static int vcn_v4_0_sw_init(struct amdgpu_ip_block 
*ip_block)
 
        amdgpu_vcn_setup_ucode(adev);
 
-       r = amdgpu_vcn_resume(adev);
+       r = amdgpu_vcn_resume(adev, inst);
        if (r)
                return r;
 
@@ -396,7 +396,7 @@ static int vcn_v4_0_resume(struct amdgpu_ip_block *ip_block)
 {
        int r;
 
-       r = amdgpu_vcn_resume(ip_block->adev);
+       r = amdgpu_vcn_resume(ip_block->adev, ip_block->instance);
        if (r)
                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 ed0f25f7ff5f..c44adeb4494c 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
@@ -139,7 +139,7 @@ static int vcn_v4_0_3_sw_init(struct amdgpu_ip_block 
*ip_block)
 
        amdgpu_vcn_setup_ucode(adev);
 
-       r = amdgpu_vcn_resume(adev);
+       r = amdgpu_vcn_resume(adev, inst);
        if (r)
                return r;
 
@@ -355,7 +355,7 @@ static int vcn_v4_0_3_resume(struct amdgpu_ip_block 
*ip_block)
 {
        int r;
 
-       r = amdgpu_vcn_resume(ip_block->adev);
+       r = amdgpu_vcn_resume(ip_block->adev, ip_block->instance);
        if (r)
                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 75ea91749276..dd392b787790 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
@@ -144,7 +144,7 @@ static int vcn_v4_0_5_sw_init(struct amdgpu_ip_block 
*ip_block)
 
        amdgpu_vcn_setup_ucode(adev);
 
-       r = amdgpu_vcn_resume(adev);
+       r = amdgpu_vcn_resume(adev, inst);
        if (r)
                return r;
 
@@ -347,7 +347,7 @@ static int vcn_v4_0_5_resume(struct amdgpu_ip_block 
*ip_block)
 {
        int r;
 
-       r = amdgpu_vcn_resume(ip_block->adev);
+       r = amdgpu_vcn_resume(ip_block->adev, ip_block->instance);
        if (r)
                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 69aa555b7227..b9fdb91fa86c 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
@@ -128,7 +128,7 @@ static int vcn_v5_0_0_sw_init(struct amdgpu_ip_block 
*ip_block)
 
        amdgpu_vcn_setup_ucode(adev);
 
-       r = amdgpu_vcn_resume(adev);
+       r = amdgpu_vcn_resume(adev, inst);
        if (r)
                return r;
 
@@ -311,7 +311,7 @@ static int vcn_v5_0_0_resume(struct amdgpu_ip_block 
*ip_block)
 {
        int r;
 
-       r = amdgpu_vcn_resume(ip_block->adev);
+       r = amdgpu_vcn_resume(ip_block->adev, ip_block->instance);
        if (r)
                return r;
 
-- 
2.34.1

Reply via email to