Re: [PATCH AUTOSEL 6.19-6.18] drm: renesas: rz-du: mipi_dsi: fix kernel panic when rebooting for some panels

Hugo Villeneuve
2026-02-16T14:52:12Z

Hi Sasha,

On Fri, 13 Feb 2026 19:58:37 -0500
Sasha Levin <sashal@kernel.org> wrote:

> From: Hugo Villeneuve <hvilleneuve@dimonoff.com>
>
> [ Upstream commit 64aa8b3a60a825134f7d866adf05c024bbe0c24c ]
>
> Since commit 56de5e305d4b ("clk: renesas: r9a07g044: Add MSTOP for RZ/G2L")
> we may get the following kernel panic, for some panels, when rebooting:
>
> systemd-shutdown[1]: Rebooting.
> Call trace:
> ...
> do_serror+0x28/0x68
> el1h_64_error_handler+0x34/0x50
> el1h_64_error+0x6c/0x70
> rzg2l_mipi_dsi_host_transfer+0x114/0x458 (P)
> mipi_dsi_device_transfer+0x44/0x58
> mipi_dsi_dcs_set_display_off_multi+0x9c/0xc4
> ili9881c_unprepare+0x38/0x88
> drm_panel_unprepare+0xbc/0x108
>
> This happens for panels that need to send MIPI-DSI commands in their
> unprepare() callback. Since the MIPI-DSI interface is stopped at that
> point, rzg2l_mipi_dsi_host_transfer() triggers the kernel panic.
>
> Fix by moving rzg2l_mipi_dsi_stop() to new callback function
> rzg2l_mipi_dsi_atomic_post_disable().
>
> With this change we now have the correct power-down/stop sequence:
>
> systemd-shutdown[1]: Rebooting.
> rzg2l-mipi-dsi 10850000.dsi: rzg2l_mipi_dsi_atomic_disable(): entry
> ili9881c-dsi 10850000.dsi.0: ili9881c_unprepare(): entry
> rzg2l-mipi-dsi 10850000.dsi: rzg2l_mipi_dsi_atomic_post_disable(): entry
> reboot: Restarting system
>
> Suggested-by: Biju Das <biju.das.jz@bp.renesas.com>
> Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com>
> Tested-by: Biju Das <biju.das.jz@bp.renesas.com>
> Link: https://patch.msgid.link/20260112154333.655352-1-hugo@hugovil.com
> Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
> Signed-off-by: Sasha Levin <sashal@kernel.org>
> ---
>
> LLM Generated explanations, may be completely bogus:
>
> This is important context: The MSTOP commit (56de5e305d4b) that causes
> the regression is only in v6.18+. However, looking at the commit message
> more carefully — the issue is about the **ordering** of DSI stop vs
> panel unprepare. The MSTOP commit may have just made the issue more
> visible (by making the clock gating more aggressive), but the
> fundamental ordering bug (stopping DSI before the panel can send its
> shutdown commands) could potentially affect earlier kernels too, even if
> it manifests differently.
>
> That said, for stable trees before 6.18, the triggering commit doesn't
> exist, so this specific panic may not manifest. For 6.18.y stable, this
> would be very relevant.

This analysis is correct.

Hugo.

>
> ### Summary
>
> - **What it fixes**: Kernel panic on reboot for systems using Renesas
> RZ/G2L MIPI-DSI with panels that send commands during `unprepare()`
> - **Severity**: High — kernel panic prevents clean reboot
> - **Fix quality**: Small, surgical, follows standard DRM bridge
> patterns, tested by maintainer
> - **Risk**: Very low — same operations in correct order, limited to one
> driver
> - **Scope**: Single file, ~15 lines changed
> - **Dependencies**: Driver exists in v6.12+; the specific regression
> trigger (MSTOP) is only in v6.18+, but the fix is still correct
> ordering regardless
>
> This is a clear, well-tested fix for a kernel panic. It's small,
> surgical, obviously correct (using `atomic_post_disable` is the standard
> pattern for this), and has been tested by the subsystem maintainer. It
> meets all stable kernel criteria.
>
> **YES**
>
> drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c b/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
> index 3b52dfc0ea1e0..b164e3a62cc2f 100644
> --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
> +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
> @@ -646,6 +646,13 @@ static void rzg2l_mipi_dsi_atomic_disable(struct drm_bridge *bridge,
>
> rzg2l_mipi_dsi_stop_video(dsi);
> rzg2l_mipi_dsi_stop_hs_clock(dsi);
> +}
> +
> +static void rzg2l_mipi_dsi_atomic_post_disable(struct drm_bridge *bridge,
> + struct drm_atomic_state *state)
> +{
> + struct rzg2l_mipi_dsi *dsi = bridge_to_rzg2l_mipi_dsi(bridge);
> +
> rzg2l_mipi_dsi_stop(dsi);
> }
>
> @@ -681,6 +688,7 @@ static const struct drm_bridge_funcs rzg2l_mipi_dsi_bridge_ops = {
> .atomic_pre_enable = rzg2l_mipi_dsi_atomic_pre_enable,
> .atomic_enable = rzg2l_mipi_dsi_atomic_enable,
> .atomic_disable = rzg2l_mipi_dsi_atomic_disable,
> + .atomic_post_disable = rzg2l_mipi_dsi_atomic_post_disable,
> .mode_valid = rzg2l_mipi_dsi_bridge_mode_valid,
> };
>
> --
> 2.51.0
>

--
Hugo Villeneuve