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

Perform set_powergating_state only for the instance of the current vcn
IP block, instead of perform it for all vcn instances.

Signed-off-by: Boyuan Zhang <boyuan.zh...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c   | 313 ++++++++++++------------
 drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c   |  20 +-
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c   |  20 +-
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c |  19 +-
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c |  20 +-
 drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c |  20 +-
 6 files changed, 199 insertions(+), 213 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
index 0b62729fca89..d41211d35013 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
@@ -612,114 +612,111 @@ static void vcn_v2_5_mc_resume_dpg_mode(struct 
amdgpu_device *adev, int inst_idx
  *
  * Disable clock gating for VCN block
  */
-static void vcn_v2_5_disable_clock_gating(struct amdgpu_device *adev)
+static void vcn_v2_5_disable_clock_gating(struct amdgpu_device *adev, int inst)
 {
        uint32_t data;
-       int i;
 
-       for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
-               if (adev->vcn.harvest_config & (1 << i))
-                       continue;
-               /* UVD disable CGC */
-               data = RREG32_SOC15(VCN, i, mmUVD_CGC_CTRL);
-               if (adev->cg_flags & AMD_CG_SUPPORT_VCN_MGCG)
-                       data |= 1 << UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
-               else
-                       data &= ~UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK;
-               data |= 1 << UVD_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT;
-               data |= 4 << UVD_CGC_CTRL__CLK_OFF_DELAY__SHIFT;
-               WREG32_SOC15(VCN, i, mmUVD_CGC_CTRL, data);
-
-               data = RREG32_SOC15(VCN, i, mmUVD_CGC_GATE);
-               data &= ~(UVD_CGC_GATE__SYS_MASK
-                       | UVD_CGC_GATE__UDEC_MASK
-                       | UVD_CGC_GATE__MPEG2_MASK
-                       | UVD_CGC_GATE__REGS_MASK
-                       | UVD_CGC_GATE__RBC_MASK
-                       | UVD_CGC_GATE__LMI_MC_MASK
-                       | UVD_CGC_GATE__LMI_UMC_MASK
-                       | UVD_CGC_GATE__IDCT_MASK
-                       | UVD_CGC_GATE__MPRD_MASK
-                       | UVD_CGC_GATE__MPC_MASK
-                       | UVD_CGC_GATE__LBSI_MASK
-                       | UVD_CGC_GATE__LRBBM_MASK
-                       | UVD_CGC_GATE__UDEC_RE_MASK
-                       | UVD_CGC_GATE__UDEC_CM_MASK
-                       | UVD_CGC_GATE__UDEC_IT_MASK
-                       | UVD_CGC_GATE__UDEC_DB_MASK
-                       | UVD_CGC_GATE__UDEC_MP_MASK
-                       | UVD_CGC_GATE__WCB_MASK
-                       | UVD_CGC_GATE__VCPU_MASK
-                       | UVD_CGC_GATE__MMSCH_MASK);
-
-               WREG32_SOC15(VCN, i, mmUVD_CGC_GATE, data);
-
-               SOC15_WAIT_ON_RREG(VCN, i, mmUVD_CGC_GATE, 0,  0xFFFFFFFF);
-
-               data = RREG32_SOC15(VCN, i, mmUVD_CGC_CTRL);
-               data &= ~(UVD_CGC_CTRL__UDEC_RE_MODE_MASK
-                       | UVD_CGC_CTRL__UDEC_CM_MODE_MASK
-                       | UVD_CGC_CTRL__UDEC_IT_MODE_MASK
-                       | UVD_CGC_CTRL__UDEC_DB_MODE_MASK
-                       | UVD_CGC_CTRL__UDEC_MP_MODE_MASK
-                       | UVD_CGC_CTRL__SYS_MODE_MASK
-                       | UVD_CGC_CTRL__UDEC_MODE_MASK
-                       | UVD_CGC_CTRL__MPEG2_MODE_MASK
-                       | UVD_CGC_CTRL__REGS_MODE_MASK
-                       | UVD_CGC_CTRL__RBC_MODE_MASK
-                       | UVD_CGC_CTRL__LMI_MC_MODE_MASK
-                       | UVD_CGC_CTRL__LMI_UMC_MODE_MASK
-                       | UVD_CGC_CTRL__IDCT_MODE_MASK
-                       | UVD_CGC_CTRL__MPRD_MODE_MASK
-                       | UVD_CGC_CTRL__MPC_MODE_MASK
-                       | UVD_CGC_CTRL__LBSI_MODE_MASK
-                       | UVD_CGC_CTRL__LRBBM_MODE_MASK
-                       | UVD_CGC_CTRL__WCB_MODE_MASK
-                       | UVD_CGC_CTRL__VCPU_MODE_MASK
-                       | UVD_CGC_CTRL__MMSCH_MODE_MASK);
-               WREG32_SOC15(VCN, i, mmUVD_CGC_CTRL, data);
-
-               /* turn on */
-               data = RREG32_SOC15(VCN, i, mmUVD_SUVD_CGC_GATE);
-               data |= (UVD_SUVD_CGC_GATE__SRE_MASK
-                       | UVD_SUVD_CGC_GATE__SIT_MASK
-                       | UVD_SUVD_CGC_GATE__SMP_MASK
-                       | UVD_SUVD_CGC_GATE__SCM_MASK
-                       | UVD_SUVD_CGC_GATE__SDB_MASK
-                       | UVD_SUVD_CGC_GATE__SRE_H264_MASK
-                       | UVD_SUVD_CGC_GATE__SRE_HEVC_MASK
-                       | UVD_SUVD_CGC_GATE__SIT_H264_MASK
-                       | UVD_SUVD_CGC_GATE__SIT_HEVC_MASK
-                       | UVD_SUVD_CGC_GATE__SCM_H264_MASK
-                       | UVD_SUVD_CGC_GATE__SCM_HEVC_MASK
-                       | UVD_SUVD_CGC_GATE__SDB_H264_MASK
-                       | UVD_SUVD_CGC_GATE__SDB_HEVC_MASK
-                       | UVD_SUVD_CGC_GATE__SCLR_MASK
-                       | UVD_SUVD_CGC_GATE__UVD_SC_MASK
-                       | UVD_SUVD_CGC_GATE__ENT_MASK
-                       | UVD_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK
-                       | UVD_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK
-                       | UVD_SUVD_CGC_GATE__SITE_MASK
-                       | UVD_SUVD_CGC_GATE__SRE_VP9_MASK
-                       | UVD_SUVD_CGC_GATE__SCM_VP9_MASK
-                       | UVD_SUVD_CGC_GATE__SIT_VP9_DEC_MASK
-                       | UVD_SUVD_CGC_GATE__SDB_VP9_MASK
-                       | UVD_SUVD_CGC_GATE__IME_HEVC_MASK);
-               WREG32_SOC15(VCN, i, mmUVD_SUVD_CGC_GATE, data);
-
-               data = RREG32_SOC15(VCN, i, mmUVD_SUVD_CGC_CTRL);
-               data &= ~(UVD_SUVD_CGC_CTRL__SRE_MODE_MASK
-                       | UVD_SUVD_CGC_CTRL__SIT_MODE_MASK
-                       | UVD_SUVD_CGC_CTRL__SMP_MODE_MASK
-                       | UVD_SUVD_CGC_CTRL__SCM_MODE_MASK
-                       | UVD_SUVD_CGC_CTRL__SDB_MODE_MASK
-                       | UVD_SUVD_CGC_CTRL__SCLR_MODE_MASK
-                       | UVD_SUVD_CGC_CTRL__UVD_SC_MODE_MASK
-                       | UVD_SUVD_CGC_CTRL__ENT_MODE_MASK
-                       | UVD_SUVD_CGC_CTRL__IME_MODE_MASK
-                       | UVD_SUVD_CGC_CTRL__SITE_MODE_MASK);
-               WREG32_SOC15(VCN, i, mmUVD_SUVD_CGC_CTRL, data);
-       }
+       if (adev->vcn.harvest_config & (1 << inst))
+               return;
+       /* UVD disable CGC */
+       data = RREG32_SOC15(VCN, inst, mmUVD_CGC_CTRL);
+       if (adev->cg_flags & AMD_CG_SUPPORT_VCN_MGCG)
+               data |= 1 << UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
+       else
+               data &= ~UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK;
+       data |= 1 << UVD_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT;
+       data |= 4 << UVD_CGC_CTRL__CLK_OFF_DELAY__SHIFT;
+       WREG32_SOC15(VCN, inst, mmUVD_CGC_CTRL, data);
+
+       data = RREG32_SOC15(VCN, inst, mmUVD_CGC_GATE);
+       data &= ~(UVD_CGC_GATE__SYS_MASK
+               | UVD_CGC_GATE__UDEC_MASK
+               | UVD_CGC_GATE__MPEG2_MASK
+               | UVD_CGC_GATE__REGS_MASK
+               | UVD_CGC_GATE__RBC_MASK
+               | UVD_CGC_GATE__LMI_MC_MASK
+               | UVD_CGC_GATE__LMI_UMC_MASK
+               | UVD_CGC_GATE__IDCT_MASK
+               | UVD_CGC_GATE__MPRD_MASK
+               | UVD_CGC_GATE__MPC_MASK
+               | UVD_CGC_GATE__LBSI_MASK
+               | UVD_CGC_GATE__LRBBM_MASK
+               | UVD_CGC_GATE__UDEC_RE_MASK
+               | UVD_CGC_GATE__UDEC_CM_MASK
+               | UVD_CGC_GATE__UDEC_IT_MASK
+               | UVD_CGC_GATE__UDEC_DB_MASK
+               | UVD_CGC_GATE__UDEC_MP_MASK
+               | UVD_CGC_GATE__WCB_MASK
+               | UVD_CGC_GATE__VCPU_MASK
+               | UVD_CGC_GATE__MMSCH_MASK);
+
+       WREG32_SOC15(VCN, inst, mmUVD_CGC_GATE, data);
+
+       SOC15_WAIT_ON_RREG(VCN, inst, mmUVD_CGC_GATE, 0,  0xFFFFFFFF);
+
+       data = RREG32_SOC15(VCN, inst, mmUVD_CGC_CTRL);
+       data &= ~(UVD_CGC_CTRL__UDEC_RE_MODE_MASK
+               | UVD_CGC_CTRL__UDEC_CM_MODE_MASK
+               | UVD_CGC_CTRL__UDEC_IT_MODE_MASK
+               | UVD_CGC_CTRL__UDEC_DB_MODE_MASK
+               | UVD_CGC_CTRL__UDEC_MP_MODE_MASK
+               | UVD_CGC_CTRL__SYS_MODE_MASK
+               | UVD_CGC_CTRL__UDEC_MODE_MASK
+               | UVD_CGC_CTRL__MPEG2_MODE_MASK
+               | UVD_CGC_CTRL__REGS_MODE_MASK
+               | UVD_CGC_CTRL__RBC_MODE_MASK
+               | UVD_CGC_CTRL__LMI_MC_MODE_MASK
+               | UVD_CGC_CTRL__LMI_UMC_MODE_MASK
+               | UVD_CGC_CTRL__IDCT_MODE_MASK
+               | UVD_CGC_CTRL__MPRD_MODE_MASK
+               | UVD_CGC_CTRL__MPC_MODE_MASK
+               | UVD_CGC_CTRL__LBSI_MODE_MASK
+               | UVD_CGC_CTRL__LRBBM_MODE_MASK
+               | UVD_CGC_CTRL__WCB_MODE_MASK
+               | UVD_CGC_CTRL__VCPU_MODE_MASK
+               | UVD_CGC_CTRL__MMSCH_MODE_MASK);
+       WREG32_SOC15(VCN, inst, mmUVD_CGC_CTRL, data);
+
+       /* turn on */
+       data = RREG32_SOC15(VCN, inst, mmUVD_SUVD_CGC_GATE);
+       data |= (UVD_SUVD_CGC_GATE__SRE_MASK
+               | UVD_SUVD_CGC_GATE__SIT_MASK
+               | UVD_SUVD_CGC_GATE__SMP_MASK
+               | UVD_SUVD_CGC_GATE__SCM_MASK
+               | UVD_SUVD_CGC_GATE__SDB_MASK
+               | UVD_SUVD_CGC_GATE__SRE_H264_MASK
+               | UVD_SUVD_CGC_GATE__SRE_HEVC_MASK
+               | UVD_SUVD_CGC_GATE__SIT_H264_MASK
+               | UVD_SUVD_CGC_GATE__SIT_HEVC_MASK
+               | UVD_SUVD_CGC_GATE__SCM_H264_MASK
+               | UVD_SUVD_CGC_GATE__SCM_HEVC_MASK
+               | UVD_SUVD_CGC_GATE__SDB_H264_MASK
+               | UVD_SUVD_CGC_GATE__SDB_HEVC_MASK
+               | UVD_SUVD_CGC_GATE__SCLR_MASK
+               | UVD_SUVD_CGC_GATE__UVD_SC_MASK
+               | UVD_SUVD_CGC_GATE__ENT_MASK
+               | UVD_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK
+               | UVD_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK
+               | UVD_SUVD_CGC_GATE__SITE_MASK
+               | UVD_SUVD_CGC_GATE__SRE_VP9_MASK
+               | UVD_SUVD_CGC_GATE__SCM_VP9_MASK
+               | UVD_SUVD_CGC_GATE__SIT_VP9_DEC_MASK
+               | UVD_SUVD_CGC_GATE__SDB_VP9_MASK
+               | UVD_SUVD_CGC_GATE__IME_HEVC_MASK);
+       WREG32_SOC15(VCN, inst, mmUVD_SUVD_CGC_GATE, data);
+
+       data = RREG32_SOC15(VCN, inst, mmUVD_SUVD_CGC_CTRL);
+       data &= ~(UVD_SUVD_CGC_CTRL__SRE_MODE_MASK
+               | UVD_SUVD_CGC_CTRL__SIT_MODE_MASK
+               | UVD_SUVD_CGC_CTRL__SMP_MODE_MASK
+               | UVD_SUVD_CGC_CTRL__SCM_MODE_MASK
+               | UVD_SUVD_CGC_CTRL__SDB_MODE_MASK
+               | UVD_SUVD_CGC_CTRL__SCLR_MODE_MASK
+               | UVD_SUVD_CGC_CTRL__UVD_SC_MODE_MASK
+               | UVD_SUVD_CGC_CTRL__ENT_MODE_MASK
+               | UVD_SUVD_CGC_CTRL__IME_MODE_MASK
+               | UVD_SUVD_CGC_CTRL__SITE_MODE_MASK);
+       WREG32_SOC15(VCN, inst, mmUVD_SUVD_CGC_CTRL, data);
 }
 
 static void vcn_v2_5_clock_gating_dpg_mode(struct amdgpu_device *adev,
@@ -777,59 +774,56 @@ static void vcn_v2_5_clock_gating_dpg_mode(struct 
amdgpu_device *adev,
  *
  * Enable clock gating for VCN block
  */
-static void vcn_v2_5_enable_clock_gating(struct amdgpu_device *adev)
+static void vcn_v2_5_enable_clock_gating(struct amdgpu_device *adev, int inst)
 {
        uint32_t data = 0;
-       int i;
 
-       for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
-               if (adev->vcn.harvest_config & (1 << i))
-                       continue;
-               /* enable UVD CGC */
-               data = RREG32_SOC15(VCN, i, mmUVD_CGC_CTRL);
-               if (adev->cg_flags & AMD_CG_SUPPORT_VCN_MGCG)
-                       data |= 1 << UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
-               else
-                       data |= 0 << UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
-               data |= 1 << UVD_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT;
-               data |= 4 << UVD_CGC_CTRL__CLK_OFF_DELAY__SHIFT;
-               WREG32_SOC15(VCN, i, mmUVD_CGC_CTRL, data);
-
-               data = RREG32_SOC15(VCN, i, mmUVD_CGC_CTRL);
-               data |= (UVD_CGC_CTRL__UDEC_RE_MODE_MASK
-                       | UVD_CGC_CTRL__UDEC_CM_MODE_MASK
-                       | UVD_CGC_CTRL__UDEC_IT_MODE_MASK
-                       | UVD_CGC_CTRL__UDEC_DB_MODE_MASK
-                       | UVD_CGC_CTRL__UDEC_MP_MODE_MASK
-                       | UVD_CGC_CTRL__SYS_MODE_MASK
-                       | UVD_CGC_CTRL__UDEC_MODE_MASK
-                       | UVD_CGC_CTRL__MPEG2_MODE_MASK
-                       | UVD_CGC_CTRL__REGS_MODE_MASK
-                       | UVD_CGC_CTRL__RBC_MODE_MASK
-                       | UVD_CGC_CTRL__LMI_MC_MODE_MASK
-                       | UVD_CGC_CTRL__LMI_UMC_MODE_MASK
-                       | UVD_CGC_CTRL__IDCT_MODE_MASK
-                       | UVD_CGC_CTRL__MPRD_MODE_MASK
-                       | UVD_CGC_CTRL__MPC_MODE_MASK
-                       | UVD_CGC_CTRL__LBSI_MODE_MASK
-                       | UVD_CGC_CTRL__LRBBM_MODE_MASK
-                       | UVD_CGC_CTRL__WCB_MODE_MASK
-                       | UVD_CGC_CTRL__VCPU_MODE_MASK);
-               WREG32_SOC15(VCN, i, mmUVD_CGC_CTRL, data);
-
-               data = RREG32_SOC15(VCN, i, mmUVD_SUVD_CGC_CTRL);
-               data |= (UVD_SUVD_CGC_CTRL__SRE_MODE_MASK
-                       | UVD_SUVD_CGC_CTRL__SIT_MODE_MASK
-                       | UVD_SUVD_CGC_CTRL__SMP_MODE_MASK
-                       | UVD_SUVD_CGC_CTRL__SCM_MODE_MASK
-                       | UVD_SUVD_CGC_CTRL__SDB_MODE_MASK
-                       | UVD_SUVD_CGC_CTRL__SCLR_MODE_MASK
-                       | UVD_SUVD_CGC_CTRL__UVD_SC_MODE_MASK
-                       | UVD_SUVD_CGC_CTRL__ENT_MODE_MASK
-                       | UVD_SUVD_CGC_CTRL__IME_MODE_MASK
-                       | UVD_SUVD_CGC_CTRL__SITE_MODE_MASK);
-               WREG32_SOC15(VCN, i, mmUVD_SUVD_CGC_CTRL, data);
-       }
+       if (adev->vcn.harvest_config & (1 << inst))
+               return;
+       /* enable UVD CGC */
+       data = RREG32_SOC15(VCN, inst, mmUVD_CGC_CTRL);
+       if (adev->cg_flags & AMD_CG_SUPPORT_VCN_MGCG)
+               data |= 1 << UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
+       else
+               data |= 0 << UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
+       data |= 1 << UVD_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT;
+       data |= 4 << UVD_CGC_CTRL__CLK_OFF_DELAY__SHIFT;
+       WREG32_SOC15(VCN, inst, mmUVD_CGC_CTRL, data);
+
+       data = RREG32_SOC15(VCN, inst, mmUVD_CGC_CTRL);
+       data |= (UVD_CGC_CTRL__UDEC_RE_MODE_MASK
+               | UVD_CGC_CTRL__UDEC_CM_MODE_MASK
+               | UVD_CGC_CTRL__UDEC_IT_MODE_MASK
+               | UVD_CGC_CTRL__UDEC_DB_MODE_MASK
+               | UVD_CGC_CTRL__UDEC_MP_MODE_MASK
+               | UVD_CGC_CTRL__SYS_MODE_MASK
+               | UVD_CGC_CTRL__UDEC_MODE_MASK
+               | UVD_CGC_CTRL__MPEG2_MODE_MASK
+               | UVD_CGC_CTRL__REGS_MODE_MASK
+               | UVD_CGC_CTRL__RBC_MODE_MASK
+               | UVD_CGC_CTRL__LMI_MC_MODE_MASK
+               | UVD_CGC_CTRL__LMI_UMC_MODE_MASK
+               | UVD_CGC_CTRL__IDCT_MODE_MASK
+               | UVD_CGC_CTRL__MPRD_MODE_MASK
+               | UVD_CGC_CTRL__MPC_MODE_MASK
+               | UVD_CGC_CTRL__LBSI_MODE_MASK
+               | UVD_CGC_CTRL__LRBBM_MODE_MASK
+               | UVD_CGC_CTRL__WCB_MODE_MASK
+               | UVD_CGC_CTRL__VCPU_MODE_MASK);
+       WREG32_SOC15(VCN, inst, mmUVD_CGC_CTRL, data);
+
+       data = RREG32_SOC15(VCN, inst, mmUVD_SUVD_CGC_CTRL);
+       data |= (UVD_SUVD_CGC_CTRL__SRE_MODE_MASK
+               | UVD_SUVD_CGC_CTRL__SIT_MODE_MASK
+               | UVD_SUVD_CGC_CTRL__SMP_MODE_MASK
+               | UVD_SUVD_CGC_CTRL__SCM_MODE_MASK
+               | UVD_SUVD_CGC_CTRL__SDB_MODE_MASK
+               | UVD_SUVD_CGC_CTRL__SCLR_MODE_MASK
+               | UVD_SUVD_CGC_CTRL__UVD_SC_MODE_MASK
+               | UVD_SUVD_CGC_CTRL__ENT_MODE_MASK
+               | UVD_SUVD_CGC_CTRL__IME_MODE_MASK
+               | UVD_SUVD_CGC_CTRL__SITE_MODE_MASK);
+       WREG32_SOC15(VCN, inst, mmUVD_SUVD_CGC_CTRL, data);
 }
 
 static void vcn_v2_6_enable_ras(struct amdgpu_device *adev, int inst_idx,
@@ -1032,7 +1026,7 @@ static int vcn_v2_5_start(struct amdgpu_device *adev, 
unsigned int inst)
                return 0;
 
        /*SW clock gating */
-       vcn_v2_5_disable_clock_gating(adev);
+       vcn_v2_5_disable_clock_gating(adev, inst);
 
        if (adev->vcn.harvest_config & (1 << inst))
                return 0;
@@ -1471,7 +1465,7 @@ static int vcn_v2_5_stop(struct amdgpu_device *adev, 
unsigned int inst)
        /* clear status */
        WREG32_SOC15(VCN, inst, mmUVD_STATUS, 0);
 
-       vcn_v2_5_enable_clock_gating(adev);
+       vcn_v2_5_enable_clock_gating(adev, inst);
 
        /* enable register anti-hang mechanism */
        WREG32_P(SOC15_REG_OFFSET(VCN, inst, mmUVD_POWER_STATUS),
@@ -1795,6 +1789,7 @@ static int vcn_v2_5_set_clockgating_state(struct 
amdgpu_ip_block *ip_block,
 {
        struct amdgpu_device *adev = ip_block->adev;
        bool enable = (state == AMD_CG_STATE_GATE);
+       int inst = ip_block->instance;
 
        if (amdgpu_sriov_vf(adev))
                return 0;
@@ -1802,9 +1797,9 @@ static int vcn_v2_5_set_clockgating_state(struct 
amdgpu_ip_block *ip_block,
        if (enable) {
                if (!vcn_v2_5_is_idle(ip_block))
                        return -EBUSY;
-               vcn_v2_5_enable_clock_gating(adev);
+               vcn_v2_5_enable_clock_gating(adev, inst);
        } else {
-               vcn_v2_5_disable_clock_gating(adev);
+               vcn_v2_5_disable_clock_gating(adev, inst);
        }
 
        return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
index 5b11062b873d..e89600e6f86c 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
@@ -2123,19 +2123,17 @@ static int vcn_v3_0_set_clockgating_state(struct 
amdgpu_ip_block *ip_block,
 {
        struct amdgpu_device *adev = ip_block->adev;
        bool enable = state == AMD_CG_STATE_GATE;
-       int i;
+       int inst = ip_block->instance;
 
-       for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
-               if (adev->vcn.harvest_config & (1 << i))
-                       continue;
+       if (adev->vcn.harvest_config & (1 << inst))
+               return 0;
 
-               if (enable) {
-                       if (RREG32_SOC15(VCN, i, mmUVD_STATUS) != 
UVD_STATUS__IDLE)
-                               return -EBUSY;
-                       vcn_v3_0_enable_clock_gating(adev, i);
-               } else {
-                       vcn_v3_0_disable_clock_gating(adev, i);
-               }
+       if (enable) {
+               if (RREG32_SOC15(VCN, inst, mmUVD_STATUS) != UVD_STATUS__IDLE)
+                       return -EBUSY;
+               vcn_v3_0_enable_clock_gating(adev, inst);
+       } else {
+               vcn_v3_0_disable_clock_gating(adev, inst);
        }
 
        return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
index 69fff5df1c68..e1b2ada8d69a 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
@@ -1994,19 +1994,17 @@ static int vcn_v4_0_set_clockgating_state(struct 
amdgpu_ip_block *ip_block,
 {
        struct amdgpu_device *adev = ip_block->adev;
        bool enable = state == AMD_CG_STATE_GATE;
-       int i;
+       int inst = ip_block->instance;
 
-       for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
-               if (adev->vcn.harvest_config & (1 << i))
-                       continue;
+       if (adev->vcn.harvest_config & (1 << inst))
+               return 0;
 
-               if (enable) {
-                       if (RREG32_SOC15(VCN, i, regUVD_STATUS) != 
UVD_STATUS__IDLE)
-                               return -EBUSY;
-                       vcn_v4_0_enable_clock_gating(adev, i);
-               } else {
-                       vcn_v4_0_disable_clock_gating(adev, i);
-               }
+       if (enable) {
+               if (RREG32_SOC15(VCN, inst, regUVD_STATUS) != UVD_STATUS__IDLE)
+                       return -EBUSY;
+               vcn_v4_0_enable_clock_gating(adev, inst);
+       } else {
+               vcn_v4_0_disable_clock_gating(adev, inst);
        }
 
        return 0;
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 cb30d5e5bc70..d1db91d8de79 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
@@ -1588,18 +1588,17 @@ static int vcn_v4_0_3_set_clockgating_state(struct 
amdgpu_ip_block *ip_block,
 {
        struct amdgpu_device *adev = ip_block->adev;
        bool enable = state == AMD_CG_STATE_GATE;
-       int i;
+       int inst = ip_block->instance;
 
-       for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
-               if (enable) {
-                       if (RREG32_SOC15(VCN, GET_INST(VCN, i),
-                                        regUVD_STATUS) != UVD_STATUS__IDLE)
-                               return -EBUSY;
-                       vcn_v4_0_3_enable_clock_gating(adev, i);
-               } else {
-                       vcn_v4_0_3_disable_clock_gating(adev, i);
-               }
+       if (enable) {
+               if (RREG32_SOC15(VCN, GET_INST(VCN, inst),
+                                regUVD_STATUS) != UVD_STATUS__IDLE)
+                       return -EBUSY;
+               vcn_v4_0_3_enable_clock_gating(adev, inst);
+       } else {
+               vcn_v4_0_3_disable_clock_gating(adev, inst);
        }
+
        return 0;
 }
 
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 68397bea5a18..0f178dcf23fc 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
@@ -1491,19 +1491,17 @@ static int vcn_v4_0_5_set_clockgating_state(struct 
amdgpu_ip_block *ip_block,
 {
        struct amdgpu_device *adev = ip_block->adev;
        bool enable = (state == AMD_CG_STATE_GATE) ? true : false;
-       int i;
+       int inst = ip_block->instance;
 
-       for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
-               if (adev->vcn.harvest_config & (1 << i))
-                       continue;
+       if (adev->vcn.harvest_config & (1 << inst))
+               return 0;
 
-               if (enable) {
-                       if (RREG32_SOC15(VCN, i, regUVD_STATUS) != 
UVD_STATUS__IDLE)
-                               return -EBUSY;
-                       vcn_v4_0_5_enable_clock_gating(adev, i);
-               } else {
-                       vcn_v4_0_5_disable_clock_gating(adev, i);
-               }
+       if (enable) {
+               if (RREG32_SOC15(VCN, inst, regUVD_STATUS) != UVD_STATUS__IDLE)
+                       return -EBUSY;
+               vcn_v4_0_5_enable_clock_gating(adev, inst);
+       } else {
+               vcn_v4_0_5_disable_clock_gating(adev, inst);
        }
 
        return 0;
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 fd78472b906a..c651de11e095 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
@@ -1218,19 +1218,17 @@ static int vcn_v5_0_0_set_clockgating_state(struct 
amdgpu_ip_block *ip_block,
 {
        struct amdgpu_device *adev = ip_block->adev;
        bool enable = (state == AMD_CG_STATE_GATE) ? true : false;
-       int i;
+       int inst = ip_block->instance;
 
-       for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
-               if (adev->vcn.harvest_config & (1 << i))
-                       continue;
+       if (adev->vcn.harvest_config & (1 << inst))
+               return 0;
 
-               if (enable) {
-                       if (RREG32_SOC15(VCN, i, regUVD_STATUS) != 
UVD_STATUS__IDLE)
-                               return -EBUSY;
-                       vcn_v5_0_0_enable_clock_gating(adev, i);
-               } else {
-                       vcn_v5_0_0_disable_clock_gating(adev, i);
-               }
+       if (enable) {
+               if (RREG32_SOC15(VCN, inst, regUVD_STATUS) != UVD_STATUS__IDLE)
+                       return -EBUSY;
+               vcn_v5_0_0_enable_clock_gating(adev, inst);
+       } else {
+               vcn_v5_0_0_disable_clock_gating(adev, inst);
        }
 
        return 0;
-- 
2.34.1

Reply via email to