[AMD Official Use Only - AMD Internal Distribution Only]

Hi Alex,

Do we need to handle similar cases in DCN resource paths (e.g., dcn10/dcn401) 
ie., dcn401_resource.c and dcn10_resource.c?
They also reject encoder creation when hpd_source is out of range, but unlike
DCE they don’t have no_hpd handling. Or is this not applicable since DCN
doesn’t support LVDS/no-HPD cases?

Thanks,
Srini

> -----Original Message-----
> From: Alex Deucher <[email protected]>
> Sent: Tuesday, March 24, 2026 6:18 PM
> To: Deucher, Alexander <[email protected]>
> Cc: [email protected]; SHANMUGAM, SRINIVASAN
> <[email protected]>; Li, Roman <[email protected]>
> Subject: Re: [PATCH 2/3] drm/amd/display: Fix DCE LVDS handling
>
> 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