From patchwork Thu Oct 9 15:38:08 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Todd Previte X-Patchwork-Id: 5058971 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id B9A7C9F349 for ; Thu, 9 Oct 2014 15:39:00 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id E06B22013D for ; Thu, 9 Oct 2014 15:38:59 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id E2B34201BC for ; Thu, 9 Oct 2014 15:38:58 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 667AB6E38B; Thu, 9 Oct 2014 08:38:58 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-oi0-f46.google.com (mail-oi0-f46.google.com [209.85.218.46]) by gabe.freedesktop.org (Postfix) with ESMTP id 2EB036E386 for ; Thu, 9 Oct 2014 08:38:57 -0700 (PDT) Received: by mail-oi0-f46.google.com with SMTP id h136so3500473oig.5 for ; Thu, 09 Oct 2014 08:38:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Ek2G78baWIwLUvw7T1pzNPEbCO8uGT2Lls4cvfrDLUg=; b=QfNfMIQsPhK3zl26Z9AlaGGKgYYYSvr8NhOLlq2Fh+uarr+LAqoaWvDIPjag4bWKxO SqfgA2qQpbjtz1MYwiGThoYZKOYBz106b/GEHYzWk6TAT9rKGx/P4ViHv7T2Z34Etuvr V9TLymbkP30RRfQI3VmeHr0az7OSWG0VP6mE8Ymi7K+dq9oSxwQjyeb4eHg60bbEJ/fi 8h43wgAod1x8b2HJYHFU5xOm160kJG4Aty9sdGxbPCJkoMOpb1h85SwqREtkb1o/3bHJ yFbXuCqbFthgIG4YrKJU/TcGFEofhYFoNhkzopk11fM+3o/nZS2CKcrTeKDesR5Avv7N FXGQ== X-Received: by 10.68.197.65 with SMTP id is1mr526470pbc.125.1412869136614; Thu, 09 Oct 2014 08:38:56 -0700 (PDT) Received: from localhost.localdomain (ip72-201-95-47.ph.ph.cox.net. [72.201.95.47]) by mx.google.com with ESMTPSA id y1sm844710pbw.89.2014.10.09.08.38.54 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 09 Oct 2014 08:38:55 -0700 (PDT) From: Todd Previte To: intel-gfx@lists.freedesktop.org Date: Thu, 9 Oct 2014 08:38:08 -0700 Message-Id: <1412869090-48010-9-git-send-email-tprevite@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1412869090-48010-1-git-send-email-tprevite@gmail.com> References: <1412869090-48010-1-git-send-email-tprevite@gmail.com> Subject: [Intel-gfx] [PATCH 08/10] drm/i915: Update the EDID automated compliance test function X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, T_DKIM_INVALID, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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 --- 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; }