public inbox for intel-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
From: Eugeni Dodonov <eugeni.dodonov@intel.com>
To: intel-gfx@lists.freedesktop.org
Cc: Eugeni Dodonov <eugeni.dodonov@intel.com>
Subject: [PATCH 16/21] drm/i915: Modesetting for eDP on HSw
Date: Thu, 28 Jun 2012 15:55:44 -0300	[thread overview]
Message-ID: <1340909749-15249-17-git-send-email-eugeni.dodonov@intel.com> (raw)
In-Reply-To: <1340909749-15249-1-git-send-email-eugeni.dodonov@intel.com>

From: Shobhit Kumar <shobhit.kumar@intel.com>

The MSA register and PIPE EDP register are differnet than that of DP.
Also link training flow though similar for DP had been corrected to
follow DP path

Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
Signed-off-by: Sateesh Kavuri <sateesh.kavuri@intel.com>
Signed-off-by: Eugeni Dodonov <eugeni.dodonov@intel.com>
---
 drivers/gpu/drm/i915/i915_reg.h  |  1 +
 drivers/gpu/drm/i915/intel_ddi.c | 70 ++++++++++++++++++++++++++++------------
 drivers/gpu/drm/i915/intel_dp.c  |  8 ++---
 drivers/gpu/drm/i915/intel_drv.h |  1 +
 4 files changed, 55 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 1e70fae..1165d2e 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -4316,6 +4316,7 @@
 #define  PIPE_DDI_MODE_SELECT_DP_SST	(2<<24)
 #define  PIPE_DDI_MODE_SELECT_DP_MST	(3<<24)
 #define  PIPE_DDI_MODE_SELECT_FDI		(4<<24)
+#define  PIPE_DDI_BPC_MASK		(0x7<<20)
 #define  PIPE_DDI_BPC_8					(0<<20)
 #define  PIPE_DDI_BPC_10				(1<<20)
 #define  PIPE_DDI_BPC_6					(2<<20)
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 1c76d20..9d09f38 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -756,22 +756,16 @@ intel_ddi_mode_set_dp(struct drm_encoder *encoder,
 	int port = intel_dp->ddi_port;
 	int pipe = intel_crtc->pipe;
 	int port_width = PIPE_DDI_PORT_WIDTH_X1;
-	int temp;
+	int temp, reg;
 
 	DRM_DEBUG_KMS("Preparing DP DDI mode for Haswell on port %c, pipe %c\n",
 					port_name(port), pipe_name(pipe));
 
-	/* Turn on the eDP PLL if needed */
-	/* TBD: */
-
 	/*
 	 * There are two kinds of DP registers in HSW:
 	 * DDI CPU
 	 * LPT PCH
 	 */
-	/* Preserve the BIOS-computed detected bit. This is
-	 * supposed to be read-only.
-	 */
 	intel_dp->DP = I915_READ(DDI_BUF_CTL(intel_dp->ddi_port));
 	intel_dp->DP |= DDI_BUF_EMP_400MV_0DB_HSW;
 	intel_dp->TP = I915_READ(DP_TP_CTL(intel_dp->ddi_port));
@@ -794,6 +788,10 @@ intel_ddi_mode_set_dp(struct drm_encoder *encoder,
 		BUG();
 	}
 
+	/* Assuming all 4 lanes available to DDI A for eDP */
+	if (is_edp(intel_dp))
+		intel_dp->DP |= DDI_PORT_LANE_CAP_DDIA_4;
+
 	if (intel_dp->has_audio)
 		DRM_DEBUG_DRIVER("HSW DP Audio not yet supported\n");
 
@@ -830,14 +828,24 @@ intel_ddi_mode_set_dp(struct drm_encoder *encoder,
 
 		/* Set the MSA bits, since from HSW onwards,
 		 * this has to be explictly set */
-		temp = I915_READ(HSW_MSA_CTL);
+		if (is_edp(intel_dp))
+			temp = I915_READ(HSW_MSA_EDP_CTL);
+		else
+			temp = I915_READ(HSW_MSA_CTL);
+
 		temp |= HSW_MSA_SYNC_CLK;
 		temp &= ~HSW_MSA_DYNAMIC_RANGE;
 		temp &= ~HSW_MSA_COLORIMETRY;
 		temp &= ~HSW_MSA_BPC_MASK;
-		temp |= HSW_MSA_BPC_8_BITS; /* Color depth */
 
-		I915_WRITE(HSW_MSA_CTL, temp);
+		if (is_edp(intel_dp)) {
+			temp |= HSW_MSA_BPC_6_BITS; /* Color depth */
+			I915_WRITE(HSW_MSA_EDP_CTL, temp);
+		}
+		else {
+			temp |= HSW_MSA_BPC_8_BITS; /* Color depth */
+			I915_WRITE(HSW_MSA_CTL, temp);
+		}
 
 		if ((intel_dp->dpcd[DP_MAX_DOWNSPREAD] & 0x1) == 0x1) {
 			/* SSC Enabled Panel */
@@ -854,8 +862,9 @@ intel_ddi_mode_set_dp(struct drm_encoder *encoder,
 			 */
 			I915_WRITE(PORT_CLK_SEL(port),
 					PORT_CLK_SEL_SPLL);
-			I915_WRITE(PIPE_CLK_SEL(pipe),
-					PIPE_CLK_SEL_PORT(port));
+			if (!is_edp(intel_dp))
+				I915_WRITE(PIPE_CLK_SEL(pipe),
+						PIPE_CLK_SEL_PORT(port));
 		} else {
 			/* Non SSC Panel */
 			/* configure LCPLL for NON-SSC */
@@ -864,30 +873,49 @@ intel_ddi_mode_set_dp(struct drm_encoder *encoder,
 				LCPLL_PLL_REFERENCE_NON_SSC;
 			I915_WRITE(LCPLL_CTL, temp);
 			udelay(20);
-
 			/* Use LCPLL clock to drive the output to the dp port,
 			 * and tell the pipe to use this port for connection.
 			 */
 			I915_WRITE(PORT_CLK_SEL(port),
 					PORT_CLK_SEL_LCPLL_1350);
-			I915_WRITE(PIPE_CLK_SEL(pipe),
-					PIPE_CLK_SEL_PORT(port));
+			if (!is_edp(intel_dp))
+				I915_WRITE(PIPE_CLK_SEL(pipe),
+						PIPE_CLK_SEL_PORT(port));
 		}
 
 		/* Enable PIPE_DDI_FUNC_CTL for the pipe to work in DP mode */
-		temp = I915_READ(DDI_FUNC_CTL(pipe));
+		if(is_edp(intel_dp)) {
+			reg = PIPE_DDI_FUNC_CTL_EDP;
+			temp = I915_READ(reg);
+			temp &= ~PIPE_DDI_EDP_INPUT_SRC_MASK ;
+
+			/* Use On/Off for now to address all cases; later we
+			 * need to also add support for always on without panel
+			 * fitter in case of native mode to save power
+			 */
+			temp &= ~PIPE_DDI_BPC_MASK;
+			temp |= PIPE_DDI_EDI_INPUT_SRC_A_ON_OFF;
+			temp |= ((intel_crtc->bpp > 24) ?
+				PIPE_DDI_BPC_12 :
+				PIPE_DDI_BPC_6);
+		}
+		else {
+			reg = DDI_FUNC_CTL(pipe);
+			temp = I915_READ(reg);
+			temp &= ~PIPE_DDI_BPC_MASK;
+			temp |= ((intel_crtc->bpp > 24) ?
+				PIPE_DDI_BPC_12 :
+				PIPE_DDI_BPC_8);
+		}
+
 		temp &= ~PIPE_DDI_PORT_MASK;
-		temp &= ~PIPE_DDI_BPC_12;
 		temp &= ~PIPE_DDI_PORT_WIDTH_MASK;
 		temp |= PIPE_DDI_SELECT_PORT(port) |
 			PIPE_DDI_MODE_SELECT_DP_SST |
 			port_width |
-			((intel_crtc->bpp > 24) ?
-			 PIPE_DDI_BPC_12 :
-			 PIPE_DDI_BPC_8) |
 			PIPE_DDI_FUNC_ENABLE;
 
-		I915_WRITE(DDI_FUNC_CTL(pipe), temp);
+		I915_WRITE(reg, temp);
 	}
 }
 
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 38a1d3b..f086944 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -45,7 +45,7 @@
  * If a CPU or PCH DP output is attached to an eDP panel, this function
  * will return true, and false otherwise.
  */
-static bool is_edp(struct intel_dp *intel_dp)
+bool is_edp(struct intel_dp *intel_dp)
 {
 	return intel_dp->base.type == INTEL_OUTPUT_EDP;
 }
@@ -363,7 +363,7 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,
 	 * clock divider.
 	 */
 	if (is_cpu_edp(intel_dp)) {
-		if (IS_GEN6(dev) || IS_GEN7(dev))
+		if ((IS_GEN6(dev) || IS_GEN7(dev)) && !IS_HASWELL(dev))
 			aux_clock_divider = 200; /* SNB & IVB eDP input clock at 400Mhz */
 		else
 			aux_clock_divider = 225; /* eDP input clock at 450Mhz */
@@ -1753,7 +1753,7 @@ intel_dp_start_link_train(struct intel_dp *intel_dp)
 		uint32_t    signal_levels;
 
 
-		if (IS_GEN7(dev) && is_cpu_edp(intel_dp)) {
+		if (IS_GEN7(dev) && is_cpu_edp(intel_dp) && !IS_HASWELL(dev)) {
 			signal_levels = intel_gen7_edp_signal_levels(intel_dp->train_set[0]);
 			DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_IVB) | signal_levels;
 		} else if (IS_GEN6(dev) && is_cpu_edp(intel_dp)) {
@@ -1855,7 +1855,7 @@ intel_dp_complete_link_train(struct intel_dp *intel_dp)
 			break;
 		}
 
-		if (IS_GEN7(dev) && is_cpu_edp(intel_dp)) {
+		if (IS_GEN7(dev) && is_cpu_edp(intel_dp) && !IS_HASWELL(dev)) {
 			signal_levels = intel_gen7_edp_signal_levels(intel_dp->train_set[0]);
 			DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_IVB) | signal_levels;
 		} else if (IS_GEN6(dev) && is_cpu_edp(intel_dp)) {
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 5ca133d..a741a02 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -392,6 +392,7 @@ extern void intel_mark_busy(struct drm_device *dev,
 extern bool intel_lvds_init(struct drm_device *dev);
 extern void intel_dp_init(struct drm_device *dev, int dp_reg);
 extern struct intel_dp *enc_to_intel_dp(struct drm_encoder *encoder);
+extern bool is_edp(struct intel_dp *intel_dp);
 
 void
 intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode,
-- 
1.7.11.1

  parent reply	other threads:[~2012-06-28 18:54 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-28 18:55 [PATCH 00/21] More Haswell patches Eugeni Dodonov
2012-06-28 18:55 ` [PATCH 01/21] drm/i915: Move DP structs to shared location Eugeni Dodonov
2012-06-28 18:55 ` [PATCH 02/21] drm/i915: Add support for DDI control DP outputs Eugeni Dodonov
2012-06-28 18:55 ` [PATCH 03/21] drm/i915: Add DP Helper functions for Haswell Eugeni Dodonov
2012-06-28 18:55 ` [PATCH 04/21] drm/i915: Haswell specific code for the DP Link Training Eugeni Dodonov
2012-06-28 18:55 ` [PATCH 05/21] drm/i915: Disable DDI Pipe Control on HSW while disabling pipe Eugeni Dodonov
2012-06-28 18:55 ` [PATCH 06/21] drm/i915: Hook DP init in ddi module Eugeni Dodonov
2012-06-28 18:55 ` [PATCH 07/21] drm/i915: re-initialize DDI buffer translations after resume Eugeni Dodonov
2012-07-04 20:07   ` Paulo Zanoni
2012-07-04 20:35     ` Daniel Vetter
2012-07-04 23:13       ` Eugeni Dodonov
2012-06-28 18:55 ` [PATCH 08/21] drm/i915: simplify FDI RX check for LPT Eugeni Dodonov
2012-06-28 18:55 ` [PATCH 09/21] drm/i915: account for only one transcoder on LPT Eugeni Dodonov
2012-06-28 18:55 ` [PATCH 10/21] drm/i915: introduce lpt_enable_pch and cpt_enable_pch Eugeni Dodonov
2012-07-04 18:21   ` Paulo Zanoni
2012-07-06 20:47     ` Eugeni Dodonov
2012-06-28 18:55 ` [PATCH 11/21] drm/i915: program FDI_RX TP and FDI delays Eugeni Dodonov
2012-07-04 21:15   ` Paulo Zanoni
2012-07-04 23:15     ` [PATCH 10/31] " Eugeni Dodonov
2012-07-05 12:58       ` Paulo Zanoni
2012-07-05 13:12         ` Daniel Vetter
2012-06-28 18:55 ` [PATCH 12/21] drm/i915: support Haswell-style force waking Eugeni Dodonov
2012-06-28 19:38   ` Daniel Vetter
2012-06-28 20:06     ` Eugeni Dodonov
2012-06-28 18:55 ` [PATCH 13/21] drm/i915: add RPS configuration for Haswell Eugeni Dodonov
2012-06-29  9:56   ` Daniel Vetter
2012-06-29 13:49     ` Eugeni Dodonov
2012-06-28 18:55 ` [PATCH 14/21] drm/i915: Add EDP Registers " Eugeni Dodonov
2012-06-28 18:55 ` [PATCH 15/21] drm/i915: Timing initialization for eDP on HSW Eugeni Dodonov
2012-06-28 18:55 ` Eugeni Dodonov [this message]
2012-06-28 18:55 ` [PATCH 17/21] drm/i915: Hook eDP initialization on DDI A Eugeni Dodonov
2012-06-28 18:55 ` [PATCH 18/21] drm/i915: introduce haswell_init_clock_gating Eugeni Dodonov
2012-06-28 18:55 ` [PATCH 19/21] drm/i915: prevent bogus intel_update_fbc notifications Eugeni Dodonov
2012-06-28 19:24   ` Daniel Vetter
2012-06-28 20:11     ` Eugeni Dodonov
2012-07-04 17:41       ` Paulo Zanoni
2012-07-04 23:19         ` Eugeni Dodonov
2012-07-05  7:47           ` Daniel Vetter
2012-06-28 18:55 ` [PATCH 20/21] drm/i915: fix PIPE_WM_LINETIME definition Eugeni Dodonov
2012-06-28 19:39   ` Daniel Vetter
2012-06-28 18:55 ` [PATCH 21/21] drm/i915: enable RC6 workaround on Haswell Eugeni Dodonov
2012-06-28 19:23   ` Daniel Vetter
2012-06-28 20:10     ` Eugeni Dodonov
2012-06-28 19:22 ` [PATCH 00/21] More Haswell patches Paulo Zanoni

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=1340909749-15249-17-git-send-email-eugeni.dodonov@intel.com \
    --to=eugeni.dodonov@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox