@@ -1011,6 +1011,11 @@ static int vcn_v3_0_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boo
10111011 tmp = REG_SET_FIELD (tmp , UVD_RBC_RB_CNTL , RB_RPTR_WR_EN , 1 );
10121012 WREG32_SOC15 (VCN , inst_idx , mmUVD_RBC_RB_CNTL , tmp );
10131013
1014+ /* Stall DPG before WPTR/RPTR reset */
1015+ WREG32_P (SOC15_REG_OFFSET (VCN , inst_idx , mmUVD_POWER_STATUS ),
1016+ UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK ,
1017+ ~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK );
1018+
10141019 /* set the write pointer delay */
10151020 WREG32_SOC15 (VCN , inst_idx , mmUVD_RBC_RB_WPTR_CNTL , 0 );
10161021
@@ -1033,6 +1038,10 @@ static int vcn_v3_0_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boo
10331038 WREG32_SOC15 (VCN , inst_idx , mmUVD_RBC_RB_WPTR ,
10341039 lower_32_bits (ring -> wptr ));
10351040
1041+ /* Unstall DPG */
1042+ WREG32_P (SOC15_REG_OFFSET (VCN , inst_idx , mmUVD_POWER_STATUS ),
1043+ 0 , ~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK );
1044+
10361045 return 0 ;
10371046}
10381047
@@ -1556,23 +1565,31 @@ static int vcn_v3_0_pause_dpg_mode(struct amdgpu_device *adev,
15561565 UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK ,
15571566 UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK );
15581567
1568+ /* Stall DPG before WPTR/RPTR reset */
1569+ WREG32_P (SOC15_REG_OFFSET (VCN , inst_idx , mmUVD_POWER_STATUS ),
1570+ UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK ,
1571+ ~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK );
1572+
15591573 /* Restore */
15601574 ring = & adev -> vcn .inst [inst_idx ].ring_enc [0 ];
1575+ ring -> wptr = 0 ;
15611576 WREG32_SOC15 (VCN , inst_idx , mmUVD_RB_BASE_LO , ring -> gpu_addr );
15621577 WREG32_SOC15 (VCN , inst_idx , mmUVD_RB_BASE_HI , upper_32_bits (ring -> gpu_addr ));
15631578 WREG32_SOC15 (VCN , inst_idx , mmUVD_RB_SIZE , ring -> ring_size / 4 );
15641579 WREG32_SOC15 (VCN , inst_idx , mmUVD_RB_RPTR , lower_32_bits (ring -> wptr ));
15651580 WREG32_SOC15 (VCN , inst_idx , mmUVD_RB_WPTR , lower_32_bits (ring -> wptr ));
15661581
15671582 ring = & adev -> vcn .inst [inst_idx ].ring_enc [1 ];
1583+ ring -> wptr = 0 ;
15681584 WREG32_SOC15 (VCN , inst_idx , mmUVD_RB_BASE_LO2 , ring -> gpu_addr );
15691585 WREG32_SOC15 (VCN , inst_idx , mmUVD_RB_BASE_HI2 , upper_32_bits (ring -> gpu_addr ));
15701586 WREG32_SOC15 (VCN , inst_idx , mmUVD_RB_SIZE2 , ring -> ring_size / 4 );
15711587 WREG32_SOC15 (VCN , inst_idx , mmUVD_RB_RPTR2 , lower_32_bits (ring -> wptr ));
15721588 WREG32_SOC15 (VCN , inst_idx , mmUVD_RB_WPTR2 , lower_32_bits (ring -> wptr ));
15731589
1574- WREG32_SOC15 (VCN , inst_idx , mmUVD_RBC_RB_WPTR ,
1575- RREG32_SOC15 (VCN , inst_idx , mmUVD_SCRATCH2 ) & 0x7FFFFFFF );
1590+ /* Unstall DPG */
1591+ WREG32_P (SOC15_REG_OFFSET (VCN , inst_idx , mmUVD_POWER_STATUS ),
1592+ 0 , ~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK );
15761593
15771594 SOC15_WAIT_ON_RREG (VCN , inst_idx , mmUVD_POWER_STATUS ,
15781595 UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON , UVD_POWER_STATUS__UVD_POWER_STATUS_MASK );
@@ -1630,10 +1647,6 @@ static void vcn_v3_0_dec_ring_set_wptr(struct amdgpu_ring *ring)
16301647{
16311648 struct amdgpu_device * adev = ring -> adev ;
16321649
1633- if (adev -> pg_flags & AMD_PG_SUPPORT_VCN_DPG )
1634- WREG32_SOC15 (VCN , ring -> me , mmUVD_SCRATCH2 ,
1635- lower_32_bits (ring -> wptr ) | 0x80000000 );
1636-
16371650 if (ring -> use_doorbell ) {
16381651 adev -> wb .wb [ring -> wptr_offs ] = lower_32_bits (ring -> wptr );
16391652 WDOORBELL32 (ring -> doorbell_index , lower_32_bits (ring -> wptr ));
0 commit comments