Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+15 −6
Original line number Diff line number Diff line
@@ -4065,6 +4065,7 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc)
	u8 buf;
	int count, ret;
	int attempts = 6;
	bool old_equal_new;

	ret = intel_dp_sink_crc_start(intel_dp);
	if (ret)
@@ -4079,6 +4080,7 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc)
			goto stop;
		}
		count = buf & DP_TEST_COUNT_MASK;

		/*
		 * Count might be reset during the loop. In this case
		 * 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)
			ret = -EIO;
			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,
						       6 * sizeof(u8)))));
					 6 * sizeof(u8)));

	} while (--attempts && (count == 0 || old_equal_new));

	intel_dp->sink_crc.last_count = buf & DP_TEST_COUNT_MASK;
	memcpy(intel_dp->sink_crc.last_crc, crc, 6 * sizeof(u8));

	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;
			goto stop;
		}
	}

stop:
	intel_dp_sink_crc_stop(intel_dp);