Only increment the power profile on the first submission. Since the decrement may end up being pushed out as new submissions come in, we only need to increment it once. Fixes: 1443dd3c67f6 ("drm/amd/pm: fix and simplify workload handling”) Cc: Yang Wang <kevinyang.wang@xxxxxxx> Cc: Kenneth Feng <kenneth.feng@xxxxxxx> Signed-off-by: Alex Deucher <alexander.deucher@xxxxxxx> --- drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c index ff03436698a4f..2248c4400b459 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c @@ -160,17 +160,31 @@ static void vcn_v2_5_ring_begin_use(struct amdgpu_ring *ring) { struct amdgpu_device *adev = ring->adev; struct amdgpu_vcn_inst *v = &adev->vcn.inst[ring->me]; + unsigned int fences = 0; + unsigned int i, j; int r = 0; - atomic_inc(&adev->vcn.inst[0].total_submission_cnt); + for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { + struct amdgpu_vcn_inst *v = &adev->vcn.inst[i]; + + if (adev->vcn.harvest_config & (1 << i)) + continue; + + for (j = 0; j < v->num_enc_rings; ++j) + fences += amdgpu_fence_count_emitted(&v->ring_enc[j]); + fences += amdgpu_fence_count_emitted(&v->ring_dec); + } - if (!cancel_delayed_work_sync(&adev->vcn.inst[0].idle_work)) { + if (!cancel_delayed_work_sync(&adev->vcn.inst[0].idle_work) && !fences && + !atomic_read(&adev->vcn.inst[0].total_submission_cnt)) { 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); } + atomic_inc(&adev->vcn.inst[0].total_submission_cnt); + mutex_lock(&adev->vcn.inst[0].vcn_pg_lock); amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCN, AMD_PG_STATE_UNGATE); -- 2.48.1