From: Eugeni Dodonov <eugeni.dodonov@intel.com>
To: intel-gfx@lists.freedesktop.org
Cc: Eugeni Dodonov <eugeni.dodonov@intel.com>
Subject: [PATCH 33/41] drm/i915: initialize DDI buffer translations
Date: Thu, 29 Mar 2012 12:32:49 -0300 [thread overview]
Message-ID: <1333035177-19607-34-git-send-email-eugeni.dodonov@intel.com> (raw)
In-Reply-To: <1333035177-19607-1-git-send-email-eugeni.dodonov@intel.com>
Buffer translations for DDI links must be initialized prior to enablement.
For FDI and DP, first 9 pairs of values are used to select the connection
parameters. HDMI uses the last pair of values and ignores the first 9
pairs. So we program HDMI values in both cases, which allows HDMI to work
over both FDI and DP-friendly buffers.
Signed-off-by: Eugeni Dodonov <eugeni.dodonov@intel.com>
---
drivers/gpu/drm/i915/intel_display.c | 84 +++++++++++++++++++++++++++++++++-
drivers/gpu/drm/i915/intel_drv.h | 1 +
2 files changed, 84 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 72f2211..1fdcd56 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2728,6 +2728,86 @@ static void gen6_fdi_link_train(struct drm_crtc *crtc)
DRM_DEBUG_KMS("FDI train done.\n");
}
+/* HDMI/DVI modes ignore everything but the last 2 items. So we share
+ * them for both DP and FDI transports, allowing those ports to
+ * automatically adapt to HDMI connections as well
+ */
+static const long hsw_ddi_translations_dp[] = {
+ 0x00FFFFFF, 0x0006000E,
+ 0x00D75FFF, 0x0005000A,
+ 0x00C30FFF, 0x00040006,
+ 0x80AAAFFF, 0x000B0000,
+ 0x00FFFFFF, 0x0005000A,
+ 0x00D75FFF, 0x000C0004,
+ 0x80C30FFF, 0x000B0000,
+ 0x00FFFFFF, 0x00040006,
+ 0x80D75FFF, 0x000B0000,
+ 0x00FFFFFF, 0x00040006
+};
+
+static const long hsw_ddi_translations_fdi[] = {
+ 0x00FFFFFF, 0x0007000E,
+ 0x00D75FFF, 0x000F000A,
+ 0x00C30FFF, 0x00060006,
+ 0x00AAAFFF, 0x001E0000,
+ 0x00FFFFFF, 0x000F000A,
+ 0x00D75FFF, 0x00160004,
+ 0x00C30FFF, 0x001E0000,
+ 0x00FFFFFF, 0x00060006,
+ 0x00D75FFF, 0x001E0000,
+ 0x00FFFFFF, 0x00040006
+};
+
+/* On Haswell, DDI port buffers must be programmed with correct values
+ * in advance. The buffer values are different for FDI and DP modes,
+ * but the HDMI/DVI fields are shared among those. So we program the DDI
+ * in either FDI or DP modes only, as HDMI connections will work with both
+ * of those
+ */
+void hsw_prepare_ddi_buffers(struct drm_device *dev, enum port port, bool use_fdi_mode)
+{
+ struct drm_i915_private *dev_priv = dev->dev_private;
+ u32 reg;
+ int i, j;
+
+ DRM_DEBUG_DRIVER("Initializing DDI buffers for port %c in %s mode\n",
+ port_name(port),
+ use_fdi_mode ? "FDI" : "DP");
+
+ WARN((use_fdi_mode && (port != PORT_E)),
+ "Programming port %c in FDI mode, this probably will not work.\n",
+ port_name(port));
+
+ /* Those registers seem to be double-buffered, so write them twice */
+ for (j=0; j < 2; j++) {
+ for (i=0, reg=DDI_BUF_TRANS(port); i < ARRAY_SIZE(hsw_ddi_translations_fdi); i++) {
+ I915_WRITE(reg,
+ (use_fdi_mode) ?
+ hsw_ddi_translations_fdi[i] :
+ hsw_ddi_translations_dp[i]);
+ reg += 4;
+ }
+ udelay(20);
+ }
+}
+
+/* Program DDI buffers translations for DP. By default, program ports A-D in DP
+ * mode and port E for FDI.
+ */
+static void intel_hsw_prepare_ddi_buffers(struct drm_device *dev)
+{
+ int port;
+
+ for (port = PORT_A; port < PORT_E; port++)
+ hsw_prepare_ddi_buffers(dev, port, false);
+
+ /* DDI E is the suggested one to work in FDI mode, so program is as such by
+ * default. It will have to be re-programmed in case a digital DP output
+ * will be detected on it
+ */
+ hsw_prepare_ddi_buffers(dev, PORT_E, true);
+}
+
/* Manual link training for Ivy Bridge A0 parts */
static void ivb_manual_fdi_link_train(struct drm_crtc *crtc)
{
@@ -9235,8 +9315,10 @@ void intel_modeset_init(struct drm_device *dev)
intel_init_quirks(dev);
- if (IS_HASWELL(dev))
+ if (IS_HASWELL(dev)) {
intel_init_power_wells(dev);
+ intel_hsw_prepare_ddi_buffers(dev);
+ }
intel_init_display(dev);
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 9cec6c3..ef1d4ca 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -407,6 +407,7 @@ extern void intel_init_clock_gating(struct drm_device *dev);
extern void intel_write_eld(struct drm_encoder *encoder,
struct drm_display_mode *mode);
extern void intel_cpt_verify_modeset(struct drm_device *dev, int pipe);
+extern void hsw_prepare_ddi_buffers(struct drm_device *dev, enum port port, bool use_fdi_mode);
/* For use by IVB LP watermark workaround in intel_sprite.c */
extern void sandybridge_update_wm(struct drm_device *dev);
--
1.7.9.5
next prev parent reply other threads:[~2012-03-29 16:01 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-29 15:32 [PATCH 00/41] [RFC] Haswell v2 Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 01/41] drm/i915: transform HAS_PCH_SPLIT in a feature check Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 02/41] drm/i915: add Haswell devices and their PCI IDs Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 03/41] drm/i915: hook Haswell devices in place Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 04/41] drm/i915: add support for LynxPoint PCH Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 05/41] drm/i915: add support for power wells Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 06/41] drm/i915: add enumeration for DDI ports Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 07/41] drm/i915: add DDI registers Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 08/41] drm/i915: add DP_TP_CTL registers Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 09/41] drm/i915: add DP_TP_STATUS registers Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 10/41] drm/i915: add definitions for DDI_BUF_CTL registers Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 11/41] drm/i915: add definition of DDI buffer translations regs Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 12/41] drm/i915: add definition of LPT FDI port width registers Eugeni Dodonov
2012-03-29 20:25 ` Daniel Vetter
2012-03-29 15:32 ` [PATCH 13/41] drm/i915: add SBI registers Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 14/41] drm/i915: add support for SBI ops Eugeni Dodonov
2012-03-29 20:27 ` Daniel Vetter
2012-03-29 15:32 ` [PATCH 15/41] drm/i915: add PIXCLK_GATE register Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 16/41] drm/i915: add S PLL control Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 17/41] drm/i915: add port clock selection support for HSW Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 18/41] drm/i915: add SSC offsets for SBI access Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 19/41] drm/i915: add LCPLL control registers Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 20/41] drm/i915: add WRPLL clocks Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 21/41] drm/i915: add WM_LINETIME registers Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 22/41] drm/i915: add SFUSE_STRAP registers for digital port detection Eugeni Dodonov
2012-03-29 20:35 ` Daniel Vetter
2012-03-29 15:32 ` [PATCH 23/41] drm/i915: calculate same watermarks on Haswell as on Ivy Bridge Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 24/41] drm/i915: share forcewaking code between IVB and HSW Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 25/41] drm/i915: haswell has 3 pipes as well Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 26/41] drm/i915: reuse Ivybridge interrupts code for Haswell Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 27/41] drm/i915: share pipe count handling with Ivybridge Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 28/41] drm/i915: share IVB cursor routine with Haswell Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 29/41] drm/i915: show unknown sdvox registers on hdmi init Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 30/41] drm/i915: enable power wells on haswell init Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 31/41] drm/i915: disable rc6 on haswell for now Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 32/41] drm/i915: program WM_LINETIME on Haswell Eugeni Dodonov
2012-03-29 15:32 ` Eugeni Dodonov [this message]
2012-03-29 15:32 ` [PATCH 34/41] drm/i915: perform Haswell DDI link training in FDI mode Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 35/41] drm/i915: disable pipe DDI function when disabling pipe Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 36/41] drm/i915: do not use fdi_normal_train on haswell Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 37/41] drm/i915: program iCLKIP on Lynx Point Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 38/41] drm/i915: detect digital outputs on Haswell Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 39/41] drm/i915: add support for DDI-controlled digital outputs Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 40/41] drm/i915: prepare HDMI link for Haswell Eugeni Dodonov
2012-03-29 15:32 ` [PATCH 41/41] drm/i915: add debugging bits for haswell modesetting Eugeni Dodonov
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=1333035177-19607-34-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;
as well as URLs for NNTP newsgroup(s).