<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 2025-01-31 11:57, Alex Deucher
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:20250131165741.1798488-33-alexander.deucher@amd.com">
      <pre class="moz-quote-pre" wrap="">Use the vcn instance power gating callbacks rather than
the IP powergating callback.  This limits power gating to
only the instance in use rather than all of the instances.

Signed-off-by: Alex Deucher <a class="moz-txt-link-rfc2396E" href="mailto:alexander.deucher@amd.com"><alexander.deucher@amd.com></a></pre>
    </blockquote>
    <p><br>
    </p>
    <p><font size="2"><span style="font-size:11pt;"><span data-markjs="true" data-olk-copy-source="MessageBody"><span data-markjs="true" class="mark5quw442ch" style="" data-ogac="" data-ogab="" data-ogsc="" data-ogsb="" data-olk-copy-source="MessageBody">Reviewed-by</span></span>:
          Boyuan Zhang <a href="mailto:Boyuan.Zhang@amd.com" title="mailto:Boyuan.Zhang@amd.com" data-linkindex="2"><Boyuan.Zhang@amd.com></a></span></font></p>
    <p></p>
    <p><br>
    </p>
    <blockquote type="cite" cite="mid:20250131165741.1798488-33-alexander.deucher@amd.com">
      <pre class="moz-quote-pre" wrap="">
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 27 ++++++++++++-------------
 1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index a2250747a7c81..81bfd8a9d8268 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -424,8 +424,7 @@ static void amdgpu_vcn_idle_work_handler(struct work_struct *work)
        fences += fence[i];
 
        if (!fences && !atomic_read(&vcn_inst->total_submission_cnt)) {
-               amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCN,
-                                                      AMD_PG_STATE_GATE);
+               vcn_inst->set_pg_state(vcn_inst, AMD_PG_STATE_GATE);
                r = amdgpu_dpm_switch_power_profile(adev, PP_SMC_POWER_PROFILE_VIDEO,
                                                    false);
                if (r)
@@ -438,45 +437,45 @@ static void amdgpu_vcn_idle_work_handler(struct work_struct *work)
 void amdgpu_vcn_ring_begin_use(struct amdgpu_ring *ring)
 {
        struct amdgpu_device *adev = ring->adev;
+       struct amdgpu_vcn_inst *vcn_inst = &adev->vcn.inst[ring->me];
        int r = 0;
 
-       atomic_inc(&adev->vcn.inst[ring->me].total_submission_cnt);
+       atomic_inc(&vcn_inst->total_submission_cnt);
 
-       if (!cancel_delayed_work_sync(&adev->vcn.inst[ring->me].idle_work)) {
+       if (!cancel_delayed_work_sync(&vcn_inst->idle_work)) {
                r = amdgpu_dpm_switch_power_profile(adev, PP_SMC_POWER_PROFILE_VIDEO,
                                true);
                if (r)
                        dev_warn(adev->dev, "(%d) failed to switch to video power profile mode\n", r);
        }
 
-       mutex_lock(&adev->vcn.inst[ring->me].vcn_pg_lock);
-       amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCN,
-                                              AMD_PG_STATE_UNGATE);
+       mutex_lock(&vcn_inst->vcn_pg_lock);
+       vcn_inst->set_pg_state(vcn_inst, AMD_PG_STATE_UNGATE);
 
        /* Only set DPG pause for VCN3 or below, VCN4 and above will be handled by FW */
        if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG &&
-           !adev->vcn.inst[ring->me].using_unified_queue) {
+           !vcn_inst->using_unified_queue) {
                struct dpg_pause_state new_state;
 
                if (ring->funcs->type == AMDGPU_RING_TYPE_VCN_ENC) {
-                       atomic_inc(&adev->vcn.inst[ring->me].dpg_enc_submission_cnt);
+                       atomic_inc(&vcn_inst->dpg_enc_submission_cnt);
                        new_state.fw_based = VCN_DPG_STATE__PAUSE;
                } else {
                        unsigned int fences = 0;
                        unsigned int i;
 
-                       for (i = 0; i < adev->vcn.inst[ring->me].num_enc_rings; ++i)
-                               fences += amdgpu_fence_count_emitted(&adev->vcn.inst[ring->me].ring_enc[i]);
+                       for (i = 0; i < vcn_inst->num_enc_rings; ++i)
+                               fences += amdgpu_fence_count_emitted(&vcn_inst->ring_enc[i]);
 
-                       if (fences || atomic_read(&adev->vcn.inst[ring->me].dpg_enc_submission_cnt))
+                       if (fences || atomic_read(&vcn_inst->dpg_enc_submission_cnt))
                                new_state.fw_based = VCN_DPG_STATE__PAUSE;
                        else
                                new_state.fw_based = VCN_DPG_STATE__UNPAUSE;
                }
 
-               adev->vcn.inst[ring->me].pause_dpg_mode(&adev->vcn.inst[ring->me], &new_state);
+               vcn_inst->pause_dpg_mode(vcn_inst, &new_state);
        }
-       mutex_unlock(&adev->vcn.inst[ring->me].vcn_pg_lock);
+       mutex_unlock(&vcn_inst->vcn_pg_lock);
 }
 
 void amdgpu_vcn_ring_end_use(struct amdgpu_ring *ring)
</pre>
    </blockquote>
  </body>
</html>