[AMD Official Use Only - AMD Internal Distribution Only]

Thanks a lot @Alex Deucher!

It would be helpful to get feedback from display folks @Pillai, Aurabindo and 
@Li, Roman as well.

Best regards,
Srini

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