[Intel-gfx] [PATCH v3] drm/i915/dp: Read link status more times when EQ not done

Rodrigo Vivi rodrigo.vivi at gmail.com
Fri Mar 31 23:25:31 UTC 2017


On Mon, Mar 13, 2017 at 1:12 AM, Lee, Shawn C <shawn.c.lee at intel.com> wrote:
> From: "Lee, Shawn C" <shawn.c.lee at intel.com>
>
> Display driver read DPCD register 0x202, 0x203 and 0x204 to identify
> eDP sink status.If PSR exit is ongoing at eDP sink, and eDP source
> read these registers at the same time. Panel will report EQ & symbol
> lock not done. It will cause panel display flicking.
>
> Try to read link status more times if eDP EQ not done. Panel side
> request at least 1000us for fast link train while doing PSR exit.
> So wait more than 1000us then retrieve sink's status again.

it is missing a v2 and v3 here with explanations on the changes.
It was hard to follow the changes.

>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99639
> TEST=Reboot DUT and no flicking on local display at login screen
>
> Cc: Cooper Chiou <cooper.chiou at intel.com>
> Cc: Wei Shun Chen <wei.shun.chang at intel.com>
> Cc: Gary C Wang <gary.c.wang at intel.com>
> Cc: Jani Nikula <jani.nikula at intel.com>
> Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
>
> Signed-off-by: Lee, Shawn C <shawn.c.lee at intel.com>
> ---
>  drivers/gpu/drm/i915/intel_dp.c |   34 ++++++++++++++++++++++++----------
>  1 file changed, 24 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 024798a9c016..d50827a92aa2 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -4225,15 +4225,11 @@ static void intel_dp_handle_test_request(struct intel_dp *intel_dp)
>  {
>         struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base;
>         struct drm_device *dev = intel_dp_to_dev(intel_dp);
> -       u8 link_status[DP_LINK_STATUS_SIZE];
> +       struct drm_i915_private *dev_priv = dev->dev_private;
> +       u8 link_status[DP_LINK_STATUS_SIZE], retry = 1;
>
>         WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
>
> -       if (!intel_dp_get_link_status(intel_dp, link_status)) {
> -               DRM_ERROR("Failed to get link status\n");
> -               return;
> -       }
> -
>         if (!intel_encoder->base.crtc)
>                 return;
>
> @@ -4245,13 +4241,31 @@ static void intel_dp_handle_test_request(struct intel_dp *intel_dp)
>         if (!intel_dp->lane_count)
>                 return;
>
> +       if (is_edp(intel_dp) && dev_priv->psr.enabled)
> +               retry = 3;
> +
>         /* Retrain if Channel EQ or CR not ok */
> -       if (!drm_dp_channel_eq_ok(link_status, intel_dp->lane_count)) {
> -               DRM_DEBUG_KMS("%s: channel EQ not ok, retraining\n",
> -                             intel_encoder->base.name);
> +       while ( retry-- ) {
> +               if (!intel_dp_get_link_status(intel_dp, link_status)) {
> +                       DRM_ERROR("Failed to get link status\n");
> +                       return;

Well, if link status is not ok you return without retrying, so, why is
this here?

> +               }
>
> -               intel_dp_retrain_link(intel_dp);
> +               if (drm_dp_channel_eq_ok(link_status, intel_dp->lane_count))
> +                       return;
> +
> +               /*
> +                * EQ not ok may caused by fast link train while exit PSR active,
> +                * wait at least 1000 us then read it again.
> +                */
> +               if (retry)
> +                       usleep_range(1000, 1500);

maybe this retry is randomly just masking the real issue.
Jim recently found out that on psr enable we are clearing a bit that
we should never touch by spec.
I'd try Jim's patch(es) first to see if they solve the issue for you.

>         }
> +
> +       DRM_DEBUG_KMS("%s: channel EQ not ok, retraining\n",
> +               intel_encoder->base.name);
> +
> +       intel_dp_retrain_link(intel_dp);
>  }
>
>  /*
> --
> 1.7.9.5
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx



-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br


More information about the Intel-gfx mailing list