[PATCH v6 4/4] RFT: drm/rockchip: Create custom commit tail
Vicente Bergas
vicencb at gmail.com
Wed Dec 3 06:11:47 PST 2025
On Tue, Dec 2, 2025 at 10:03 PM Linus Walleij <linusw at kernel.org> wrote:
>
> commit c9b1150a68d9362a0827609fc0dc1664c0d8bfe1
> "drm/atomic-helper: Re-order bridge chain pre-enable and post-disable"
> caused a series of regressions in all panels that send
> DSI commands in their .prepare() and .unprepare()
> callbacks when used with the Rockchip driver.
>
> As the CRTC is no longer online at bridge_pre_enable()
> and gone at brige_post_disable() which maps to the panel
> bridge .prepare()/.unprepare() callbacks, any CRTC that
> enable/disable the DSI transmitter in it's enable/disable
> callbacks will be unable to send any DSI commands in the
> .prepare() and .unprepare() callbacks.
>
> However the Rockchip driver definitely need the CRTC to be
> enabled during .prepare()/.unprepare().
>
> Solve this by implementing a custom commit tail function
> in the Rockchip driver that always enables the CRTC first
> and disables it last, using the newly exported helpers.
>
> This patch is an edited carbon-copy of the same patch to
> the ST-Ericsson MCDE driver.
>
> Link: https://lore.kernel.org/all/CAAMcf8Di8sc_XVZAnzQ9sUiUf-Ayvg2yjhx2dWmvvCnfF3pBRA@mail.gmail.com/
> Reported-by: Aradhya Bhatia <aradhya.bhatia at linux.dev>
> Reported-by: Vicente Bergas <vicencb at gmail.com>
> Signed-off-by: Linus Walleij <linusw at kernel.org>
> ---
> Rockchip people: can you please test this patch (along
> with patch 1 of course).
Hi Linus,
i've applied all 4 patches from the V6 patch series on top of v6.18
and tested on the rk3399-gru-kevin platform.
It indeed fixes the reported issue.
Tested-by: Vicente Bergas <vicencb at gmail.com>
Regards,
Vicente.
> ---
> drivers/gpu/drm/rockchip/rockchip_drm_fb.c | 50 +++++++++++++++++++++++++++++-
> 1 file changed, 49 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
> index 2f469d370021..63e50ea00920 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
> @@ -24,8 +24,56 @@ static const struct drm_framebuffer_funcs rockchip_drm_fb_funcs = {
> .dirty = drm_atomic_helper_dirtyfb,
> };
>
> +/*
> + * This commit tail explicitly copies and changes the behaviour of
> + * the related core DRM atomic helper instead of trying to make
> + * the core helpers overly generic.
> + */
> +static void rockchip_drm_atomic_commit_tail(struct drm_atomic_state *state)
> +{
> + struct drm_device *dev = state->dev;
> +
> + /*
> + * Variant of drm_atomic_helper_commit_modeset_disables()
> + * that will disable and post-disable all bridges BEFORE
> + * disabling the CRTC.
> + */
> + drm_atomic_helper_commit_encoder_bridge_disable(dev, state);
> + drm_atomic_helper_commit_encoder_bridge_post_disable(dev, state);
> + drm_atomic_helper_commit_crtc_disable(dev, state);
> + drm_atomic_helper_update_legacy_modeset_state(dev, state);
> + drm_atomic_helper_calc_timestamping_constants(state);
> + drm_atomic_helper_commit_crtc_set_mode(dev, state);
> +
> + /*
> + * Variant of drm_atomic_helper_commit_modeset_enables()
> + * that will enable the CRTC BEFORE pre-enabling and
> + * enabling the bridges.
> + */
> + drm_atomic_helper_commit_crtc_enable(dev, state);
> + drm_atomic_helper_commit_encoder_bridge_pre_enable(dev, state);
> + drm_atomic_helper_commit_encoder_bridge_enable(dev, state);
> + drm_atomic_helper_commit_writebacks(dev, state);
> +
> + drm_atomic_helper_commit_planes(dev, state,
> + DRM_PLANE_COMMIT_ACTIVE_ONLY);
> +
> + drm_atomic_helper_fake_vblank(state);
> +
> + drm_atomic_helper_commit_hw_done(state);
> +
> + drm_atomic_helper_wait_for_vblanks(dev, state);
> +
> + drm_atomic_helper_cleanup_planes(dev, state);
> +}
> +
> static const struct drm_mode_config_helper_funcs rockchip_mode_config_helpers = {
> - .atomic_commit_tail = drm_atomic_helper_commit_tail_rpm,
> + /*
> + * Using this function is necessary to commit atomic updates
> + * that need the CRTC to be enabled before a commit, as is
> + * the case with e.g. DSI displays.
> + */
> + .atomic_commit_tail = rockchip_drm_atomic_commit_tail,
> };
>
> static struct drm_framebuffer *
>
> --
> 2.51.1
>
More information about the Linux-rockchip
mailing list