[PATCH v2] drm/amdgpu: Add DPG pause for VCN v5.0.1
Liu, Leo
Leo.Liu at amd.com
Mon Apr 28 13:11:18 UTC 2025
[AMD Official Use Only - AMD Internal Distribution Only]
Reviewed-by: Leo Liu <leo.liu at amd.com>
> -----Original Message-----
> From: amd-gfx <amd-gfx-bounces at lists.freedesktop.org> On Behalf Of Sonny
> Jiang
> Sent: April 25, 2025 12:42 PM
> To: amd-gfx at lists.freedesktop.org
> Cc: Jiang, Sonny <Sonny.Jiang at amd.com>
> Subject: [PATCH v2] drm/amdgpu: Add DPG pause for VCN v5.0.1
>
> For vcn5.0.1 only, enable DPG PAUSE to avoid DPG resets.
>
> Signed-off-by: Sonny Jiang <sonny.jiang at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c | 54
> +++++++++++++++++++++++++
> 1 file changed, 54 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c
> b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c
> index 4b2e6a033831..60ee6e02e6ac 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c
> @@ -502,6 +502,52 @@ static void vcn_v5_0_1_enable_clock_gating(struct
> amdgpu_vcn_inst *vinst)
> {
> }
>
> +/**
> + * vcn_v5_0_1_pause_dpg_mode - VCN pause with dpg mode
> + *
> + * @vinst: VCN instance
> + * @new_state: pause state
> + *
> + * Pause dpg mode for VCN block
> + */
> +static int vcn_v5_0_1_pause_dpg_mode(struct amdgpu_vcn_inst *vinst,
> + struct dpg_pause_state *new_state)
> +{
> + struct amdgpu_device *adev = vinst->adev;
> + uint32_t reg_data = 0;
> + int vcn_inst;
> +
> + vcn_inst = GET_INST(VCN, vinst->inst);
> +
> + /* pause/unpause if state is changed */
> + if (vinst->pause_state.fw_based != new_state->fw_based) {
> + DRM_DEV_DEBUG(adev->dev, "dpg pause state changed %d -
> > %d %s\n",
> + vinst->pause_state.fw_based, new_state->fw_based,
> + new_state->fw_based ? "VCN_DPG_STATE__PAUSE" :
> "VCN_DPG_STATE__UNPAUSE");
> + reg_data = RREG32_SOC15(VCN, vcn_inst,
> regUVD_DPG_PAUSE) &
> + (~UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK);
> +
> + if (new_state->fw_based == VCN_DPG_STATE__PAUSE) {
> + /* pause DPG */
> + reg_data |=
> UVD_DPG_PAUSE__NJ_PAUSE_DPG_REQ_MASK;
> + WREG32_SOC15(VCN, vcn_inst, regUVD_DPG_PAUSE,
> reg_data);
> +
> + /* wait for ACK */
> + SOC15_WAIT_ON_RREG(VCN, vcn_inst,
> regUVD_DPG_PAUSE,
> +
> UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK,
> +
> UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK);
> + } else {
> + /* unpause DPG, no need to wait */
> + reg_data &=
> ~UVD_DPG_PAUSE__NJ_PAUSE_DPG_REQ_MASK;
> + WREG32_SOC15(VCN, vcn_inst, regUVD_DPG_PAUSE,
> reg_data);
> + }
> + vinst->pause_state.fw_based = new_state->fw_based;
> + }
> +
> + return 0;
> +}
> +
> +
> /**
> * vcn_v5_0_1_start_dpg_mode - VCN start with dpg mode
> *
> @@ -518,6 +564,7 @@ static int vcn_v5_0_1_start_dpg_mode(struct
> amdgpu_vcn_inst *vinst,
> volatile struct amdgpu_vcn5_fw_shared *fw_shared =
> adev->vcn.inst[inst_idx].fw_shared.cpu_addr;
> struct amdgpu_ring *ring;
> + struct dpg_pause_state state = {.fw_based =
> VCN_DPG_STATE__PAUSE};
> int vcn_inst;
> uint32_t tmp;
>
> @@ -582,6 +629,9 @@ static int vcn_v5_0_1_start_dpg_mode(struct
> amdgpu_vcn_inst *vinst,
> if (indirect)
> amdgpu_vcn_psp_update_sram(adev, inst_idx,
> AMDGPU_UCODE_ID_VCN0_RAM);
>
> + /* Pause dpg */
> + vcn_v5_0_1_pause_dpg_mode(vinst, &state);
> +
> ring = &adev->vcn.inst[inst_idx].ring_enc[0];
>
> WREG32_SOC15(VCN, vcn_inst, regUVD_RB_BASE_LO,
> lower_32_bits(ring->gpu_addr));
> @@ -775,9 +825,13 @@ static void vcn_v5_0_1_stop_dpg_mode(struct
> amdgpu_vcn_inst *vinst)
> int inst_idx = vinst->inst;
> uint32_t tmp;
> int vcn_inst;
> + struct dpg_pause_state state = {.fw_based =
> VCN_DPG_STATE__UNPAUSE};
>
> vcn_inst = GET_INST(VCN, inst_idx);
>
> + /* Unpause dpg */
> + vcn_v5_0_1_pause_dpg_mode(vinst, &state);
> +
> /* Wait for power status to be 1 */
> SOC15_WAIT_ON_RREG(VCN, vcn_inst, regUVD_POWER_STATUS, 1,
> UVD_POWER_STATUS__UVD_POWER_STATUS_MASK);
> --
> 2.49.0
More information about the amd-gfx
mailing list