Hi, On Wed, Sep 30, 2026 at 08:41:45PM +0800, Xilin Wu wrote: > Bridge connectors can attach the max bpc property before their atomic > state is allocated by drm_mode_config_reset(). Unconditionally updating > connector->state in drm_connector_attach_max_bpc_property() dereferences > a NULL pointer in this case. Adding max bpc support to MSM DP and eDP > exposes this during display initialization, before a framebuffer console > is available. > > Only update an existing state when attaching the property. Initialize > max_requested_bpc and max_bpc from the property range when creating a > connector state so that deferred allocation and subsequent resets both > restore the default. Avoid leaving the bit depth at zero after reset, > which would otherwise cause valid display configurations to be rejected. > > With MSM DP max bpc support applied, this also restores boot on the Lenovo > Yoga Slim 7x. > > Assisted-by: LLM > Signed-off-by: Xilin Wu <[email protected]> > --- > drivers/gpu/drm/drm_atomic_state_helper.c | 5 +++++ > drivers/gpu/drm/drm_connector.c | 6 ++++-- > 2 files changed, 9 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c > b/drivers/gpu/drm/drm_atomic_state_helper.c > index a2ef272e9f27..91d60bc7a2b2 100644 > --- a/drivers/gpu/drm/drm_atomic_state_helper.c > +++ b/drivers/gpu/drm/drm_atomic_state_helper.c > @@ -34,6 +34,7 @@ > #include <drm/drm_framebuffer.h> > #include <drm/drm_plane.h> > #include <drm/drm_print.h> > +#include <drm/drm_property.h> > #include <drm/drm_vblank.h> > #include <drm/drm_writeback.h> > > @@ -495,6 +496,10 @@ __drm_atomic_helper_connector_state_init(struct > drm_connector_state *conn_state, > struct drm_connector *connector) > { > conn_state->connector = connector; > + if (connector->max_bpc_property) { > + conn_state->max_requested_bpc = > connector->max_bpc_property->values[1]; > + conn_state->max_bpc = conn_state->max_requested_bpc; > + }
You should use drm_object_property_get_default_value() here
> }
> EXPORT_SYMBOL(__drm_atomic_helper_connector_state_init);
>
> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
> index 8b4baed060f3..34c30469f405 100644
> --- a/drivers/gpu/drm/drm_connector.c
> +++ b/drivers/gpu/drm/drm_connector.c
> @@ -2886,8 +2886,10 @@ int drm_connector_attach_max_bpc_property(struct
> drm_connector *connector,
> }
>
> drm_object_attach_property(&connector->base, prop, max);
> - connector->state->max_requested_bpc = max;
> - connector->state->max_bpc = max;
> + if (connector->state) {
> + connector->state->max_requested_bpc = max;
> + connector->state->max_bpc = max;
> + }
Doesn't that also remove the new state allocation we have everywhere
(like in drmm_connector_hdmi_init, meson_encoder_hdmi_probe,
dw_hdmi_connector_create, etc.)
Maxime
signature.asc
Description: PGP signature
