Commit aabc95dc authored by Rodrigo Vivi's avatar Rodrigo Vivi Committed by Daniel Vetter

drm/i915: Dont -ETIMEDOUT on identical new and previous (count, crc).

By Vesa DP 1.2 spec TEST_CRC_COUNT is a "4 bit wrap counter which
increments each time the TEST_CRC_x_x are updated."

However if we are trying to verify the screen hasn't changed we get
same (count, crc) pair twice. Without this patch we would return
-ETIMEOUT in this case.

So, if in 6 vblanks the pair (count, crc) hasn't changed we
return it anyway instead of returning error and let test case decide
if it was right or not.
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: default avatarRafael Antognolli <rafael.antognolli@intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 621d4c76
...@@ -4065,6 +4065,7 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc) ...@@ -4065,6 +4065,7 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc)
u8 buf; u8 buf;
int count, ret; int count, ret;
int attempts = 6; int attempts = 6;
bool old_equal_new;
ret = intel_dp_sink_crc_start(intel_dp); ret = intel_dp_sink_crc_start(intel_dp);
if (ret) if (ret)
...@@ -4079,6 +4080,7 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc) ...@@ -4079,6 +4080,7 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc)
goto stop; goto stop;
} }
count = buf & DP_TEST_COUNT_MASK; count = buf & DP_TEST_COUNT_MASK;
/* /*
* Count might be reset during the loop. In this case * Count might be reset during the loop. In this case
* last known count needs to be reset as well. * last known count needs to be reset as well.
...@@ -4090,18 +4092,25 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc) ...@@ -4090,18 +4092,25 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc)
ret = -EIO; ret = -EIO;
goto stop; goto stop;
} }
} while (--attempts && (count == 0 || (count == intel_dp->sink_crc.last_count &&
old_equal_new = (count == intel_dp->sink_crc.last_count &&
!memcmp(intel_dp->sink_crc.last_crc, crc, !memcmp(intel_dp->sink_crc.last_crc, crc,
6 * sizeof(u8))))); 6 * sizeof(u8)));
} while (--attempts && (count == 0 || old_equal_new));
intel_dp->sink_crc.last_count = buf & DP_TEST_COUNT_MASK; intel_dp->sink_crc.last_count = buf & DP_TEST_COUNT_MASK;
memcpy(intel_dp->sink_crc.last_crc, crc, 6 * sizeof(u8)); memcpy(intel_dp->sink_crc.last_crc, crc, 6 * sizeof(u8));
if (attempts == 0) { if (attempts == 0) {
DRM_DEBUG_KMS("Panel is unable to calculate CRC after 6 vblanks\n"); if (old_equal_new) {
DRM_DEBUG_KMS("Unreliable Sink CRC counter: Current returned CRC is identical to the previous one\n");
} else {
DRM_ERROR("Panel is unable to calculate any CRC after 6 vblanks\n");
ret = -ETIMEDOUT; ret = -ETIMEDOUT;
goto stop; goto stop;
} }
}
stop: stop:
intel_dp_sink_crc_stop(intel_dp); intel_dp_sink_crc_stop(intel_dp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment