diff mbox

[3/6] drm/i915: Implement basic Displayport automated testing function for EDID operations

Message ID 1403647974-42377-4-git-send-email-tprevite@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Todd Previte June 24, 2014, 10:12 p.m. UTC
Implements some of the basic EDID tests for Displayport compliance. These tests
include reading the EDID, verifying the checksum and writing the test responses
back to the sink device.

Signed-off-by: Todd Previte <tprevite@gmail.com>
---
 drivers/gpu/drm/i915/intel_dp.c | 36 +++++++++++++++++++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)

Comments

Jani Nikula June 25, 2014, 7:57 a.m. UTC | #1
On Wed, 25 Jun 2014, Todd Previte <tprevite@gmail.com> wrote:
> Implements some of the basic EDID tests for Displayport compliance. These tests
> include reading the EDID, verifying the checksum and writing the test responses
> back to the sink device.
>
> Signed-off-by: Todd Previte <tprevite@gmail.com>
> ---
>  drivers/gpu/drm/i915/intel_dp.c | 36 +++++++++++++++++++++++++++++++++++-
>  1 file changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 43fcabe..d060853 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -3352,8 +3352,42 @@ intel_dp_autotest_video_pattern(struct intel_dp *intel_dp)
>  static uint8_t
>  intel_dp_autotest_edid(struct intel_dp *intel_dp)
>  {
> +	struct drm_connector *connector = &intel_dp->attached_connector->base;
> +	struct i2c_adapter *adapter = &intel_dp->aux.ddc;
> +	struct edid *edid_read = NULL;
> +	uint8_t *edid_data = NULL;
>  	uint8_t test_result = DP_TEST_NAK;
> -	return test_result;
> +	uint32_t i = 0, ret = 0, checksum = 0;
> +	struct drm_display_mode *use_mode = NULL;
> +	dp_compliance_mode comp_mode_type = DP_COMPLIANCE_MODE_PREFERRED;
> +	int mode_count = 0;
> +
> +	edid_read = drm_get_edid(connector, adapter);
> +
> +	DRM_DEBUG_KMS("Displayport: EDID automated test\n");
> +
> +	if (edid_read) {

It is customary to have if (!edid_read) and bail out early. Then the
rest will be a happy day scenario with minimal indentation.

BR,
Jani.


> +		test_result = true;
> +		edid_data = (uint8_t*) edid_read;
> +		// Compute checksum
> +		for (i = 0; i < 128; i++)
> +				checksum += edid_data[i];
> +
> +		DRM_DEBUG_KMS("Displayport: EDID test - computed byte sum = %02x\n", checksum);
> +		// Verify EDID checksum
> +		if (checksum % 256 == 0) {
> +			/* Write the checksum to EDID checksum register */
> +			ret = drm_dp_dpcd_write(&intel_dp->aux, DP_TEST_EDID_CHECKSUM, &edid_read->checksum, 1);
> +			// Reponse is ACK and and checksum written
> +			test_result = DP_TEST_ACK | DP_TEST_EDID_CHECKSUM_WRITE;
> +			DRM_DEBUG_KMS("Displayport: EDID test - checksum = %02x\n", edid_read->checksum);
> +		}
> +		else {
> +			// Invalid checksum, set for failsafe mode
> +			comp_mode_type = DP_COMPLIANCE_MODE_FAILSAFE;
> +		}
> +	}
> +        return test_result;
>  }
>  
>  /* Displayport compliance testing - PHY pattern testing */
> -- 
> 1.9.1
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Daniel Vetter July 7, 2014, 3:37 p.m. UTC | #2
On Tue, Jun 24, 2014 at 03:12:51PM -0700, Todd Previte wrote:
> Implements some of the basic EDID tests for Displayport compliance. These tests
> include reading the EDID, verifying the checksum and writing the test responses
> back to the sink device.
> 
> Signed-off-by: Todd Previte <tprevite@gmail.com>
> ---
>  drivers/gpu/drm/i915/intel_dp.c | 36 +++++++++++++++++++++++++++++++++++-
>  1 file changed, 35 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 43fcabe..d060853 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -3352,8 +3352,42 @@ intel_dp_autotest_video_pattern(struct intel_dp *intel_dp)
>  static uint8_t
>  intel_dp_autotest_edid(struct intel_dp *intel_dp)
>  {
> +	struct drm_connector *connector = &intel_dp->attached_connector->base;
> +	struct i2c_adapter *adapter = &intel_dp->aux.ddc;
> +	struct edid *edid_read = NULL;
> +	uint8_t *edid_data = NULL;
>  	uint8_t test_result = DP_TEST_NAK;
> -	return test_result;
> +	uint32_t i = 0, ret = 0, checksum = 0;
> +	struct drm_display_mode *use_mode = NULL;
> +	dp_compliance_mode comp_mode_type = DP_COMPLIANCE_MODE_PREFERRED;
> +	int mode_count = 0;
> +
> +	edid_read = drm_get_edid(connector, adapter);
> +
> +	DRM_DEBUG_KMS("Displayport: EDID automated test\n");
> +
> +	if (edid_read) {
> +		test_result = true;
> +		edid_data = (uint8_t*) edid_read;
> +		// Compute checksum

Checkpatch isn't approving of // style comments, and there's other issues.
-Daniel

> +		for (i = 0; i < 128; i++)
> +				checksum += edid_data[i];
> +
> +		DRM_DEBUG_KMS("Displayport: EDID test - computed byte sum = %02x\n", checksum);
> +		// Verify EDID checksum
> +		if (checksum % 256 == 0) {
> +			/* Write the checksum to EDID checksum register */
> +			ret = drm_dp_dpcd_write(&intel_dp->aux, DP_TEST_EDID_CHECKSUM, &edid_read->checksum, 1);
> +			// Reponse is ACK and and checksum written
> +			test_result = DP_TEST_ACK | DP_TEST_EDID_CHECKSUM_WRITE;
> +			DRM_DEBUG_KMS("Displayport: EDID test - checksum = %02x\n", edid_read->checksum);
> +		}
> +		else {
> +			// Invalid checksum, set for failsafe mode
> +			comp_mode_type = DP_COMPLIANCE_MODE_FAILSAFE;
> +		}
> +	}
> +        return test_result;
>  }
>  
>  /* Displayport compliance testing - PHY pattern testing */
> -- 
> 1.9.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 43fcabe..d060853 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -3352,8 +3352,42 @@  intel_dp_autotest_video_pattern(struct intel_dp *intel_dp)
 static uint8_t
 intel_dp_autotest_edid(struct intel_dp *intel_dp)
 {
+	struct drm_connector *connector = &intel_dp->attached_connector->base;
+	struct i2c_adapter *adapter = &intel_dp->aux.ddc;
+	struct edid *edid_read = NULL;
+	uint8_t *edid_data = NULL;
 	uint8_t test_result = DP_TEST_NAK;
-	return test_result;
+	uint32_t i = 0, ret = 0, checksum = 0;
+	struct drm_display_mode *use_mode = NULL;
+	dp_compliance_mode comp_mode_type = DP_COMPLIANCE_MODE_PREFERRED;
+	int mode_count = 0;
+
+	edid_read = drm_get_edid(connector, adapter);
+
+	DRM_DEBUG_KMS("Displayport: EDID automated test\n");
+
+	if (edid_read) {
+		test_result = true;
+		edid_data = (uint8_t*) edid_read;
+		// Compute checksum
+		for (i = 0; i < 128; i++)
+				checksum += edid_data[i];
+
+		DRM_DEBUG_KMS("Displayport: EDID test - computed byte sum = %02x\n", checksum);
+		// Verify EDID checksum
+		if (checksum % 256 == 0) {
+			/* Write the checksum to EDID checksum register */
+			ret = drm_dp_dpcd_write(&intel_dp->aux, DP_TEST_EDID_CHECKSUM, &edid_read->checksum, 1);
+			// Reponse is ACK and and checksum written
+			test_result = DP_TEST_ACK | DP_TEST_EDID_CHECKSUM_WRITE;
+			DRM_DEBUG_KMS("Displayport: EDID test - checksum = %02x\n", edid_read->checksum);
+		}
+		else {
+			// Invalid checksum, set for failsafe mode
+			comp_mode_type = DP_COMPLIANCE_MODE_FAILSAFE;
+		}
+	}
+        return test_result;
 }
 
 /* Displayport compliance testing - PHY pattern testing */