Skip to content

Commit ac2db94

Browse files
Boyz-Radeonalexdeucher
authored andcommitted
drm/amdgpu/vcn3.0: stall DPG when WPTR/RPTR reset
Port from VCN2.5 Add vcn dpg harware synchronization to fix race condition issue between vcn driver and hardware. Signed-off-by: Boyuan Zhang <boyuan.zhang@amd.com> Reviewed-by: James Zhu <James.Zhu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org # 5.9.x
1 parent 7e0b367 commit ac2db94

1 file changed

Lines changed: 20 additions & 0 deletions

File tree

drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)