[PATCH 32/44] drm/amdgpu/vcn: use per instance callbacks for idle work handler
Boyuan Zhang
Boyuan.Zhang at amd.com
Thu Feb 6 13:53:21 UTC 2025
On 2025-01-31 11:57, Alex Deucher wrote:
> 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<alexander.deucher at amd.com>
Reviewed-by: Boyuan Zhang <Boyuan.Zhang at amd.com>
<mailto:Boyuan.Zhang at amd.com>
> ---
> 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)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/amd-gfx/attachments/20250206/32930fc6/attachment.htm>
More information about the amd-gfx
mailing list