[Intel-gfx] [PATCH] drm/i915: HDCP: retry link integrity check on failure

Oliver Barta o.barta89 at gmail.com
Tue May 5 07:27:31 UTC 2020


On Mon, May 4, 2020 at 10:24 PM Sean Paul <sean at poorly.run> wrote:
>
> On Mon, May 4, 2020 at 1:32 PM Oliver Barta <o.barta89 at gmail.com> wrote:
> >
> > From: Oliver Barta <oliver.barta at aptiv.com>
> >
> > A single Ri mismatch doesn't automatically mean that the link integrity
> > is broken. Update and check of Ri and Ri' are done asynchronously. In
> > case an update happens just between the read of Ri' and the check against
> > Ri there will be a mismatch even if the link integrity is fine otherwise.
> >
> > Signed-off-by: Oliver Barta <oliver.barta at aptiv.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_hdmi.c | 19 ++++++++++++++++---
> >  1 file changed, 16 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
> > index 010f37240710..3156fde392f2 100644
> > --- a/drivers/gpu/drm/i915/display/intel_hdmi.c
> > +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
> > @@ -1540,7 +1540,7 @@ int intel_hdmi_hdcp_toggle_signalling(struct intel_digital_port *intel_dig_port,
> >  }
> >
> >  static
> > -bool intel_hdmi_hdcp_check_link(struct intel_digital_port *intel_dig_port)
> > +bool intel_hdmi_hdcp_check_link_once(struct intel_digital_port *intel_dig_port)
> >  {
> >         struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
> >         struct intel_connector *connector =
> > @@ -1563,8 +1563,7 @@ bool intel_hdmi_hdcp_check_link(struct intel_digital_port *intel_dig_port)
> >         if (wait_for((intel_de_read(i915, HDCP_STATUS(i915, cpu_transcoder, port)) &
> >                       (HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC)) ==
> >                      (HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC), 1)) {
>
> Why doesn't the wait_for catch this?
>
> Sean
>

Hello Sean,

thank you for having a look on my patch. The wait_for can't catch this
because it is Ri' which is outdated compared to Ri. Ri' however needs
to be read over DDC interface which is done only once during the check
sequence. It is not updated during the waiting time.

Oliver

> > -               drm_err(&i915->drm,
> > -                       "Ri' mismatch detected, link check failed (%x)\n",
> > +               drm_dbg_kms(&i915->drm, "Ri' mismatch detected (%x)\n",
> >                         intel_de_read(i915, HDCP_STATUS(i915, cpu_transcoder,
> >                                                         port)));
> >                 return false;
> > @@ -1572,6 +1571,20 @@ bool intel_hdmi_hdcp_check_link(struct intel_digital_port *intel_dig_port)
> >         return true;
> >  }
> >
> > +static
> > +bool intel_hdmi_hdcp_check_link(struct intel_digital_port *intel_dig_port)
> > +{
> > +       struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
> > +       int retry;
> > +
> > +       for (retry = 0; retry < 3; retry++)
> > +               if (intel_hdmi_hdcp_check_link_once(intel_dig_port))
> > +                       return true;
> > +
> > +       drm_err(&i915->drm, "Link check failed\n");
> > +       return false;
> > +}
> > +
> >  struct hdcp2_hdmi_msg_timeout {
> >         u8 msg_id;
> >         u16 timeout;
> > --
> > 2.20.1
> >
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/intel-gfx


More information about the Intel-gfx mailing list