@@ -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,15 +1565,22 @@ 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 );
@@ -1574,6 +1590,10 @@ static int vcn_v3_0_pause_dpg_mode(struct amdgpu_device *adev,
15741590 WREG32_SOC15 (VCN , inst_idx , mmUVD_RBC_RB_WPTR ,
15751591 RREG32_SOC15 (VCN , inst_idx , mmUVD_SCRATCH2 ) & 0x7FFFFFFF );
15761592
1593+ /* Unstall DPG */
1594+ WREG32_P (SOC15_REG_OFFSET (VCN , inst_idx , mmUVD_POWER_STATUS ),
1595+ 0 , ~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK );
1596+
15771597 SOC15_WAIT_ON_RREG (VCN , inst_idx , mmUVD_POWER_STATUS ,
15781598 UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON , UVD_POWER_STATUS__UVD_POWER_STATUS_MASK );
15791599 }
0 commit comments