All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ramalingam C <ramalingam.c@intel.com>
To: intel-gfx@lists.freedesktop.org
Cc: jani.nikula@intel.com
Subject: [PATCH 2/3 V3] drm/i915/BXT: Fixed COS blanking issue
Date: Thu, 11 Feb 2016 20:29:14 +0530	[thread overview]
Message-ID: <1455202754-10795-1-git-send-email-ramalingam.c@intel.com> (raw)
In-Reply-To: <56BC9F7C.9030902@intel.com>

From: Uma Shankar <uma.shankar@intel.com>

During Charging OS mode, mipi display was blanking.This is
because during driver load, though encoder, connector were
active but crtc returned inactive. This caused sanitize
function to disable the DSI panel. In AOS, this is fine
since HWC will do a modeset and crtc, connector, encoder
mapping will be restored. But in COS, no modeset is called,
it just calls DPMS ON/OFF.

This is fine on BYT/CHT since transcoder is common b/w
all encoders. But for BXT, there is a separate mipi
transcoder. Hence this needs special handling for BXT.

V2: pipe_config->has_dsi_encoder is set for BXT [By Jani]

V3: Timing parameters are retrieved from VBT. [By Jani]

Signed-off-by: Uma Shankar <uma.shankar@intel.com>
Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
---
 drivers/gpu/drm/i915/intel_display.c |  106 ++++++++++++++++++++++++++++++++--
 1 file changed, 100 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index a66220a..e47a75c 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -34,6 +34,7 @@
 #include <drm/drm_edid.h>
 #include <drm/drmP.h>
 #include "intel_drv.h"
+#include "intel_dsi.h"
 #include <drm/i915_drm.h>
 #include "i915_drv.h"
 #include "i915_trace.h"
@@ -7814,6 +7815,53 @@ static void intel_set_pipe_timings(struct intel_crtc *intel_crtc)
 		   (intel_crtc->config->pipe_src_h - 1));
 }
 
+static void intel_get_dsi_pipe_timings(struct intel_crtc *crtc,
+				   struct intel_crtc_state *pipe_config)
+{
+	struct drm_device *dev = crtc->base.dev;
+	struct drm_i915_private *dev_priv = dev->dev_private;
+	struct drm_display_mode *vbt_dsi_mode =
+						dev_priv->vbt.lfp_lvds_vbt_mode;
+	struct intel_encoder *encoder;
+	uint32_t tmp;
+
+	pipe_config->base.adjusted_mode.crtc_hdisplay = vbt_dsi_mode->hdisplay;
+	pipe_config->base.adjusted_mode.crtc_htotal = vbt_dsi_mode->htotal;
+	pipe_config->base.adjusted_mode.crtc_hblank_start =
+						vbt_dsi_mode->hdisplay;
+	pipe_config->base.adjusted_mode.crtc_hblank_end = vbt_dsi_mode->htotal;
+	pipe_config->base.adjusted_mode.crtc_hsync_start =
+						vbt_dsi_mode->hsync_start;
+	pipe_config->base.adjusted_mode.crtc_hsync_end =
+						vbt_dsi_mode->hsync_end;
+
+	pipe_config->base.adjusted_mode.crtc_vdisplay = vbt_dsi_mode->vdisplay;
+	pipe_config->base.adjusted_mode.crtc_vtotal = vbt_dsi_mode->vtotal;
+	pipe_config->base.adjusted_mode.crtc_vblank_start =
+							vbt_dsi_mode->vdisplay;
+	pipe_config->base.adjusted_mode.crtc_vblank_end = vbt_dsi_mode->vtotal;
+	pipe_config->base.adjusted_mode.crtc_vsync_start =
+						vbt_dsi_mode->vsync_start;
+	pipe_config->base.adjusted_mode.crtc_vsync_end =
+						vbt_dsi_mode->vsync_end;
+
+	for_each_encoder_on_crtc(dev, &crtc->base, encoder) {
+		if (encoder->type == INTEL_OUTPUT_DSI) {
+			struct intel_dsi *intel_dsi =
+				enc_to_intel_dsi(&encoder->base);
+			pipe_config->pipe_bpp =
+				dsi_pixel_format_bpp(intel_dsi->pixel_format);
+		}
+	}
+
+	tmp = I915_READ(PIPESRC(crtc->pipe));
+	pipe_config->pipe_src_h = (tmp & 0xffff) + 1;
+	pipe_config->pipe_src_w = ((tmp >> 16) & 0xffff) + 1;
+
+	pipe_config->base.mode.vdisplay = pipe_config->pipe_src_h;
+	pipe_config->base.mode.hdisplay = pipe_config->pipe_src_w;
+}
+
 static void intel_get_pipe_timings(struct intel_crtc *crtc,
 				   struct intel_crtc_state *pipe_config)
 {
@@ -9962,6 +10010,40 @@ static void haswell_get_ddi_port_state(struct intel_crtc *crtc,
 	}
 }
 
+static void bxt_get_pipe_config_dsi(struct intel_crtc *crtc,
+					struct intel_crtc_state *pipe_config)
+{
+	struct drm_device *dev = crtc->base.dev;
+	struct drm_i915_private *dev_priv = dev->dev_private;
+	enum port port = (dev_priv->vbt.dsi.port == DVO_PORT_MIPIA)
+				? PORT_A : PORT_C;
+	uint32_t dsi_ctrl = I915_READ(MIPI_CTRL(port));
+	uint32_t tmp;
+
+	tmp = I915_READ(BXT_MIPI_PORT_CTRL(port));
+	if (tmp & DPI_ENABLE) {
+		enum pipe trans_dsi_pipe;
+
+		switch (dsi_ctrl & BXT_PIPE_SELECT_MASK) {
+		default:
+			WARN(1, "unknown pipe linked to dsi transcoder\n");
+			return;
+		case BXT_PIPE_SELECT(PIPE_A):
+			trans_dsi_pipe = PIPE_A;
+			break;
+		case BXT_PIPE_SELECT(PIPE_B):
+			trans_dsi_pipe = PIPE_B;
+			break;
+		case BXT_PIPE_SELECT(PIPE_C):
+			trans_dsi_pipe = PIPE_C;
+			break;
+		}
+
+		if (trans_dsi_pipe == crtc->pipe)
+			pipe_config->has_dsi_encoder = true;
+	}
+}
+
 static bool haswell_get_pipe_config(struct intel_crtc *crtc,
 				    struct intel_crtc_state *pipe_config)
 {
@@ -9999,17 +10081,29 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
 			pipe_config->cpu_transcoder = TRANSCODER_EDP;
 	}
 
+	if (dev_priv->vbt.has_mipi && IS_BROXTON(dev))
+		bxt_get_pipe_config_dsi(crtc, pipe_config);
+
 	if (!intel_display_power_is_enabled(dev_priv,
 			POWER_DOMAIN_TRANSCODER(pipe_config->cpu_transcoder)))
 		return false;
 
-	tmp = I915_READ(PIPECONF(pipe_config->cpu_transcoder));
-	if (!(tmp & PIPECONF_ENABLE))
-		return false;
-
-	haswell_get_ddi_port_state(crtc, pipe_config);
+	if (pipe_config->has_dsi_encoder && IS_BROXTON(dev))
+		/*
+		 * BXT doesn't have the PIPE timing registers.
+		 * Hence retrieved the pipe detail from PORT register.
+		 * And timing parameters are obtained from VBT
+		 */
+		intel_get_dsi_pipe_timings(crtc, pipe_config);
+	else {
+		tmp = I915_READ(PIPECONF(pipe_config->cpu_transcoder));
+		if (!(tmp & PIPECONF_ENABLE))
+			return false;
+		if (!IS_VALLEYVIEW(dev))
+			haswell_get_ddi_port_state(crtc, pipe_config);
 
-	intel_get_pipe_timings(crtc, pipe_config);
+		intel_get_pipe_timings(crtc, pipe_config);
+	}
 
 	if (INTEL_INFO(dev)->gen >= 9) {
 		skl_init_scalers(dev, crtc, pipe_config);
-- 
1.7.9.5

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2016-02-11 15:07 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-02 17:54 [PATCH 1/2] drm/i915/BXT: Fixed COS blanking issue Ramalingam C
2016-02-02 17:54 ` [PATCH 2/2] drm/i915/dsi: Add audio reference in dsi encoder Ramalingam C
2016-02-03  1:52   ` Thulasimani, Sivakumar
2016-02-03  8:57   ` Jani Nikula
2016-02-03  9:24     ` Ramalingam C
2016-02-03 10:01       ` Jani Nikula
2016-02-19  9:23         ` Jani Nikula
2016-02-19  9:31           ` Ramalingam C
2016-02-02 18:23 ` [PATCH 1/2] drm/i915/BXT: Fixed COS blanking issue kbuild test robot
2016-02-02 18:38 ` kbuild test robot
2016-02-03  1:49 ` Thulasimani, Sivakumar
2016-02-03 12:20   ` Ramalingam C
2016-02-03  8:02 ` ✗ Fi.CI.BAT: failure for series starting with [1/2] " Patchwork
2016-02-03  9:44 ` [PATCH 1/2] " Jani Nikula
2016-02-03 12:18   ` Ramalingam C
2016-02-03 12:27   ` [PATCH 1/2] drm/i915: Using the bpp value wrt the pixel format Ramalingam C
2016-02-03 12:27     ` [PATCH 2/2] drm/i915/BXT: Fixed COS blanking issue Ramalingam C
2016-02-04 13:54       ` Jani Nikula
2016-02-11 14:49         ` Ramalingam C
2016-02-11 14:59           ` Ramalingam C [this message]
2016-02-19  9:16             ` [PATCH 2/3 V3] " Jani Nikula
2016-02-04 13:13     ` [PATCH 1/2] drm/i915: Using the bpp value wrt the pixel format Jani Nikula
2016-02-11 15:00       ` Ramalingam C
2016-02-11 15:03         ` [PATCH 1/3 V2] " Ramalingam C
2016-02-11 15:05           ` [PATCH 3/3] drm/i915: Updating the CPU_TRANSCODER for BXT DSI Ramalingam C
2016-02-19  9:07             ` Jani Nikula
2016-02-23 14:31               ` Ramalingam C
2016-02-19  8:50           ` [PATCH 1/3 V2] drm/i915: Using the bpp value wrt the pixel format Jani Nikula
2016-02-19 12:50             ` Mika Kahola
2016-02-19 13:08               ` Jani Nikula
2016-02-15 16:28   ` [PATCH 1/2] drm/i915/BXT: Fixed COS blanking issue Daniel Vetter
2016-02-03 13:12 ` ✓ Fi.CI.BAT: success for series starting with [1/2] drm/i915: Using the bpp value wrt the pixel format (rev2) Patchwork
2016-02-15 16:24 ` [PATCH 1/2] drm/i915/BXT: Fixed COS blanking issue Daniel Vetter

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=1455202754-10795-1-git-send-email-ramalingam.c@intel.com \
    --to=ramalingam.c@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=jani.nikula@intel.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.