[PATCH] drm/amd/display: Add get_dig_frontend implementation for DCEx

Rodrigo Siqueira Rodrigo.Siqueira at amd.com
Tue Dec 15 18:56:04 UTC 2020


On 12/15, Alex Deucher wrote:
> On Tue, Dec 15, 2020 at 10:45 AM Rodrigo Siqueira
> <Rodrigo.Siqueira at amd.com> wrote:
> >
> > Some old ASICs might not implement/require get_dig_frontend helper; in
> > this scenario, we can have a NULL pointer exception when we try to call
> > it inside vbios disable operation. For example, this situation might
> > happen when using Polaris12 with an eDP panel. This commit avoids this
> > situation by adding a specific get_dig_frontend implementation for DCEx.
> >
> > Cc: Alex Deucher <alexander.deucher at amd.com>
> > Cc: Borislav Petkov <bp at alien8.de>
> > Cc: Harry Wentland <Harry.Wentland at amd.com>
> > Cc: Nicholas Kazlauskas <Nicholas.Kazlauskas at amd.com>
> > Cc: Chiawen Huang <chiawen.huang at amd.com>
> > Signed-off-by: Rodrigo Siqueira <Rodrigo.Siqueira at amd.com>
> > ---
> >  .../drm/amd/display/dc/dce/dce_link_encoder.c | 43 ++++++++++++++++++-
> >  .../drm/amd/display/dc/dce/dce_link_encoder.h |  2 +
> >  2 files changed, 44 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
> > index 4592ccdfa9b0..f355cd1e9090 100644
> > --- a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
> > +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
> > @@ -120,6 +120,7 @@ static const struct link_encoder_funcs dce110_lnk_enc_funcs = {
> >         .is_dig_enabled = dce110_is_dig_enabled,
> >         .destroy = dce110_link_encoder_destroy,
> >         .get_max_link_cap = dce110_link_encoder_get_max_link_cap,
> > +       .get_dig_frontend = dce110_get_dig_frontend,
> >  };
> >
> >  static enum bp_result link_transmitter_control(
> > @@ -235,6 +236,45 @@ static void set_link_training_complete(
> >
> >  }
> >
> > +unsigned int dce110_get_dig_frontend(struct link_encoder *enc)
> > +{
> > +       struct dce110_link_encoder *enc110 = TO_DCE110_LINK_ENC(enc);
> > +       u32 value;
> > +       enum engine_id result;
> > +
> > +       REG_GET(DIG_BE_CNTL, DIG_FE_SOURCE_SELECT, &value);
> > +
> > +       switch (value) {
> > +       case DCE110_DIG_FE_SOURCE_SELECT_DIGA:
> > +               result = ENGINE_ID_DIGA;
> > +               break;
> > +       case DCE110_DIG_FE_SOURCE_SELECT_DIGB:
> > +               result = ENGINE_ID_DIGB;
> > +               break;
> > +       case DCE110_DIG_FE_SOURCE_SELECT_DIGC:
> > +               result = ENGINE_ID_DIGC;
> > +               break;
> > +       case DCE110_DIG_FE_SOURCE_SELECT_DIGD:
> > +               result = ENGINE_ID_DIGD;
> > +               break;
> > +       case DCE110_DIG_FE_SOURCE_SELECT_DIGE:
> > +               result = ENGINE_ID_DIGE;
> > +               break;
> > +       case DCE110_DIG_FE_SOURCE_SELECT_DIGF:
> > +               result = ENGINE_ID_DIGF;
> > +               break;
> > +       case DCE110_DIG_FE_SOURCE_SELECT_DIGG:
> > +               result = ENGINE_ID_DIGG;
> > +               break;
> > +       default:
> > +               // invalid source select DIG
> > +               ASSERT(false);
> > +               result = ENGINE_ID_UNKNOWN;
> 
> Do we really want the ASSERT?  The same function for DCN asserts all
> the time on newer APUs if the register has it's default value (e.g.,
> if a particular output was not used by the vbios).  IMHO, we should
> remove the assert both here and for DCN.

Make sense to me, and I can drop the ASSERT before apply the patch.

Nick, Harry,
Do you have any objection to drop this ASSERT?
 
> Alex
> 
> 
> > +       }
> > +
> > +       return result;
> > +}
> > +
> >  void dce110_link_encoder_set_dp_phy_pattern_training_pattern(
> >         struct link_encoder *enc,
> >         uint32_t index)
> > @@ -1665,7 +1705,8 @@ static const struct link_encoder_funcs dce60_lnk_enc_funcs = {
> >         .disable_hpd = dce110_link_encoder_disable_hpd,
> >         .is_dig_enabled = dce110_is_dig_enabled,
> >         .destroy = dce110_link_encoder_destroy,
> > -       .get_max_link_cap = dce110_link_encoder_get_max_link_cap
> > +       .get_max_link_cap = dce110_link_encoder_get_max_link_cap,
> > +       .get_dig_frontend = dce110_get_dig_frontend
> >  };
> >
> >  void dce60_link_encoder_construct(
> > diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h
> > index cb714a48b171..fc6ade824c23 100644
> > --- a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h
> > +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h
> > @@ -295,6 +295,8 @@ void dce110_link_encoder_connect_dig_be_to_fe(
> >         enum engine_id engine,
> >         bool connect);
> >
> > +unsigned int dce110_get_dig_frontend(struct link_encoder *enc);
> > +
> >  void dce110_link_encoder_set_dp_phy_pattern_training_pattern(
> >         struct link_encoder *enc,
> >         uint32_t index);
> > --
> > 2.29.2
> >
> > _______________________________________________
> > amd-gfx mailing list
> > amd-gfx at lists.freedesktop.org
> > https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.freedesktop.org%2Fmailman%2Flistinfo%2Famd-gfx&data=04%7C01%7CRodrigo.Siqueira%40amd.com%7Ce4e5be182f2e462a5fd908d8a11cfc67%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637436493154372722%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=%2BVbEKhRiSaQCDYYGo2aa8BADRJiposg4VJM9G0Z1Mw4%3D&reserved=0

-- 
Rodrigo Siqueira
https://siqueira.tech
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/amd-gfx/attachments/20201215/61cd199b/attachment.sig>


More information about the amd-gfx mailing list