Thank you for your contribution! Sashiko AI review found 1 potential issue(s) 
to consider:
- [Medium] drm/bridge: ssd2825: duplicate atomic_enable() call on next_bridge
--

commit 1c5e404afec7538a0e06a870cc1167b8db336814
Author: Svyatoslav Ryhel <[email protected]>

drm/bridge: ssd2825: Fix panel enable sequence

This commit invokes the next bridge's atomic_enable() callback directly at
the end of ssd2825_bridge_atomic_pre_enable() to restore panel output after
commit 554d36acf5e0 removed direct panel handling.

> diff --git a/drivers/gpu/drm/bridge/ssd2825.c 
> b/drivers/gpu/drm/bridge/ssd2825.c
> index 71877699dfab6..9216cee09115f 100644
> --- a/drivers/gpu/drm/bridge/ssd2825.c
> +++ b/drivers/gpu/drm/bridge/ssd2825.c
> @@ -475,6 +475,7 @@ static void ssd2825_bridge_atomic_pre_enable(struct 
> drm_bridge *bridge,
>                                            struct drm_atomic_commit *state)
>  {
>       struct ssd2825_priv *priv = bridge_to_ssd2825(bridge);
> +     struct drm_bridge *next_bridge = priv->output.bridge;
>       struct mipi_dsi_device *dsi_dev = priv->output.dev;
>       const struct drm_crtc_state *crtc_state;
>       const struct drm_display_mode *mode;
> @@ -569,6 +570,14 @@ static void ssd2825_bridge_atomic_pre_enable(struct 
> drm_bridge *bridge,
>       /* Initial DSI configuration register set */
>       ssd2825_write_reg(priv, SSD2825_CONFIGURATION_REG, config);
>       ssd2825_write_reg(priv, SSD2825_VC_CTRL_REG, 0);
> +
> +     /*
> +      * The SSD2825 requires that the next bridge be enabled first;
> +      * otherwise, the SSD2825 cannot complete its configuration and
> +      * there will be no output.
> +      */
> +     if (next_bridge->funcs && next_bridge->funcs->atomic_enable)
> +             next_bridge->funcs->atomic_enable(next_bridge, state);

[Severity: Medium]
Does calling next_bridge->funcs->atomic_enable() directly in
ssd2825_bridge_atomic_pre_enable() cause next_bridge->funcs->atomic_enable()
to be invoked twice on every modeset enable?

In drivers/gpu/drm/bridge/ssd2825.c, ssd2825_bridge_attach() attaches
priv->output.bridge to the encoder's bridge chain:

        return drm_bridge_attach(bridge->encoder, priv->output.bridge, bridge,
                                 flags);

During an atomic modeset enable, drm_atomic_helper_commit_modeset_enables()
runs drm_atomic_bridge_chain_pre_enable(), which calls
ssd2825_bridge_atomic_pre_enable() and now invokes
next_bridge->funcs->atomic_enable() for the first time.

Immediately afterwards, drm_atomic_helper_commit_encoder_bridge_enable()
calls drm_atomic_bridge_chain_enable() in drivers/gpu/drm/drm_bridge.c:

        drm_for_each_bridge_in_chain_from(first_bridge, bridge)
                if (bridge->funcs->atomic_enable)
                        bridge->funcs->atomic_enable(bridge, state);

This calls next_bridge->funcs->atomic_enable() a second time while
drm_atomic_bridge_chain_disable() only calls atomic_disable() once.

When next_bridge is a panel bridge, panel_bridge_atomic_enable() calls
drm_panel_enable() in drivers/gpu/drm/drm_panel.c, where the second call hits
the already-enabled check and emits a warning on every modeset:

        if (panel->enabled) {
                dev_warn(panel->dev, "Skipping enable of already enabled 
panel\n");
                return;
        }

When next_bridge is a non-panel drm_bridge, there is no enabled-state guard
in the DRM bridge core, so next_bridge->funcs->atomic_enable() runs twice
without a matching second disable.

Additionally, if next_bridge sets pre_enable_prev_first,
drm_atomic_bridge_chain_pre_enable() runs ssd2825_bridge_atomic_pre_enable()
before next_bridge->funcs->atomic_pre_enable(), which would cause
next_bridge->funcs->atomic_enable() to run before next_bridge has been
prepared in atomic_pre_enable().

-- 
Sashiko AI review ยท 
https://sashiko.dev/#/patchset/[email protected]?part=1

Reply via email to