Acked-by: Sunil Khatri <sunil.kha...@amd.com <mailto:christian.koe...@amd.com>>

On 10/25/2024 8:05 AM, boyuan.zh...@amd.com wrote:
From: Boyuan Zhang <boyuan.zh...@amd.com>

Pass instance parameter to amdgpu_vcn_early_init(), and perform
early init 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 | 23 ++++++++++++-----------
  drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h |  2 +-
  drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c   |  3 ++-
  drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c   |  3 ++-
  drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c   | 13 ++++++-------
  drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c   |  3 ++-
  drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c   | 12 +++++-------
  drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c |  3 ++-
  drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c |  3 ++-
  drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c |  3 ++-
  10 files changed, 36 insertions(+), 32 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index efd6c9eb3502..21701738030f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -91,22 +91,23 @@ MODULE_FIRMWARE(FIRMWARE_VCN5_0_0);
static void amdgpu_vcn_idle_work_handler(struct work_struct *work); -int amdgpu_vcn_early_init(struct amdgpu_device *adev)
+int amdgpu_vcn_early_init(struct amdgpu_device *adev, int inst)
  {
        char ucode_prefix[25];
-       int r, i;
+       int r;
amdgpu_ucode_ip_version_decode(adev, UVD_HWIP, ucode_prefix, sizeof(ucode_prefix));
-       for (i = 0; i < adev->vcn.num_vcn_inst; i++) {
-               if (i == 1 && amdgpu_ip_version(adev, UVD_HWIP, 0) ==  
IP_VERSION(4, 0, 6))
-                       r = amdgpu_ucode_request(adev, &adev->vcn.inst[i].fw, 
"amdgpu/%s_%d.bin", ucode_prefix, i);
-               else
-                       r = amdgpu_ucode_request(adev, &adev->vcn.inst[i].fw, 
"amdgpu/%s.bin", ucode_prefix);
-               if (r) {
-                       amdgpu_ucode_release(&adev->vcn.inst[i].fw);
-                       return r;
-               }
+
+       if (inst == 1 && amdgpu_ip_version(adev, UVD_HWIP, 0) ==  IP_VERSION(4, 
0, 6))
+               r = amdgpu_ucode_request(adev, &adev->vcn.inst[inst].fw, 
"amdgpu/%s_%d.bin", ucode_prefix, inst);
+       else
+               r = amdgpu_ucode_request(adev, &adev->vcn.inst[inst].fw, 
"amdgpu/%s.bin", ucode_prefix);
+
+       if (r) {
+               amdgpu_ucode_release(&adev->vcn.inst[inst].fw);
+               return r;
        }
+
        return r;
  }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
index 2282c4d14ae7..58fbb87e5ec4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
@@ -483,7 +483,7 @@ enum vcn_ring_type {
        VCN_UNIFIED_RING,
  };
-int amdgpu_vcn_early_init(struct amdgpu_device *adev);
+int amdgpu_vcn_early_init(struct amdgpu_device *adev, int inst);
  int amdgpu_vcn_sw_init(struct amdgpu_device *adev);
  int amdgpu_vcn_sw_fini(struct amdgpu_device *adev);
  int amdgpu_vcn_suspend(struct amdgpu_device *adev);
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
index 8b860db34584..6fd509e6744d 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
@@ -104,6 +104,7 @@ static void vcn_v1_0_ring_begin_use(struct amdgpu_ring 
*ring);
  static int vcn_v1_0_early_init(struct amdgpu_ip_block *ip_block)
  {
        struct amdgpu_device *adev = ip_block->adev;
+       int inst = ip_block->instance;
adev->vcn.num_enc_rings = 2; @@ -113,7 +114,7 @@ static int vcn_v1_0_early_init(struct amdgpu_ip_block *ip_block) jpeg_v1_0_early_init(ip_block); - return amdgpu_vcn_early_init(adev);
+       return amdgpu_vcn_early_init(adev, inst);
  }
/**
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
index 419ecba12c9b..8f7038190a43 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
@@ -108,6 +108,7 @@ static int vcn_v2_0_start_sriov(struct amdgpu_device *adev);
  static int vcn_v2_0_early_init(struct amdgpu_ip_block *ip_block)
  {
        struct amdgpu_device *adev = ip_block->adev;
+       int inst = ip_block->instance;
if (amdgpu_sriov_vf(adev))
                adev->vcn.num_enc_rings = 1;
@@ -118,7 +119,7 @@ static int vcn_v2_0_early_init(struct amdgpu_ip_block 
*ip_block)
        vcn_v2_0_set_enc_ring_funcs(adev);
        vcn_v2_0_set_irq_funcs(adev);
- return amdgpu_vcn_early_init(adev);
+       return amdgpu_vcn_early_init(adev, inst);
  }
/**
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
index 7e7ce00806cc..74814370ddc9 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
@@ -118,6 +118,7 @@ static int amdgpu_ih_clientid_vcns[] = {
  static int vcn_v2_5_early_init(struct amdgpu_ip_block *ip_block)
  {
        struct amdgpu_device *adev = ip_block->adev;
+       int inst = ip_block->instance;
if (amdgpu_sriov_vf(adev)) {
                adev->vcn.num_vcn_inst = 2;
@@ -125,13 +126,11 @@ static int vcn_v2_5_early_init(struct amdgpu_ip_block 
*ip_block)
                adev->vcn.num_enc_rings = 1;
        } else {
                u32 harvest;
-               int i;
- for (i = 0; i < adev->vcn.num_vcn_inst; i++) {
-                       harvest = RREG32_SOC15(VCN, i, mmCC_UVD_HARVESTING);
-                       if (harvest & CC_UVD_HARVESTING__UVD_DISABLE_MASK)
-                               adev->vcn.harvest_config |= 1 << i;
-               }
+               harvest = RREG32_SOC15(VCN, inst, mmCC_UVD_HARVESTING);
+               if (harvest & CC_UVD_HARVESTING__UVD_DISABLE_MASK)
+                       adev->vcn.harvest_config |= 1 << inst;
+
                if (adev->vcn.harvest_config == (AMDGPU_VCN_HARVEST_VCN0 |
                                        AMDGPU_VCN_HARVEST_VCN1))
                        /* both instances are harvested, disable the block */
@@ -145,7 +144,7 @@ static int vcn_v2_5_early_init(struct amdgpu_ip_block 
*ip_block)
        vcn_v2_5_set_irq_funcs(adev);
        vcn_v2_5_set_ras_funcs(adev);
- return amdgpu_vcn_early_init(adev);
+       return amdgpu_vcn_early_init(adev, inst);
  }
/**
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
index ca4ee368db02..a7fb5dda51dd 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
@@ -124,6 +124,7 @@ static void vcn_v3_0_enc_ring_set_wptr(struct amdgpu_ring 
*ring);
  static int vcn_v3_0_early_init(struct amdgpu_ip_block *ip_block)
  {
        struct amdgpu_device *adev = ip_block->adev;
+       int inst = ip_block->instance;
if (amdgpu_sriov_vf(adev)) {
                adev->vcn.num_vcn_inst = VCN_INSTANCES_SIENNA_CICHLID;
@@ -147,7 +148,7 @@ static int vcn_v3_0_early_init(struct amdgpu_ip_block 
*ip_block)
        vcn_v3_0_set_enc_ring_funcs(adev);
        vcn_v3_0_set_irq_funcs(adev);
- return amdgpu_vcn_early_init(adev);
+       return amdgpu_vcn_early_init(adev, inst);
  }
/**
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
index ee6c08707312..c0c2a071ea15 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
@@ -114,15 +114,13 @@ static void vcn_v4_0_set_ras_funcs(struct amdgpu_device 
*adev);
  static int vcn_v4_0_early_init(struct amdgpu_ip_block *ip_block)
  {
        struct amdgpu_device *adev = ip_block->adev;
-       int i;
+       int inst = ip_block->instance;
if (amdgpu_sriov_vf(adev)) {
                adev->vcn.harvest_config = VCN_HARVEST_MMSCH;
-               for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
-                       if (amdgpu_vcn_is_disabled_vcn(adev, VCN_ENCODE_RING, 
i)) {
-                               adev->vcn.harvest_config |= 1 << i;
-                               dev_info(adev->dev, "VCN%d is disabled by 
hypervisor\n", i);
-                       }
+               if (amdgpu_vcn_is_disabled_vcn(adev, VCN_ENCODE_RING, inst)) {
+                       adev->vcn.harvest_config |= 1 << inst;
+                       dev_info(adev->dev, "VCN%d is disabled by 
hypervisor\n", inst);
                }
        }
@@ -133,7 +131,7 @@ static int vcn_v4_0_early_init(struct amdgpu_ip_block *ip_block)
        vcn_v4_0_set_irq_funcs(adev);
        vcn_v4_0_set_ras_funcs(adev);
- return amdgpu_vcn_early_init(adev);
+       return amdgpu_vcn_early_init(adev, inst);
  }
static int vcn_v4_0_fw_shared_init(struct amdgpu_device *adev, int inst_idx)
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 2c66a7a4ff25..1d1ee6da7647 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
@@ -105,6 +105,7 @@ static void vcn_v4_0_3_enable_ras(struct amdgpu_device 
*adev,
  static int vcn_v4_0_3_early_init(struct amdgpu_ip_block *ip_block)
  {
        struct amdgpu_device *adev = ip_block->adev;
+       int inst = ip_block->instance;
/* re-use enc ring as unified ring */
        adev->vcn.num_enc_rings = 1;
@@ -113,7 +114,7 @@ static int vcn_v4_0_3_early_init(struct amdgpu_ip_block 
*ip_block)
        vcn_v4_0_3_set_irq_funcs(adev);
        vcn_v4_0_3_set_ras_funcs(adev);
- return amdgpu_vcn_early_init(adev);
+       return amdgpu_vcn_early_init(adev, inst);
  }
/**
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 d725c12ffdaf..81efc53e7cd3 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
@@ -112,13 +112,14 @@ static void vcn_v4_0_5_unified_ring_set_wptr(struct 
amdgpu_ring *ring);
  static int vcn_v4_0_5_early_init(struct amdgpu_ip_block *ip_block)
  {
        struct amdgpu_device *adev = ip_block->adev;
+       int inst = ip_block->instance;
/* re-use enc ring as unified ring */
        adev->vcn.num_enc_rings = 1;
        vcn_v4_0_5_set_unified_ring_funcs(adev);
        vcn_v4_0_5_set_irq_funcs(adev);
- return amdgpu_vcn_early_init(adev);
+       return amdgpu_vcn_early_init(adev, inst);
  }
/**
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 3856388179b8..7873ca91da4c 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
@@ -95,6 +95,7 @@ static void vcn_v5_0_0_unified_ring_set_wptr(struct 
amdgpu_ring *ring);
  static int vcn_v5_0_0_early_init(struct amdgpu_ip_block *ip_block)
  {
        struct amdgpu_device *adev = ip_block->adev;
+       int inst = ip_block->instance;
/* re-use enc ring as unified ring */
        adev->vcn.num_enc_rings = 1;
@@ -102,7 +103,7 @@ static int vcn_v5_0_0_early_init(struct amdgpu_ip_block 
*ip_block)
        vcn_v5_0_0_set_unified_ring_funcs(adev);
        vcn_v5_0_0_set_irq_funcs(adev);
- return amdgpu_vcn_early_init(adev);
+       return amdgpu_vcn_early_init(adev, inst);
  }
/**

Reply via email to