Hi Linus, Marek,

Thank you for the patch.

On Tue, Nov 18, 2025 at 03:36:03PM +0100, Linus Walleij wrote:
> From: Marek Vasut <[email protected]>
> 
> Introduce a variant of drm_atomic_helper_commit_modeset_enables()
> which enables CRTC before encoder/bridge. This is needed on R-Car DU,
> where the CRTC provides clock to LVDS and DSI, and has to be started
> before a bridge may call .prepare , which may trigger e.g. DSI transfer.
> 
> This specifically fixes the case where ILI9881C is connected to R-Car
> DU DSI. The ILI9881C panel driver does DSI command transfer in its
> struct drm_panel_funcs .prepare function, which is currently called
> before R-Car DU rcar_du_crtc_atomic_enable() rcar_mipi_dsi_pclk_enable()
> and the DSI command transfer times out.
> 
> Fix this by restoring the enable ordering introduced in commit
> c9b1150a68d9 ("drm/atomic-helper: Re-order bridge chain pre-enable
> and post-disable"), to enable CRTC early.

This will need to be tested on Gen3 and Gen4 hardware, with different
types of output in addition to DSI. Unfortunately you're catching me at
a bad time as I'm about to board a plane and won't have access to test
hardware for a month :-/ We'll need volunteers.

> Fixes: c9b1150a68d9 ("drm/atomic-helper: Re-order bridge chain pre-enable and 
> post-disable")
> Signed-off-by: Marek Vasut <[email protected]>
> ---
>  drivers/gpu/drm/drm_atomic_helper.c           | 24 ++++++++++++++++++++++++
>  drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c |  2 +-
>  include/drm/drm_atomic_helper.h               |  2 ++
>  3 files changed, 27 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/drm_atomic_helper.c 
> b/drivers/gpu/drm/drm_atomic_helper.c
> index d5ebe6ea0acb..f03b93c72b8f 100644
> --- a/drivers/gpu/drm/drm_atomic_helper.c
> +++ b/drivers/gpu/drm/drm_atomic_helper.c
> @@ -1692,6 +1692,30 @@ void drm_atomic_helper_commit_modeset_enables(struct 
> drm_device *dev,
>  }
>  EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables);
>  
> +/**
> + * drm_atomic_helper_commit_modeset_enables_crtc_early - modeset commit to 
> enable outputs, start CRTC early
> + * @dev: DRM device
> + * @state: atomic state object being committed
> + *
> + * This function is a variant of drm_atomic_helper_commit_modeset_enables()
> + * which enables CRTC before encoder/bridge. This is needed on R-Car DU,
> + * where the CRTC provides clock to LVDS and DSI, and has to be started
> + * before a bridge may call .prepare , which may trigger e.g. DSI transfer.
> + */
> +void
> +drm_atomic_helper_commit_modeset_enables_crtc_early(struct drm_device *dev,
> +                                                 struct drm_atomic_state 
> *state)
> +{
> +     crtc_enable(dev, state);
> +
> +     encoder_bridge_pre_enable(dev, state);
> +
> +     encoder_bridge_enable(dev, state);
> +
> +     drm_atomic_helper_commit_writebacks(dev, state);
> +}
> +EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables_crtc_early);
> +
>  /*
>   * For atomic updates which touch just a single CRTC, calculate the time of 
> the
>   * next vblank, and inform all the fences of the deadline.
> diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c 
> b/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c
> index 216219accfd9..b2403be4436b 100644
> --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c
> +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c
> @@ -544,7 +544,7 @@ static void rcar_du_atomic_commit_tail(struct 
> drm_atomic_state *old_state)
>       drm_atomic_helper_commit_modeset_disables(dev, old_state);
>       drm_atomic_helper_commit_planes(dev, old_state,
>                                       DRM_PLANE_COMMIT_ACTIVE_ONLY);
> -     drm_atomic_helper_commit_modeset_enables(dev, old_state);
> +     drm_atomic_helper_commit_modeset_enables_crtc_early(dev, old_state);
>  
>       drm_atomic_helper_commit_hw_done(old_state);
>       drm_atomic_helper_wait_for_flip_done(dev, old_state);
> diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h
> index 53382fe93537..d7fb473db343 100644
> --- a/include/drm/drm_atomic_helper.h
> +++ b/include/drm/drm_atomic_helper.h
> @@ -93,6 +93,8 @@ void drm_atomic_helper_commit_modeset_disables(struct 
> drm_device *dev,
>                                              struct drm_atomic_state *state);
>  void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
>                                         struct drm_atomic_state *old_state);
> +void drm_atomic_helper_commit_modeset_enables_crtc_early(struct drm_device 
> *dev,
> +                                                      struct 
> drm_atomic_state *old_state);
>  
>  int drm_atomic_helper_prepare_planes(struct drm_device *dev,
>                                    struct drm_atomic_state *state);

-- 
Regards,

Laurent Pinchart

Reply via email to