From patchwork Thu Apr 16 07:22:02 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Todd Previte X-Patchwork-Id: 6223771 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.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 111B09F2EC for ; Thu, 16 Apr 2015 07:22:16 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 078FE202D1 for ; Thu, 16 Apr 2015 07:22:15 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 9AC332025A for ; Thu, 16 Apr 2015 07:22:13 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 9BBAC6E96E; Thu, 16 Apr 2015 00:22:12 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-pd0-f177.google.com (mail-pd0-f177.google.com [209.85.192.177]) by gabe.freedesktop.org (Postfix) with ESMTP id 1FA3E6E082 for ; Thu, 16 Apr 2015 00:22:11 -0700 (PDT) Received: by pdea3 with SMTP id a3so82173359pde.3 for ; Thu, 16 Apr 2015 00:22:10 -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=L38suM8CQsqqX8BSyR5BmHBLFoQdpOyci1e/9AJtQrQ=; b=DvQ/H9MX5VIQWQAktql9sXTXSF7z/DF3X/TcM6bjNVIW8JEAzav6FbFErIDq4GKpwL /qSvhzKOUrL0FrWhgQRNxe3U0LvwskxThblW6HSHmzoQCbKh4R6VZcAoXMHRLfzoxoc9 XKkyXrnRQ3fcN08aL7BxbtbWAqceO2KTZ40kYGqqdGqwWnHczgf51iGvo+O1TvRJkXsw graNduA8fzhe/nFlKvhimsRooQADAzZhyawRAy42ibeQLr8HT4uaGvReJtrjFuOY4WrJ po4+KEf7zYv9h0haqTvi1CrUMzfCtwwQGj5kMKVq9vubs8cnMBsqGPGOoVSjK7nNq+ea TaFg== X-Received: by 10.68.170.133 with SMTP id am5mr53609878pbc.42.1429168930819; Thu, 16 Apr 2015 00:22:10 -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 tz4sm6153364pac.46.2015.04.16.00.22.09 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 16 Apr 2015 00:22:09 -0700 (PDT) From: Todd Previte To: intel-gfx@lists.freedesktop.org Date: Thu, 16 Apr 2015 00:22:02 -0700 Message-Id: <1429168922-28381-1-git-send-email-tprevite@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1429112327-7695-7-git-send-email-tprevite@gmail.com> References: <1429112327-7695-7-git-send-email-tprevite@gmail.com> Subject: [Intel-gfx] [PATCH 06/12] drm/i915: Update intel_dp_hpd_pulse() for non-MST operation 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 Update the hot plug function to handle the SST case. Instead of placing the SST case within the long/short pulse block, it is now handled after determining that MST mode is not in use. This way, the topology management layer can handle any MST-related operations while SST operations are still correctly handled afterwards. This patch also corrects the problem of SST mode only being handled in the case of a short (0.5ms - 1.0ms) HPD pulse. For compliance testing purposes both short and long pulses are used by the different tests, thus both cases need to be addressed for SST. One additional change is the removal of the return of IRQ_HANDLED for the SST case. This corrects an issue where the normal hot plug functions were not being called under certain circumstances while implementing the compliance testing. This patch replaces [PATCH 10/10] drm/i915: Fix intel_dp_hot_plug() in the previous compliance testing patch sequence. Review feedback on that patch indicated that updating intel_dp_hot_plug() was not the correct place for the test handler. V2: - N/A V3: - Place the SST mode link status check into the mst_fail case - Remove obsolete comment regarding SST mode operation - Removed an erroneous line of code that snuck in during rebasing V4: - Added a disable of the main stream (DP transport) for the long pulse case for SST to support compliance testing V5: - Reworked SST handling to support tests 4.2.2.7 and 4.2.2.8 V6: - Reformatted a comment V7: - Moved a comment again that was inadvertently moved - Updated the code to properly handle all permutations of MST/SST and short/long pulse. - Adds a new 'connected' flag that prevents unnecessary operations when the link is disconnected. - Added a function to encapsulate detection of the HPD pin status in in order to determine connected status - Reformatted the if-statements in the function so the braces are consistent for those with single statements after the if-statement - Main link disable that was added in V4 has been removed V8: - Updated to account for long_hpd flag propagation V9: - Change the return type for the SST case to IRQ_NONE to allow for proper invocation of other hot plug functions Signed-off-by: Todd Previte --- drivers/gpu/drm/i915/intel_dp.c | 54 ++++++++++++++++++++++++---------------- drivers/gpu/drm/i915/intel_drv.h | 1 + 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 97224ff..1ba5247 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -4746,6 +4746,7 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd) struct drm_i915_private *dev_priv = dev->dev_private; enum intel_display_power_domain power_domain; enum irqreturn ret = IRQ_NONE; + bool connected = false; if (intel_dig_port->base.type != INTEL_OUTPUT_EDP) intel_dig_port->base.type = INTEL_OUTPUT_DISPLAYPORT; @@ -4769,19 +4770,15 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd) power_domain = intel_display_port_power_domain(intel_encoder); intel_display_power_get(dev_priv, power_domain); + connected = intel_dp_digital_port_connected(intel_dp); + if (long_hpd) { - if (HAS_PCH_SPLIT(dev)) { - if (!ibx_digital_port_connected(dev_priv, intel_dig_port)) - goto mst_fail; - } else { - if (g4x_digital_port_connected(dev, intel_dig_port) != 1) - goto mst_fail; - } + if (!connected) + goto mst_fail; - if (!intel_dp_get_dpcd(intel_dp)) { + if (!intel_dp_get_dpcd(intel_dp)) goto mst_fail; - } intel_dp_probe_oui(intel_dp); @@ -4789,20 +4786,9 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd) goto mst_fail; } else { - if (intel_dp->is_mst) { + if (intel_dp->is_mst) if (intel_dp_check_mst_status(intel_dp) == -EINVAL) goto mst_fail; - } - - if (!intel_dp->is_mst) { - /* - * we'll check the link status via the normal hot plug path later - - * but for short hpds we should check it now - */ - drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); - intel_dp_check_link_status(intel_dp, long_hpd); - drm_modeset_unlock(&dev->mode_config.connection_mutex); - } } ret = IRQ_HANDLED; @@ -4816,6 +4802,14 @@ mst_fail: drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, intel_dp->is_mst); } put_power: + /* SST mode - handle short/long pulses here */ + if (!intel_dp->is_mst) { + + drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); + if (connected) + intel_dp_check_link_status(intel_dp, long_hpd); + drm_modeset_unlock(&dev->mode_config.connection_mutex); + } intel_display_power_put(dev_priv, power_domain); return ret; @@ -5802,3 +5796,21 @@ void intel_dp_mst_resume(struct drm_device *dev) } } } + +bool intel_dp_digital_port_connected(struct intel_dp *intel_dp) +{ + struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); + struct drm_device *dev = intel_dig_port->base.base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + bool connected = true; + + if (HAS_PCH_SPLIT(dev)) { + if (!ibx_digital_port_connected(dev_priv, intel_dig_port)) + connected = false; + } else { + if (g4x_digital_port_connected(dev, intel_dig_port) != 1) + connected = false; + } + + return connected; +} diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index a4675fa..accf08b 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -1173,6 +1173,7 @@ void intel_edp_drrs_disable(struct intel_dp *intel_dp); void intel_edp_drrs_invalidate(struct drm_device *dev, unsigned frontbuffer_bits); void intel_edp_drrs_flush(struct drm_device *dev, unsigned frontbuffer_bits); +bool intel_dp_digital_port_connected(struct intel_dp *intel_dp); /* intel_dp_mst.c */ int intel_dp_mst_encoder_init(struct intel_digital_port *intel_dig_port, int conn_id);