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

Attachment: signature.asc
Description: PGP signature

Reply via email to