From patchwork Mon Feb 17 22:02:10 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Imre Deak X-Patchwork-Id: 3665521 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 6A7D19F1EE for ; Mon, 17 Feb 2014 22:02:53 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 86906201CD for ; Mon, 17 Feb 2014 22:02:52 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 97AF82010B for ; Mon, 17 Feb 2014 22:02:51 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 9D04CFA8D1; Mon, 17 Feb 2014 14:02:47 -0800 (PST) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTP id 2C8E4FA8D0 for ; Mon, 17 Feb 2014 14:02:41 -0800 (PST) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga102.jf.intel.com with ESMTP; 17 Feb 2014 13:58:22 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.95,863,1384329600"; d="scan'208";a="484887783" Received: from intelbox.fi.intel.com (HELO localhost) ([10.237.72.105]) by orsmga002.jf.intel.com with ESMTP; 17 Feb 2014 14:02:39 -0800 From: Imre Deak To: intel-gfx@lists.freedesktop.org Date: Tue, 18 Feb 2014 00:02:10 +0200 Message-Id: <1392674540-10915-10-git-send-email-imre.deak@intel.com> X-Mailer: git-send-email 1.8.4 In-Reply-To: <1392674540-10915-1-git-send-email-imre.deak@intel.com> References: <1392674540-10915-1-git-send-email-imre.deak@intel.com> Subject: [Intel-gfx] [PATCH 09/19] drm/i915: check port power domain when reading the encoder hw state X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: intel-gfx-bounces@lists.freedesktop.org Errors-To: intel-gfx-bounces@lists.freedesktop.org X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, 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 Since the encoder is tied to its port, we need to make sure the power domain for that port is on before reading out the encoder HW state. Signed-off-by: Imre Deak --- drivers/gpu/drm/i915/intel_ddi.c | 2 +- drivers/gpu/drm/i915/intel_display.c | 23 ++++++++++++++++++----- drivers/gpu/drm/i915/intel_drv.h | 1 + 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c index 2643d3b..f95bc3a 100644 --- a/drivers/gpu/drm/i915/intel_ddi.c +++ b/drivers/gpu/drm/i915/intel_ddi.c @@ -1110,7 +1110,7 @@ bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector) enum transcoder cpu_transcoder; uint32_t tmp; - if (!intel_encoder->get_hw_state(intel_encoder, &pipe)) + if (!intel_encoder_get_hw_state(intel_encoder, &pipe)) return false; if (port == PORT_A) diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 7ef06fa..ce1c00a 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -4519,7 +4519,7 @@ static void intel_connector_check_state(struct intel_connector *connector) WARN(!encoder->connectors_active, "encoder->connectors_active not set\n"); - encoder_enabled = encoder->get_hw_state(encoder, &pipe); + encoder_enabled = intel_encoder_get_hw_state(encoder, &pipe); WARN(!encoder_enabled, "encoder not enabled\n"); if (WARN_ON(!encoder->base.crtc)) return; @@ -4561,7 +4561,7 @@ bool intel_connector_get_hw_state(struct intel_connector *connector) enum pipe pipe = 0; struct intel_encoder *encoder = connector->encoder; - return encoder->get_hw_state(encoder, &pipe); + return intel_encoder_get_hw_state(encoder, &pipe); } static bool ironlake_check_fdi_lanes(struct drm_device *dev, enum pipe pipe, @@ -9464,6 +9464,19 @@ check_connector_state(struct drm_device *dev) } } +bool intel_encoder_get_hw_state(struct intel_encoder *intel_encoder, + enum pipe *pipe) +{ + enum intel_display_power_domain power_domain; + struct drm_i915_private *dev_priv = intel_encoder->base.dev->dev_private; + + power_domain = intel_display_port_power_domain(intel_encoder); + if (!intel_display_power_enabled(dev_priv, power_domain)) + return false; + + return intel_encoder->get_hw_state(intel_encoder, pipe); +} + static void check_encoder_state(struct drm_device *dev) { @@ -9504,7 +9517,7 @@ check_encoder_state(struct drm_device *dev) "encoder's computed active state doesn't match tracked active state " "(expected %i, found %i)\n", active, encoder->connectors_active); - active = encoder->get_hw_state(encoder, &pipe); + active = intel_encoder_get_hw_state(encoder, &pipe); WARN(active != encoder->connectors_active, "encoder's hw state doesn't match sw tracking " "(expected %i, found %i)\n", @@ -9571,7 +9584,7 @@ check_crtc_state(struct drm_device *dev) enum pipe pipe; if (encoder->base.crtc != &crtc->base) continue; - if (encoder->get_hw_state(encoder, &pipe)) + if (intel_encoder_get_hw_state(encoder, &pipe)) encoder->get_config(encoder, &pipe_config); } @@ -11350,7 +11363,7 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev) base.head) { pipe = 0; - if (encoder->get_hw_state(encoder, &pipe)) { + if (intel_encoder_get_hw_state(encoder, &pipe)) { crtc = to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]); encoder->base.crtc = &crtc->base; encoder->get_config(encoder, &crtc->config); diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index e31eb1e..afc01a4 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -738,6 +738,7 @@ intel_display_port_power_domain(struct intel_encoder *intel_encoder); int valleyview_get_vco(struct drm_i915_private *dev_priv); void intel_mode_from_pipe_config(struct drm_display_mode *mode, struct intel_crtc_config *pipe_config); +bool intel_encoder_get_hw_state(struct intel_encoder *encoder, enum pipe *pipe); /* intel_dp.c */ void intel_dp_init(struct drm_device *dev, int output_reg, enum port port);