From: Todd Previte <tprevite@gmail.com>
To: intel-gfx@lists.freedesktop.org
Subject: [PATCH 08/10] drm/i915: Update the EDID automated compliance test function
Date: Thu, 9 Oct 2014 08:38:08 -0700 [thread overview]
Message-ID: <1412869090-48010-9-git-send-email-tprevite@gmail.com> (raw)
In-Reply-To: <1412869090-48010-1-git-send-email-tprevite@gmail.com>
Updates the EDID compliance test function to perform the EDID read as
required by the tests. This read needs to take place in the kernel for
reasons of speed and efficiency. The results of the EDID read are handed
off to userspace so that the remainder of the test can be conducted there.
Signed-off-by: Todd Previte <tprevite@gmail.com>
---
drivers/gpu/drm/i915/intel_dp.c | 85 +++++++++++++++++++++++++++++++++++++++--
1 file changed, 81 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 717cb5d..b7bdb5f 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -41,6 +41,13 @@
#define DP_LINK_CHECK_TIMEOUT (10 * 1000)
#define SIG_DP_COMPLIANCE 47
+/* Compliance test status bits */
+#define INTEL_DP_EDID_OK (0<<0)
+#define INTEL_DP_EDID_CORRUPT (1<<0)
+#define INTEL_DP_RESOLUTION_PREFERRED (1<<2)
+#define INTEL_DP_RESOLUTION_STANDARD (1<<3)
+#define INTEL_DP_RESOLUTION_FAILSAFE (1<<4)
+
struct dp_link_dpll {
int link_bw;
struct dpll dpll;
@@ -4012,11 +4019,81 @@ intel_dp_autotest_video_pattern(struct intel_dp *intel_dp)
return test_result;
}
-/* Displayport compliance testing - EDID operations */
-static uint8_t
-intel_dp_autotest_edid(struct intel_dp *intel_dp)
+static bool intel_dp_compute_edid_checksum(uint8_t *edid_data,
+ uint8_t *edid_checksum)
{
- uint8_t test_result = DP_TEST_NAK;
+ uint32_t byte_total = 0;
+ uint8_t i = 0;
+ bool edid_ok = true;
+
+ /* Compute byte total w/o the checksum value*/
+ for (i = 0; i < EDID_LENGTH - 2; i++)
+ byte_total += edid_data[i];
+
+ DRM_DEBUG_KMS("EDID total = %d, EDID checksum = %d\n",
+ byte_total, edid_data[EDID_LENGTH - 34 - 1]);
+
+ /* Compute the checksum */
+ *edid_checksum = 256 - (byte_total % 256);
+
+ if (*edid_checksum != edid_data[EDID_LENGTH - 1]) {
+ DRM_DEBUG_KMS("Invalid EDID checksum %d, should be %d\n",
+ edid_data[EDID_LENGTH - 40 - 1], *edid_checksum);
+ edid_ok = false;
+ }
+
+ return edid_ok;
+}
+
+
+/* Displayport compliance testing - EDID operations */
+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, checksum = 0;
+ uint32_t ret = 0;
+
+ DRM_DEBUG_KMS("Displayport: EDID automated test\n");
+
+ /* Reset the NACK/DEFER counters */
+ intel_dp->aux.i2c_nack_count = 0;
+ intel_dp->aux.i2c_defer_count = 0;
+ /* Now read out the EDID */
+ edid_read = drm_get_edid(connector, adapter);
+
+ if (edid_read == NULL) {
+ /* Check for NACKs/DEFERs, goto failsafe if detected
+ (DP CTS 1.2 Core Rev 1.1, 4.2.2.4, 4.2.2.5) */
+ if (intel_dp->aux.i2c_nack_count > 0 ||
+ intel_dp->aux.i2c_defer_count > 0)
+ DRM_DEBUG_KMS("EDID read had %d NACKs, %d DEFERs\n",
+ intel_dp->aux.i2c_nack_count,
+ intel_dp->aux.i2c_defer_count);
+ intel_dp->compliance_test_data = INTEL_DP_EDID_CORRUPT |
+ INTEL_DP_RESOLUTION_FAILSAFE;
+ } else {
+ edid_data = (uint8_t *) edid_read;
+
+ if (intel_dp_compute_edid_checksum(edid_data, &checksum)) {
+ /* 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;
+ intel_dp->compliance_test_data = INTEL_DP_EDID_OK |
+ INTEL_DP_RESOLUTION_PREFERRED;
+ } else {
+ /* Invalid checksum - EDID corruption detection test */
+ intel_dp->compliance_test_data = INTEL_DP_EDID_CORRUPT |
+ INTEL_DP_RESOLUTION_FAILSAFE;
+ }
+ }
+
return test_result;
}
--
1.9.1
next prev parent reply other threads:[~2014-10-09 15:38 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-09 15:38 [intel-gfx] Displayport compliance testing Todd Previte
2014-10-09 15:38 ` [PATCH 01/10] drm/i915: Add automated testing support for " Todd Previte
2014-10-20 17:48 ` Paulo Zanoni
2014-10-23 16:58 ` Todd Previte
2014-10-24 8:24 ` Daniel Vetter
2014-10-21 13:02 ` Daniel Vetter
2014-11-04 22:31 ` Todd Previte
2014-10-09 15:38 ` [PATCH 02/10] drm/i915: Add counters in the drm_dp_aux struct for I2C NACKs and DEFERs Todd Previte
2014-10-21 17:10 ` [Intel-gfx] " Paulo Zanoni
2014-11-04 22:12 ` Todd Previte
2014-11-04 22:19 ` Daniel Vetter
2014-10-09 15:38 ` [PATCH 03/10] drm/i915: Update intel_dp_check_link_status() for Displayport compliance testing Todd Previte
2014-10-09 15:38 ` [PATCH 04/10] drm/i915: Add a delay in Displayport AUX transactions for " Todd Previte
2014-10-09 15:38 ` [PATCH 05/10] drm/i915: Add debugfs interface for Displayport debug and " Todd Previte
2014-10-23 12:50 ` Daniel Vetter
2014-10-23 12:58 ` Paulo Zanoni
2014-10-23 15:43 ` Daniel Vetter
2014-11-13 18:44 ` Jesse Barnes
2014-11-13 20:44 ` Daniel Vetter
2014-11-13 21:00 ` Dave Airlie
2014-11-13 21:07 ` Jesse Barnes
2014-10-09 15:38 ` [PATCH 06/10] drm/i915: Add debugfs interface and support functions to notify userspace apps for Displayport " Todd Previte
2014-10-09 15:38 ` [PATCH 07/10] drm/i915: Add structures for Displayport compliance testing parameters Todd Previte
2014-10-09 15:38 ` Todd Previte [this message]
2014-10-09 15:38 ` [PATCH 09/10] drm/i915: Update intel_dp_compute_config() to respond to Displayport compliance test requests appropriately Todd Previte
2014-10-09 15:38 ` [PATCH 10/10] drm/i915: Fix intel_dp_hot_plug() Todd Previte
2014-10-09 15:49 ` Chris Wilson
2014-10-10 3:38 ` Dave Airlie
2014-10-11 0:20 ` Todd Previte
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1412869090-48010-9-git-send-email-tprevite@gmail.com \
--to=tprevite@gmail.com \
--cc=intel-gfx@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox