[AMD Official Use Only - AMD Internal Distribution Only] > -----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]>
The series looks correct to me. [2/3] allows link encoder creation without HPD regs for LVDS, and [3/3] properly switches to a no_hpd function table, avoiding HPD register dereferences. I also checked _get_hpd_state() and _program_hpd_filter(), and both do not depend on hpd_regs, so they are safe with NULL. Reviewed-by: Srinivasan Shanmugam <[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 > >
