[Intel-gfx] [PATCH] drm/i915: Fix idle_frames counter.
Paulo Zanoni
przanoni at gmail.com
Tue Dec 1 09:39:53 PST 2015
2015-12-01 14:54 GMT-02:00 Rodrigo Vivi <rodrigo.vivi at intel.com>:
> 'commit 97173eaf5 ("drm/i915: PSR: Increase idle_frames")' was a mistake.
> The special case it tried to cover was already being covered by
> the DP_PSR_NO_TRAIN_ON_EXIT. So this ended up duplicated.
>
> So, instead of reverting that let's take this opportunity and unify
> the idle_frame definition in a single place so we standardize the access
> and avoid room for that same mistake again.
>
> Few changes with this patch:
>
> 1. Instead of just respecting the VBT we set a
> global minumum with max(). So we are sure that we will avoid corner cases
> in case VBT is doing something we don't understand.
>
> 2. Instead of minimum 5 we use 6. When introducing the idle_frames += 4 case
> we considered that minimum was 2. All because the off-by-one issue.
>
> v2: Unified idle_frame definition.
Reducing from 4 different possibilities to 2 is good.
Reviewed-by: Paulo Zanoni <paulo.r.zanoni at intel.com>
>
> Cc: Paulo Zanoni <paulo.r.zanoni at intel.com>
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
> ---
> drivers/gpu/drm/i915/intel_psr.c | 20 +++++++-------------
> 1 file changed, 7 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c
> index 3a10263..f12fc56 100644
> --- a/drivers/gpu/drm/i915/intel_psr.c
> +++ b/drivers/gpu/drm/i915/intel_psr.c
> @@ -267,23 +267,17 @@ static void hsw_psr_enable_source(struct intel_dp *intel_dp)
> struct drm_i915_private *dev_priv = dev->dev_private;
>
> uint32_t max_sleep_time = 0x1f;
> - /* Lately it was identified that depending on panel idle frame count
> - * calculated at HW can be off by 1. So let's use what came
> - * from VBT + 1.
> - * There are also other cases where panel demands at least 4
> - * but VBT is not being set. To cover these 2 cases lets use
> - * at least 5 when VBT isn't set to be on the safest side.
> + /*
> + * Let's respect VBT in case VBT asks a higher idle_frame value.
> + * Let's use 6 as the minimum to cover all known cases including
> + * the off-by-one issue that HW has in some cases. Also there are
> + * cases where sink should be able to train
> + * with the 5 or 6 idle patterns.
> */
> - uint32_t idle_frames = dev_priv->vbt.psr.idle_frames ?
> - dev_priv->vbt.psr.idle_frames + 1 : 5;
> + uint32_t idle_frames = max(6, dev_priv->vbt.psr.idle_frames);
> uint32_t val = 0x0;
> const uint32_t link_entry_time = EDP_PSR_MIN_LINK_ENTRY_TIME_8_LINES;
>
> - if (intel_dp->psr_dpcd[1] & DP_PSR_NO_TRAIN_ON_EXIT) {
> - /* Sink should be able to train with the 5 or 6 idle patterns */
> - idle_frames += 4;
> - }
> -
> I915_WRITE(EDP_PSR_CTL, val |
> (IS_BROADWELL(dev) ? 0 : link_entry_time) |
> max_sleep_time << EDP_PSR_MAX_SLEEP_TIME_SHIFT |
> --
> 2.4.3
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Paulo Zanoni
More information about the Intel-gfx
mailing list