On Tue, Mar 24, 2026 at 10:10 AM SHANMUGAM, SRINIVASAN
<[email protected]> wrote:
>
> [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?

Correct.  Everything should have HPD for DCN.

Alex

>
> 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