Ping?  This fixes a regression on LVDS systems.

Alex

On Mon, Mar 23, 2026 at 11:41 AM Alex Deucher <[email protected]> wrote:
>
> LVDS does not use an HPD pin so it may be invalid.  Handle
> this case correctly in link encoder creation.
>
> Fixes: 7c8fb3b8e9ba ("drm/amd/display: Add hpd_source index check for 
> DCE60/80/100/110/112/120 link encoders")
> Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/5012
> Cc: Srinivasan Shanmugam <[email protected]>
> Cc: Roman Li <[email protected]>
> Signed-off-by: Alex Deucher <[email protected]>
> ---
>  .../display/dc/resource/dce100/dce100_resource.c   |  6 ++----
>  .../display/dc/resource/dce110/dce110_resource.c   |  5 +++--
>  .../display/dc/resource/dce112/dce112_resource.c   |  5 +++--
>  .../display/dc/resource/dce120/dce120_resource.c   |  5 +++--
>  .../amd/display/dc/resource/dce60/dce60_resource.c | 14 ++++++--------
>  .../amd/display/dc/resource/dce80/dce80_resource.c |  6 ++----
>  6 files changed, 19 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.c 
> b/drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.c
> index 05f7ff60f8f5a..2b884e28727ba 100644
> --- a/drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.c
> +++ b/drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.c
> @@ -651,9 +651,6 @@ static struct link_encoder *dce100_link_encoder_create(
>                 return &enc110->base;
>         }
>
> -       if (enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs))
> -               return NULL;
> -
>         link_regs_id =
>                 
> map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
>
> @@ -662,7 +659,8 @@ static struct link_encoder *dce100_link_encoder_create(
>                                       &link_enc_feature,
>                                       &link_enc_regs[link_regs_id],
>                                       
> &link_enc_aux_regs[enc_init_data->channel - 1],
> -                                     
> &link_enc_hpd_regs[enc_init_data->hpd_source]);
> +                                     enc_init_data->hpd_source >= 
> ARRAY_SIZE(link_enc_hpd_regs) ?
> +                                     NULL : 
> &link_enc_hpd_regs[enc_init_data->hpd_source]);
>         return &enc110->base;
>  }
>
> diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce110/dce110_resource.c 
> b/drivers/gpu/drm/amd/display/dc/resource/dce110/dce110_resource.c
> index 7c09825cd9bd3..d957598911cbc 100644
> --- a/drivers/gpu/drm/amd/display/dc/resource/dce110/dce110_resource.c
> +++ b/drivers/gpu/drm/amd/display/dc/resource/dce110/dce110_resource.c
> @@ -672,7 +672,7 @@ static struct link_encoder *dce110_link_encoder_create(
>                 kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
>         int link_regs_id;
>
> -       if (!enc110 || enc_init_data->hpd_source >= 
> ARRAY_SIZE(link_enc_hpd_regs))
> +       if (!enc110)
>                 return NULL;
>
>         link_regs_id =
> @@ -683,7 +683,8 @@ static struct link_encoder *dce110_link_encoder_create(
>                                       &link_enc_feature,
>                                       &link_enc_regs[link_regs_id],
>                                       
> &link_enc_aux_regs[enc_init_data->channel - 1],
> -                                     
> &link_enc_hpd_regs[enc_init_data->hpd_source]);
> +                                     enc_init_data->hpd_source >= 
> ARRAY_SIZE(link_enc_hpd_regs) ?
> +                                     NULL : 
> &link_enc_hpd_regs[enc_init_data->hpd_source]);
>         return &enc110->base;
>  }
>
> diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce112/dce112_resource.c 
> b/drivers/gpu/drm/amd/display/dc/resource/dce112/dce112_resource.c
> index 3f0a6bc4dcc23..1cce903d477aa 100644
> --- a/drivers/gpu/drm/amd/display/dc/resource/dce112/dce112_resource.c
> +++ b/drivers/gpu/drm/amd/display/dc/resource/dce112/dce112_resource.c
> @@ -633,7 +633,7 @@ static struct link_encoder *dce112_link_encoder_create(
>                 kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
>         int link_regs_id;
>
> -       if (!enc110 || enc_init_data->hpd_source >= 
> ARRAY_SIZE(link_enc_hpd_regs))
> +       if (!enc110)
>                 return NULL;
>
>         link_regs_id =
> @@ -644,7 +644,8 @@ static struct link_encoder *dce112_link_encoder_create(
>                                       &link_enc_feature,
>                                       &link_enc_regs[link_regs_id],
>                                       
> &link_enc_aux_regs[enc_init_data->channel - 1],
> -                                     
> &link_enc_hpd_regs[enc_init_data->hpd_source]);
> +                                     enc_init_data->hpd_source >= 
> ARRAY_SIZE(link_enc_hpd_regs) ?
> +                                     NULL : 
> &link_enc_hpd_regs[enc_init_data->hpd_source]);
>         return &enc110->base;
>  }
>
> diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce120/dce120_resource.c 
> b/drivers/gpu/drm/amd/display/dc/resource/dce120/dce120_resource.c
> index 92890784caa6e..8b568be20a77b 100644
> --- a/drivers/gpu/drm/amd/display/dc/resource/dce120/dce120_resource.c
> +++ b/drivers/gpu/drm/amd/display/dc/resource/dce120/dce120_resource.c
> @@ -717,7 +717,7 @@ static struct link_encoder *dce120_link_encoder_create(
>                 kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
>         int link_regs_id;
>
> -       if (!enc110 || enc_init_data->hpd_source >= 
> ARRAY_SIZE(link_enc_hpd_regs))
> +       if (!enc110)
>                 return NULL;
>
>         link_regs_id =
> @@ -728,7 +728,8 @@ static struct link_encoder *dce120_link_encoder_create(
>                                       &link_enc_feature,
>                                       &link_enc_regs[link_regs_id],
>                                       
> &link_enc_aux_regs[enc_init_data->channel - 1],
> -                                     
> &link_enc_hpd_regs[enc_init_data->hpd_source]);
> +                                     enc_init_data->hpd_source >= 
> ARRAY_SIZE(link_enc_hpd_regs) ?
> +                                     NULL : 
> &link_enc_hpd_regs[enc_init_data->hpd_source]);
>
>         return &enc110->base;
>  }
> diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce60/dce60_resource.c 
> b/drivers/gpu/drm/amd/display/dc/resource/dce60/dce60_resource.c
> index d41d24b76c11f..2f5ee9d8536af 100644
> --- a/drivers/gpu/drm/amd/display/dc/resource/dce60/dce60_resource.c
> +++ b/drivers/gpu/drm/amd/display/dc/resource/dce60/dce60_resource.c
> @@ -747,18 +747,16 @@ static struct link_encoder *dce60_link_encoder_create(
>                 return &enc110->base;
>         }
>
> -       if (enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs))
> -               return NULL;
> -
>         link_regs_id =
>                 
> map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
>
>         dce60_link_encoder_construct(enc110,
> -                                     enc_init_data,
> -                                     &link_enc_feature,
> -                                     &link_enc_regs[link_regs_id],
> -                                     
> &link_enc_aux_regs[enc_init_data->channel - 1],
> -                                     
> &link_enc_hpd_regs[enc_init_data->hpd_source]);
> +                                    enc_init_data,
> +                                    &link_enc_feature,
> +                                    &link_enc_regs[link_regs_id],
> +                                    
> &link_enc_aux_regs[enc_init_data->channel - 1],
> +                                    enc_init_data->hpd_source >= 
> ARRAY_SIZE(link_enc_hpd_regs) ?
> +                                    NULL : 
> &link_enc_hpd_regs[enc_init_data->hpd_source]);
>         return &enc110->base;
>  }
>
> diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.c 
> b/drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.c
> index a68e799d58854..406705fac7d64 100644
> --- a/drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.c
> +++ b/drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.c
> @@ -753,9 +753,6 @@ static struct link_encoder *dce80_link_encoder_create(
>                 return &enc110->base;
>         }
>
> -       if (enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs))
> -               return NULL;
> -
>         link_regs_id =
>                 
> map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
>
> @@ -764,7 +761,8 @@ static struct link_encoder *dce80_link_encoder_create(
>                                       &link_enc_feature,
>                                       &link_enc_regs[link_regs_id],
>                                       
> &link_enc_aux_regs[enc_init_data->channel - 1],
> -                                     
> &link_enc_hpd_regs[enc_init_data->hpd_source]);
> +                                     enc_init_data->hpd_source >= 
> ARRAY_SIZE(link_enc_hpd_regs) ?
> +                                     NULL : 
> &link_enc_hpd_regs[enc_init_data->hpd_source]);
>         return &enc110->base;
>  }
>
> --
> 2.53.0
>

Reply via email to