All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paulo Zanoni <przanoni@gmail.com>
To: intel-gfx@lists.freedesktop.org
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Subject: [PATCH 06/36] drm/i915: train Haswell FDI at the right time
Date: Wed, 31 Oct 2012 18:12:25 -0200	[thread overview]
Message-ID: <1351714375-15284-7-git-send-email-przanoni@gmail.com> (raw)
In-Reply-To: <1351714375-15284-1-git-send-email-przanoni@gmail.com>

From: Paulo Zanoni <paulo.r.zanoni@intel.com>

Haswell FDI link training is very different from the previous
generations.

After this commit, hsw_fdi_link_train is responsible for implementing
all the steps described as "Enable and train FDI" from the Haswell
CRT mode set sequence documentation.

We need to train the FDI before enabling the pipes and planes, so
we're moving the call from lpt_pch_enable to haswell_crtc_enable
directly.

We are also removing ironlake_fdi_pll_enable since the PLL enablement
on Haswell is completely different and is also done during the link
training steps.

There are still quite a few things we need to fix on
hsw_fdi_link_train, so stay tuned for the next patches :)

Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
---
 drivers/gpu/drm/i915/i915_reg.h      | 17 +++++++++++------
 drivers/gpu/drm/i915/intel_ddi.c     | 34 ++++++++++++++++++++++++----------
 drivers/gpu/drm/i915/intel_display.c |  5 +----
 3 files changed, 36 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 0514823..abdc002 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -3917,16 +3917,21 @@
 #define  FDI_PORT_WIDTH_2X_LPT			(1<<19)
 #define  FDI_PORT_WIDTH_1X_LPT			(0<<19)
 
-#define _FDI_RXA_MISC            0xf0010
-#define _FDI_RXB_MISC            0xf1010
+#define _FDI_RXA_MISC			0xf0010
+#define _FDI_RXB_MISC			0xf1010
+#define  FDI_RX_PWRDN_LANE1_MASK	(3<<26)
+#define  FDI_RX_PWRDN_LANE1_VAL(x)	((x)<<26)
+#define  FDI_RX_PWRDN_LANE0_MASK	(3<<24)
+#define  FDI_RX_PWRDN_LANE0_VAL(x)	((x)<<24)
+#define  FDI_RX_TP1_TO_TP2_48		(2<<20)
+#define  FDI_RX_TP1_TO_TP2_64		(3<<20)
+#define  FDI_RX_FDI_DELAY_90		(0x90<<0)
+#define FDI_RX_MISC(pipe) _PIPE(pipe, _FDI_RXA_MISC, _FDI_RXB_MISC)
+
 #define _FDI_RXA_TUSIZE1         0xf0030
 #define _FDI_RXA_TUSIZE2         0xf0038
 #define _FDI_RXB_TUSIZE1         0xf1030
 #define _FDI_RXB_TUSIZE2         0xf1038
-#define  FDI_RX_TP1_TO_TP2_48	(2<<20)
-#define  FDI_RX_TP1_TO_TP2_64	(3<<20)
-#define  FDI_RX_FDI_DELAY_90	(0x90<<0)
-#define FDI_RX_MISC(pipe) _PIPE(pipe, _FDI_RXA_MISC, _FDI_RXB_MISC)
 #define FDI_RX_TUSIZE1(pipe) _PIPE(pipe, _FDI_RXA_TUSIZE1, _FDI_RXB_TUSIZE1)
 #define FDI_RX_TUSIZE2(pipe) _PIPE(pipe, _FDI_RXA_TUSIZE2, _FDI_RXB_TUSIZE2)
 
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 67bd6ba..39a53b4 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -154,7 +154,30 @@ void hsw_fdi_link_train(struct drm_crtc *crtc)
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 	int pipe = intel_crtc->pipe;
-	u32 reg, temp, i;
+	u32 reg, temp, i, rx_ctl_val;
+
+	/* Set the FDI_RX_MISC pwrdn lanes and the 2 workarounds listed at the
+	 * mode set "sequence for CRT port" document:
+	 * - TP1 to TP2 time with the default value
+	 * - FDI delay to 90h
+	 */
+	I915_WRITE(_FDI_RXA_MISC, FDI_RX_PWRDN_LANE1_VAL(2) |
+				  FDI_RX_PWRDN_LANE0_VAL(2) |
+				  FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90);
+
+	/* Enable the PCH Receiver FDI PLL */
+	rx_ctl_val = FDI_RX_PLL_ENABLE | FDI_RX_ENHANCE_FRAME_ENABLE |
+		     ((intel_crtc->fdi_lanes - 1) << 19);
+	I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
+	POSTING_READ(_FDI_RXA_CTL);
+	udelay(220);
+
+	/* Switch from Rawclk to PCDclk */
+	rx_ctl_val |= FDI_PCDCLK;
+	I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
+
+	/* Configure Port Clock Select */
+	I915_WRITE(PORT_CLK_SEL(PORT_E), intel_crtc->ddi_pll_sel);
 
 	/* Start the training iterating through available voltages and emphasis */
 	for (i=0; i < ARRAY_SIZE(hsw_ddi_buf_ctl_values); i++) {
@@ -176,15 +199,6 @@ void hsw_fdi_link_train(struct drm_crtc *crtc)
 
 		udelay(600);
 
-		/* We need to program FDI_RX_MISC with the default TP1 to TP2
-		 * values before enabling the receiver, and configure the delay
-		 * for the FDI timing generator to 90h. Luckily, all the other
-		 * bits are supposed to be zeroed, so we can write those values
-		 * directly.
-		 */
-		I915_WRITE(FDI_RX_MISC(pipe), FDI_RX_TP1_TO_TP2_48 |
-				FDI_RX_FDI_DELAY_90);
-
 		/* Enable CPU FDI Receiver with auto-training */
 		reg = FDI_RX_CTL(pipe);
 		I915_WRITE(reg,
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 2dff7b2..e0b1f8c 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -3147,9 +3147,6 @@ static void lpt_pch_enable(struct drm_crtc *crtc)
 	I915_WRITE(FDI_RX_TUSIZE1(pipe),
 		   I915_READ(PIPE_DATA_M1(pipe)) & TU_SIZE_MASK);
 
-	/* For PCH output, training FDI link */
-	dev_priv->display.fdi_link_train(crtc);
-
 	/* XXX: pch pll's can be enabled any time before we enable the PCH
 	 * transcoder, and we actually should do this to not upset any PCH
 	 * transcoder that already use the clock when we share it.
@@ -3389,7 +3386,7 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
 	is_pch_port = haswell_crtc_driving_pch(crtc);
 
 	if (is_pch_port)
-		ironlake_fdi_pll_enable(intel_crtc);
+		dev_priv->display.fdi_link_train(crtc);
 
 	for_each_encoder_on_crtc(dev, crtc, encoder)
 		if (encoder->pre_enable)
-- 
1.7.11.4

  parent reply	other threads:[~2012-10-31 20:13 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-31 20:12 [PATCH 00/36] Haswell VGA fixes Paulo Zanoni
2012-10-31 20:12 ` [PATCH 01/36] drm/i915: don't set ADPA pipe select on LPT Paulo Zanoni
2012-10-31 20:12 ` [PATCH 02/36] drm/i915: use intel_ddi_get_hw_state on CRT encoder too Paulo Zanoni
2012-10-31 20:12 ` [PATCH 03/36] drm/i915: add lpt_pch_enable Paulo Zanoni
2012-10-31 20:12 ` [PATCH 04/36] drm/i915: remove Haswell/LPT bits from ironlake_pch_enable Paulo Zanoni
2012-10-31 20:12 ` [PATCH 05/36] drm/i915: remove ironlake bits from lpt_pch_enable Paulo Zanoni
2012-10-31 20:12 ` Paulo Zanoni [this message]
2012-11-01 15:07   ` [PATCH 06/36] drm/i915: train Haswell FDI at the right time Daniel Vetter
2012-10-31 20:12 ` [PATCH 07/36] drm/i915: use the right FDI_RX_CTL register on Haswell Paulo Zanoni
2012-11-01 15:09   ` Daniel Vetter
2012-11-01 16:47     ` Paulo Zanoni
2012-10-31 20:12 ` [PATCH 08/36] drm/i915: set the correct number of FDI lanes " Paulo Zanoni
2012-10-31 20:12 ` [PATCH 09/36] drm/i915: don't rely on DDI_BUF_CTL previous values Paulo Zanoni
2012-10-31 20:12 ` [PATCH 10/36] drm/i915: program the FDI RX TUSIZE register on hsw_fdi_link_train Paulo Zanoni
2012-11-01 15:13   ` Daniel Vetter
2012-10-31 20:12 ` [PATCH 11/36] drm/i915: properly program FDI_RX_MISC pwrdn lane values on HSW Paulo Zanoni
2012-11-01 15:15   ` Daniel Vetter
2012-10-31 20:12 ` [PATCH 12/36] drm/i915: wait only 35us for the FDI link training Paulo Zanoni
2012-10-31 20:12 ` [PATCH 13/36] drm/i915: remove an useless indentation level on hsw_fdi_link_train Paulo Zanoni
2012-10-31 20:12 ` [PATCH 14/36] drm/i915: disable FDI_RX_ENABLE, not FDI_RX_PLL_ENABLE Paulo Zanoni
2012-10-31 20:12 ` [PATCH 15/36] drm/i915: change Haswell FDI link training error messages Paulo Zanoni
2012-10-31 20:12 ` [PATCH 16/36] drm/i915: try each voltage twice at hsw_fdi_link_train Paulo Zanoni
2012-11-01 15:16   ` Daniel Vetter
2012-10-31 20:12 ` [PATCH 17/36] drm/i915: fix Haswell FDI link disable path Paulo Zanoni
2012-10-31 20:12 ` [PATCH 18/36] drm/i915: don't write FDI_RX_TUSIZE on lpt_pch_enable Paulo Zanoni
2012-11-01 15:21   ` Daniel Vetter
2012-10-31 20:12 ` [PATCH 19/36] drm/i915: rename intel_enable_pch_pll to ironlake_enable_pch_pll Paulo Zanoni
2012-11-01 15:40   ` Daniel Vetter
2012-10-31 20:12 ` [PATCH 20/36] drm/i915: don't call ironlake_enable_pch_pll on lpt_pch_enable Paulo Zanoni
2012-10-31 20:12 ` [PATCH 21/36] drm/i915: don't assert_panel_unlocked on LPT Paulo Zanoni
2012-10-31 20:12 ` [PATCH 22/36] drm/i915: use the CPU and PCH transcoders on lpt_pch_enable Paulo Zanoni
2012-10-31 20:12 ` [PATCH 23/36] drm/i915: rename intel_{en, dis}able_transcoder Paulo Zanoni
2012-10-31 20:12 ` [PATCH 24/36] drm/i915: fork lpt version of ironlake_{en, dis}able_pch_transcoder Paulo Zanoni
2012-10-31 20:12 ` [PATCH 25/36] drm/i915: remove Haswell code from ironlake_enable_pch_transcoder Paulo Zanoni
2012-10-31 20:12 ` [PATCH 26/36] drm/i915: remove IBX code from lpt_enable_pch_transcoder Paulo Zanoni
2012-10-31 20:12 ` [PATCH 27/36] drm/i915: don't assert_pch_pll_enabled on lpt_enable_pch_transcoder Paulo Zanoni
2012-11-01 16:07   ` Daniel Vetter
2012-10-31 20:12 ` [PATCH 28/36] drm/i915: use CPU and PCH transcoders " Paulo Zanoni
2012-10-31 20:12 ` [PATCH 29/36] drm/i915: use PIPECONF_INTERLACE_MASK_HSW " Paulo Zanoni
2012-11-01 16:16   ` Daniel Vetter
2012-11-01 16:53     ` Paulo Zanoni
2012-11-01 19:59       ` Daniel Vetter
2012-10-31 20:12 ` [PATCH 30/36] drm/i915: don't rely on previous values when setting LPT TRANSCONF Paulo Zanoni
2012-10-31 20:12 ` [PATCH 31/36] drm/i915: don't assert_pch_ports_disabled on LPT Paulo Zanoni
2012-11-01 16:21   ` Daniel Vetter
2012-10-31 20:12 ` [PATCH 32/36] drm/i915: use CPU and PCH transcoders on lpt_disable_pch_transcoder Paulo Zanoni
2012-10-31 20:12 ` [PATCH 33/36] drm/i915: implement timing override workarounds on LPT Paulo Zanoni
2012-10-31 20:12 ` [PATCH 34/36] drm/i915: don't intel_disable_pch_pll on Haswell/LPT Paulo Zanoni
2012-10-31 20:12 ` [PATCH 35/36] drm/i915: don't limit Haswell CRT encoder to pipe A Paulo Zanoni
2012-10-31 20:12 ` [PATCH 36/36] drm/i915: don't assert disabled FDI before disabling the FDI Paulo Zanoni
2012-11-01 21:09   ` 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=1351714375-15284-7-git-send-email-przanoni@gmail.com \
    --to=przanoni@gmail.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=paulo.r.zanoni@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.