Hi Maxime,
On Tue, Sep 02, 2025 at 10:32:33AM +0200, Maxime Ripard wrote:
> Bridges implement their state using a drm_private_obj and an
s/and an/and a/
> hand-crafted reset implementation.
>
> Since drm_private_obj doesn't have a set of reset helper like the other
> states, __drm_atomic_helper_bridge_reset() was initializing both the
s/was initializing/initializes/
> drm_private_state and the drm_bridge_state structures.
>
> This initialization however was missing the drm_private_state.obj
s/was missing/is missing/
Or do I incorrectly think that the commit message should describe the
current situation in the present tense ?
> pointer to the drm_private_obj the state was allocated for, creating a
> NULL pointer dereference when trying to access it.
>
> Fixes: 751465913f04 ("drm/bridge: Add a drm_bridge_state object")
> Signed-off-by: Maxime Ripard <[email protected]>
> ---
> drivers/gpu/drm/drm_atomic_state_helper.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c
> b/drivers/gpu/drm/drm_atomic_state_helper.c
> index
> 7142e163e618ea0d7d9d828e1bd9ff2a6ec0dfeb..b962c342b16aabf4e3bea52a914e5deb1c2080ce
> 100644
> --- a/drivers/gpu/drm/drm_atomic_state_helper.c
> +++ b/drivers/gpu/drm/drm_atomic_state_helper.c
> @@ -707,10 +707,17 @@ void drm_atomic_helper_connector_destroy_state(struct
> drm_connector *connector,
> __drm_atomic_helper_connector_destroy_state(state);
> kfree(state);
> }
> EXPORT_SYMBOL(drm_atomic_helper_connector_destroy_state);
>
> +static void __drm_atomic_helper_private_obj_reset(struct drm_private_obj
> *obj,
> + struct drm_private_state
> *state)
> +{
> + memset(state, 0, sizeof(*state));
As Thomas mentioned, the memset is likely not needed.
Reviewed-by: Laurent Pinchart <[email protected]>
> + state->obj = obj;
> +}
> +
> /**
> * __drm_atomic_helper_private_obj_duplicate_state - copy atomic private
> state
> * @obj: CRTC object
> * @state: new private object state
> *
> @@ -796,10 +803,11 @@ EXPORT_SYMBOL(drm_atomic_helper_bridge_destroy_state);
> */
> void __drm_atomic_helper_bridge_reset(struct drm_bridge *bridge,
> struct drm_bridge_state *state)
> {
> memset(state, 0, sizeof(*state));
> + __drm_atomic_helper_private_obj_reset(&bridge->base, &state->base);
> state->bridge = bridge;
> }
> EXPORT_SYMBOL(__drm_atomic_helper_bridge_reset);
>
> /**
>
--
Regards,
Laurent Pinchart