[PATCH v4 05/21] drm/i915/dsb: Move the DSB_PMCTRL* reset out of intel_dsb_finish()
Shankar, Uma
uma.shankar at intel.com
Tue Jun 10 21:50:17 UTC 2025
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces at lists.freedesktop.org> On Behalf Of Ville
> Syrjala
> Sent: Monday, June 9, 2025 7:41 PM
> To: intel-gfx at lists.freedesktop.org
> Cc: intel-xe at lists.freedesktop.org
> Subject: [PATCH v4 05/21] drm/i915/dsb: Move the DSB_PMCTRL* reset out of
> intel_dsb_finish()
>
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> When using the flip queue, due to the DMC vs. DSB register corruption problem,
> we must not issue any register writes from the DSB after unhalting the DMC.
> Currently we are doign just that by trying to restore DSB_PMCTRL* back to a
Nit: Typo in "doing"
> sane state from intel_dsb_finish().
>
> Since the only place left that pokes at DSB_PMCTRL* is intel_dsb_chain() we can
> just do DSB_PMCTRL_2/DSB_FORCE_DEWAKE reset in the same place.
>
> The DSB_PMCTRL reset is trickier since we'd have to do it from the chained DSB
> itself. But based on my earlier testing DSB_PMCTRL/DSB_ENABLE_DEWAKE
> doesn't actually do anything if the DSB isn't actually enabled, so we can omit the
> reset to keep things a bit simpler. We do need to reset
> DSB_PMCTRL/DSB_ENABLE_DEWAKE before starting the DSB however, in case
> it was left enabled from a previous use.
Looks Good to me.
Reviewed-by: Uma Shankar <uma.shankar at intel.com>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_dsb.c | 23 +++++++++++------------
> 1 file changed, 11 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dsb.c
> b/drivers/gpu/drm/i915/display/intel_dsb.c
> index 200555a9e94b..6fdd324615e2 100644
> --- a/drivers/gpu/drm/i915/display/intel_dsb.c
> +++ b/drivers/gpu/drm/i915/display/intel_dsb.c
> @@ -629,18 +629,6 @@ void intel_dsb_gosub_finish(struct intel_dsb *dsb)
>
> void intel_dsb_finish(struct intel_dsb *dsb) {
> - struct intel_crtc *crtc = dsb->crtc;
> -
> - /*
> - * DSB_FORCE_DEWAKE remains active even after DSB is
> - * disabled, so make sure to clear it (if set during
> - * intel_dsb_commit()). And clear DSB_ENABLE_DEWAKE as
> - * well for good measure.
> - */
> - intel_dsb_reg_write(dsb, DSB_PMCTRL(crtc->pipe, dsb->id), 0);
> - intel_dsb_reg_write_masked(dsb, DSB_PMCTRL_2(crtc->pipe, dsb->id),
> - DSB_FORCE_DEWAKE, 0);
> -
> intel_dsb_align_tail(dsb);
>
> intel_dsb_buffer_flush_map(&dsb->dsb_buf);
> @@ -781,6 +769,8 @@ static void _intel_dsb_chain(struct intel_atomic_state
> *state,
> intel_dsb_reg_write(dsb, DSB_PMCTRL(pipe, chained_dsb->id),
> DSB_ENABLE_DEWAKE |
>
> DSB_SCANLINE_FOR_DEWAKE(hw_dewake_scanline));
> + } else {
> + intel_dsb_reg_write(dsb, DSB_PMCTRL(pipe, chained_dsb->id),
> 0);
> }
>
> intel_dsb_reg_write(dsb, DSB_HEAD(pipe, chained_dsb->id), @@ -802,6
> +792,13 @@ static void _intel_dsb_chain(struct intel_atomic_state *state,
> intel_dsb_wait_scanline_out(state, dsb,
> dsb_dewake_scanline_start(state,
> crtc),
> dsb_dewake_scanline_end(state,
> crtc));
> +
> + /*
> + * DSB_FORCE_DEWAKE remains active even after DSB is
> + * disabled, so make sure to clear it.
> + */
> + intel_dsb_reg_write_masked(dsb, DSB_PMCTRL_2(crtc->pipe,
> dsb->id),
> + DSB_FORCE_DEWAKE, 0);
> }
> }
>
> @@ -857,6 +854,8 @@ void intel_dsb_commit(struct intel_dsb *dsb)
> dsb_error_int_status(display) |
> DSB_PROG_INT_STATUS |
> dsb_error_int_en(display) | DSB_PROG_INT_EN);
>
> + intel_de_write_fw(display, DSB_PMCTRL(pipe, dsb->id), 0);
> +
> intel_de_write_fw(display, DSB_HEAD(pipe, dsb->id),
> intel_dsb_head(dsb));
>
> --
> 2.49.0
More information about the Intel-gfx
mailing list