From patchwork Wed Apr 15 15:38:39 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Todd Previte X-Patchwork-Id: 6221451 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id BF2ACBF4A6 for ; Wed, 15 Apr 2015 15:39:07 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id C7A8E20274 for ; Wed, 15 Apr 2015 15:39:06 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id A562D201CE for ; Wed, 15 Apr 2015 15:39:05 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 362036E530; Wed, 15 Apr 2015 08:39:05 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-pd0-f173.google.com (mail-pd0-f173.google.com [209.85.192.173]) by gabe.freedesktop.org (Postfix) with ESMTP id A19326E530 for ; Wed, 15 Apr 2015 08:39:04 -0700 (PDT) Received: by pdbnk13 with SMTP id nk13so56524074pdb.0 for ; Wed, 15 Apr 2015 08:39:04 -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=NGNvrIXwn3kwmFXdjpXInUsZ2zpSbBJOEG5W6vIIkgg=; b=S6D5/K/w+JJgeQL0xJFpnGo7HRAEAj/pZagqQe5rVJTWR7e6N1Zqd8FtQWqrpetrI3 Qc3Q13W0iU3jPgBesps3RY/o4A4CO5q1Mcx5wjNE0C4yHu3LWusA/53YvA6UMkSocCHt cUvCONAlJPcV/KgWQWxKVyHqpUb/XP2mjwJe3YKShhoXylZIY+R07rkogR3+NgvdIXEA wxMBpZwxKlWZepsSS/DGOlRnDIQNaCUUAfvAkWY6+OcCLD7wG+0yeAxv7yYJf76WvO+5 WZ0kpEGZaXqjQ5n7Y3tltCaHO+bWQv5vSZfy+8g4F17bI7VH6Kx2yKLtD6RLAdg62xhY piRQ== X-Received: by 10.68.231.40 with SMTP id td8mr47233576pbc.53.1429112344361; Wed, 15 Apr 2015 08:39:04 -0700 (PDT) Received: from localhost.localdomain (ip70-162-72-208.ph.ph.cox.net. [70.162.72.208]) by mx.google.com with ESMTPSA id su5sm4484999pbc.38.2015.04.15.08.39.03 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 15 Apr 2015 08:39:03 -0700 (PDT) From: Todd Previte To: intel-gfx@lists.freedesktop.org Date: Wed, 15 Apr 2015 08:38:39 -0700 Message-Id: <1429112327-7695-3-git-send-email-tprevite@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1429112327-7695-1-git-send-email-tprevite@gmail.com> References: <1429112327-7695-1-git-send-email-tprevite@gmail.com> Subject: [Intel-gfx] [PATCH 02/10] drm/i915: Update intel_dp_check_link_status() for Displayport compliance testing X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 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 This patch is a combination of changes that does the following: - Ignore disconnected Displayport connectors in check_link_status - Move the DPCD read further up in intel_dp_check_link_status() - Adds a new function that checks the HW HPD pin status - Replace the check for SW connected status with the new function Adds a check at the top to verify that the device is connected. This is necessary for DP compliance testing to ensure that test requests are captured and acknowledged. If a test request is present during a connected->disconnected transition, the test code will attempt to execute even though the device is disconnected, resulting in a faied test. This patch is actually both a bug fix and a component of compliance testing. Because HPD events are received both on connect and disconnect actions, it's vital that we don't try and train the link when we're transitioning from connected->disconnected. That results in errors and warning in the logs from failed AUX transactions and can trigger the WARN for the check of !base.crtc. By making the check at the beginning to see if the connection is truly active, those problems are avoided and testing / link training will only be attempted when there is a valid Displayport connection. Move the DPCD read to the top and check for an interrupt from the sink to catch Displayport automated testing requests necessary to support Displayport compliance testing. The checks for active connectors and link status are moved below the check for the interrupt. The main reason for doing this is to make sure that a test request isn't missed. Checking for the status of the encoder/crtc isn't necessary for some test cases (AUX channel tests are one example) and without moving the check for the interrupt, these tests may not execute if one of those checks fails. Additionally, if reading the DPCD fails, regardless of whether or not testing is happening, there's no way to train the link since configurations and status can't be read, nor can link training parameters be written. V1: - This is the second part of the single-patch split previously mentioned. V2: - Remerge the two split patches into one and update the commit message accordingly. - Replace the SW connected status check with a HW HPD pin status check - Adds a new function that examines the status of the HPD pin to determine if a sink device is connected V3: - Removed duplicate code from the hpd_pulse -> check_link_status path Signed-off-by: Todd Previte --- drivers/gpu/drm/i915/intel_dp.c | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 263eff3..1352c00 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -4119,6 +4119,19 @@ intel_dp_check_link_status(struct intel_dp *intel_dp) WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); + /* Try to read the source of the interrupt */ + if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 && + intel_dp_get_sink_irq(intel_dp, &sink_irq_vector)) { + /* Clear interrupt source */ + drm_dp_dpcd_writeb(&intel_dp->aux, + DP_DEVICE_SERVICE_IRQ_VECTOR, + sink_irq_vector); + if (sink_irq_vector & DP_AUTOMATED_TEST_REQUEST) + intel_dp_handle_test_request(intel_dp); + if (sink_irq_vector & (DP_CP_IRQ | DP_SINK_SPECIFIC_IRQ)) + DRM_DEBUG_DRIVER("CP or sink specific irq unhandled\n"); + } + if (!intel_encoder->connectors_active) return; @@ -4133,25 +4146,6 @@ intel_dp_check_link_status(struct intel_dp *intel_dp) return; } - /* Now read the DPCD to see if it's actually running */ - if (!intel_dp_get_dpcd(intel_dp)) { - return; - } - - /* Try to read the source of the interrupt */ - if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 && - intel_dp_get_sink_irq(intel_dp, &sink_irq_vector)) { - /* Clear interrupt source */ - drm_dp_dpcd_writeb(&intel_dp->aux, - DP_DEVICE_SERVICE_IRQ_VECTOR, - sink_irq_vector); - - if (sink_irq_vector & DP_AUTOMATED_TEST_REQUEST) - intel_dp_handle_test_request(intel_dp); - if (sink_irq_vector & (DP_CP_IRQ | DP_SINK_SPECIFIC_IRQ)) - DRM_DEBUG_DRIVER("CP or sink specific irq unhandled\n"); - } - if (!drm_dp_channel_eq_ok(link_status, intel_dp->lane_count)) { DRM_DEBUG_KMS("%s: channel EQ not ok, retraining\n", intel_encoder->base.name);