Message ID | 20241009-mode3d-fix-v1-1-c0258354fadc@quicinc.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | drm/msm/dpu: Don't always set merge_3d pending flush | expand |
On Wed, Oct 09, 2024 at 08:41:13PM GMT, Jessica Zhang wrote: > Don't set the merge_3d pending flush bits if the mode_3d is > BLEND_3D_NONE. > > Always flushing merge_3d can cause timeout issues when there are > multiple commits with concurrent writeback enabled. > > This is because the video phys enc waits for the hw_ctl flush register > to be completely cleared [1] in its wait_for_commit_done(), but the WB > encoder always sets the merge_3d pending flush during each commit > regardless of if the merge_3d is actually active. > > This means that the hw_ctl flush register will never be 0 when there are > multiple CWB commits and the video phys enc will hit vblank timeout > errors after the first CWB commit. From this description, wouldn't it be more correct to always set intf_cfg.merge_3d in WB code (even if mode_3d is NONE)? > [1] commit fe9df3f50c39 ("drm/msm/dpu: add real wait_for_commit_done()") > > Fixes: 3e79527a33a8 ("drm/msm/dpu: enable merge_3d support on sm8150/sm8250") > Fixes: d7d0e73f7de3 ("drm/msm/dpu: introduce the dpu_encoder_phys_* for writeback") > Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com> > --- > drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 5 ++++- > drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 5 ++++- > 2 files changed, 8 insertions(+), 2 deletions(-) >
On 10/10/2024 8:20 AM, Dmitry Baryshkov wrote: > On Wed, Oct 09, 2024 at 08:41:13PM GMT, Jessica Zhang wrote: >> Don't set the merge_3d pending flush bits if the mode_3d is >> BLEND_3D_NONE. >> >> Always flushing merge_3d can cause timeout issues when there are >> multiple commits with concurrent writeback enabled. >> >> This is because the video phys enc waits for the hw_ctl flush register >> to be completely cleared [1] in its wait_for_commit_done(), but the WB >> encoder always sets the merge_3d pending flush during each commit >> regardless of if the merge_3d is actually active. >> >> This means that the hw_ctl flush register will never be 0 when there are >> multiple CWB commits and the video phys enc will hit vblank timeout >> errors after the first CWB commit. > > From this description, wouldn't it be more correct to always set > intf_cfg.merge_3d in WB code (even if mode_3d is NONE)? Hi Dmitry, This discussion should be addressed in [1]. Thanks, Jessica Zhang [1] https://patchwork.freedesktop.org/series/139824/ > >> [1] commit fe9df3f50c39 ("drm/msm/dpu: add real wait_for_commit_done()") >> >> Fixes: 3e79527a33a8 ("drm/msm/dpu: enable merge_3d support on sm8150/sm8250") >> Fixes: d7d0e73f7de3 ("drm/msm/dpu: introduce the dpu_encoder_phys_* for writeback") >> Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com> >> --- >> drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 5 ++++- >> drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 5 ++++- >> 2 files changed, 8 insertions(+), 2 deletions(-) >> > > -- > With best wishes > Dmitry
On Wed, Oct 09, 2024 at 08:41:13PM -0700, Jessica Zhang wrote: > Don't set the merge_3d pending flush bits if the mode_3d is > BLEND_3D_NONE. > > Always flushing merge_3d can cause timeout issues when there are > multiple commits with concurrent writeback enabled. > > This is because the video phys enc waits for the hw_ctl flush register > to be completely cleared [1] in its wait_for_commit_done(), but the WB > encoder always sets the merge_3d pending flush during each commit > regardless of if the merge_3d is actually active. > > This means that the hw_ctl flush register will never be 0 when there are > multiple CWB commits and the video phys enc will hit vblank timeout > errors after the first CWB commit. > > [1] commit fe9df3f50c39 ("drm/msm/dpu: add real wait_for_commit_done()") > > Fixes: 3e79527a33a8 ("drm/msm/dpu: enable merge_3d support on sm8150/sm8250") > Fixes: d7d0e73f7de3 ("drm/msm/dpu: introduce the dpu_encoder_phys_* for writeback") > Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com> > --- > drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 5 ++++- > drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 5 ++++- > 2 files changed, 8 insertions(+), 2 deletions(-) > Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c index ba8878d21cf0e1945a393cca806cb64f03b16640..8864ace938e03483492e25734f834fbdd615d127 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c @@ -440,10 +440,12 @@ static void dpu_encoder_phys_vid_enable(struct dpu_encoder_phys *phys_enc) struct dpu_hw_ctl *ctl; const struct msm_format *fmt; u32 fmt_fourcc; + u32 mode_3d; ctl = phys_enc->hw_ctl; fmt_fourcc = dpu_encoder_get_drm_fmt(phys_enc); fmt = mdp_get_format(&phys_enc->dpu_kms->base, fmt_fourcc, 0); + mode_3d = dpu_encoder_helper_get_3d_blend_mode(phys_enc); DPU_DEBUG_VIDENC(phys_enc, "\n"); @@ -466,7 +468,8 @@ static void dpu_encoder_phys_vid_enable(struct dpu_encoder_phys *phys_enc) goto skip_flush; ctl->ops.update_pending_flush_intf(ctl, phys_enc->hw_intf->idx); - if (ctl->ops.update_pending_flush_merge_3d && phys_enc->hw_pp->merge_3d) + if (mode_3d && ctl->ops.update_pending_flush_merge_3d && + phys_enc->hw_pp->merge_3d) ctl->ops.update_pending_flush_merge_3d(ctl, phys_enc->hw_pp->merge_3d->idx); if (ctl->ops.update_pending_flush_cdm && phys_enc->hw_cdm) diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c index 882c717859cec6dfc4b646200e68a748a5294ac9..07035ab77b792e76c08eb3e18c12a4afddeac902 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c @@ -275,6 +275,7 @@ static void _dpu_encoder_phys_wb_update_flush(struct dpu_encoder_phys *phys_enc) struct dpu_hw_pingpong *hw_pp; struct dpu_hw_cdm *hw_cdm; u32 pending_flush = 0; + u32 mode_3d; if (!phys_enc) return; @@ -283,6 +284,7 @@ static void _dpu_encoder_phys_wb_update_flush(struct dpu_encoder_phys *phys_enc) hw_pp = phys_enc->hw_pp; hw_ctl = phys_enc->hw_ctl; hw_cdm = phys_enc->hw_cdm; + mode_3d = dpu_encoder_helper_get_3d_blend_mode(phys_enc); DPU_DEBUG("[wb:%d]\n", hw_wb->idx - WB_0); @@ -294,7 +296,8 @@ static void _dpu_encoder_phys_wb_update_flush(struct dpu_encoder_phys *phys_enc) if (hw_ctl->ops.update_pending_flush_wb) hw_ctl->ops.update_pending_flush_wb(hw_ctl, hw_wb->idx); - if (hw_ctl->ops.update_pending_flush_merge_3d && hw_pp && hw_pp->merge_3d) + if (mode_3d && hw_ctl->ops.update_pending_flush_merge_3d && + hw_pp && hw_pp->merge_3d) hw_ctl->ops.update_pending_flush_merge_3d(hw_ctl, hw_pp->merge_3d->idx);
Don't set the merge_3d pending flush bits if the mode_3d is BLEND_3D_NONE. Always flushing merge_3d can cause timeout issues when there are multiple commits with concurrent writeback enabled. This is because the video phys enc waits for the hw_ctl flush register to be completely cleared [1] in its wait_for_commit_done(), but the WB encoder always sets the merge_3d pending flush during each commit regardless of if the merge_3d is actually active. This means that the hw_ctl flush register will never be 0 when there are multiple CWB commits and the video phys enc will hit vblank timeout errors after the first CWB commit. [1] commit fe9df3f50c39 ("drm/msm/dpu: add real wait_for_commit_done()") Fixes: 3e79527a33a8 ("drm/msm/dpu: enable merge_3d support on sm8150/sm8250") Fixes: d7d0e73f7de3 ("drm/msm/dpu: introduce the dpu_encoder_phys_* for writeback") Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com> --- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 5 ++++- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) --- base-commit: a20a91fb1bfac5d05ec5bcf9afe0c9363f6c8c93 change-id: 20241009-mode3d-fix-4c3c114ffeb9 Best regards,