Sorry. no change in behavior, with my E6410.
On Tue, Jun 29, 2010 at 9:46 PM, Dave Airlie <airl...@gmail.com> wrote:
> From: Dave Airlie <airl...@redhat.com>
>
> The eDP spec claims a 20% overhead for the 8:10 encoding scheme used on the 
> wire. Take this into account when picking the lane/clock speed for the panel.
>
> v3: some panels are out of spec, try our best to deal with them, don't refuse 
> modes on eDP panels, and try the largest allowed settings if all else fails 
> on eDP.
> v4: fix stupid typo, forgot to git add before amending.
>
> Signed-off-by: Dave Airlie <airl...@redhat.com>
> ---
>  drivers/gpu/drm/i915/intel_dp.c |   27 ++++++++++++++++++++++++---
>  1 files changed, 24 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 6094e42..b4f0282 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -139,6 +139,12 @@ intel_dp_link_required(struct drm_device *dev,
>  }
>
>  static int
> +intel_dp_max_data_rate(int max_link_clock, int max_lanes)
> +{
> +       return (max_link_clock * max_lanes * 8) / 10;
> +}
> +
> +static int
>  intel_dp_mode_valid(struct drm_connector *connector,
>                    struct drm_display_mode *mode)
>  {
> @@ -147,8 +153,11 @@ intel_dp_mode_valid(struct drm_connector *connector,
>        int max_link_clock = 
> intel_dp_link_clock(intel_dp_max_link_bw(intel_encoder));
>        int max_lanes = intel_dp_max_lane_count(intel_encoder);
>
> -       if (intel_dp_link_required(connector->dev, intel_encoder, mode->clock)
> -                       > max_link_clock * max_lanes)
> +       /* only refuse the mode on non eDP since we have seen some wierd eDP 
> panels
> +          which are outside spec tolerances but somehow work by magic */
> +       if (!IS_eDP(intel_encoder) &&
> +           (intel_dp_link_required(connector->dev, intel_encoder, 
> mode->clock)
> +            > intel_dp_max_data_rate(max_link_clock, max_lanes)))
>                return MODE_CLOCK_HIGH;
>
>        if (mode->clock < 10000)
> @@ -509,7 +518,7 @@ intel_dp_mode_fixup(struct drm_encoder *encoder, struct 
> drm_display_mode *mode,
>
>        for (lane_count = 1; lane_count <= max_lane_count; lane_count <<= 1) {
>                for (clock = 0; clock <= max_clock; clock++) {
> -                       int link_avail = intel_dp_link_clock(bws[clock]) * 
> lane_count;
> +                       int link_avail = 
> intel_dp_max_data_rate(intel_dp_link_clock(bws[clock]), lane_count);
>
>                        if (intel_dp_link_required(encoder->dev, 
> intel_encoder, mode->clock)
>                                        <= link_avail) {
> @@ -524,6 +533,18 @@ intel_dp_mode_fixup(struct drm_encoder *encoder, struct 
> drm_display_mode *mode,
>                        }
>                }
>        }
> +
> +       if (IS_eDP(intel_encoder)) {
> +               /* okay we failed just pick the highest */
> +               dp_priv->lane_count = max_lane_count;
> +               dp_priv->link_bw = bws[max_clock];
> +               adjusted_mode->clock = intel_dp_link_clock(dp_priv->link_bw);
> +               DRM_DEBUG_KMS("Force picking display port link bw %02x lane "
> +                             "count %d clock %d\n",
> +                             dp_priv->link_bw, dp_priv->lane_count,
> +                             adjusted_mode->clock);
> +               return true;
> +       }
>        return false;
>  }
>
> --
> 1.7.1
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to