aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArt Runyan <arthur.j.runyan@intel.com>2013-11-03 00:07:41 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-11-08 12:09:56 -0500
commite58623cb65dfa40f0ed9f6f9ddbca91aee3c9bd2 (patch)
tree71e199bed4b5c1ece6e9024be9a7803f177008d8
parent50ed5fbd9dcd6e8531cc34bb2a1e2c01ea00697d (diff)
drm/i915/bdw: Add BDW DDI buffer translation values
Many of the DDI buffer translation values have changed for BDW. Add new translation tables and selection between HSW and BDW. v2: s/BUG/WARN/ to avoid breaking future GENs. v3: Rebase on top of the hdmi translation table changes. v4: Fix up the multiline comment while at it. Signed-off-by: Art Runyan <arthur.j.runyan@intel.com> (v2) Reviewed-by: Ben Widawsky <ben@bwidawsk.net> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c53
1 files changed, 48 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 060add6468ec..bebc17730a42 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -72,6 +72,32 @@ static const u32 hsw_ddi_translations_hdmi[] = {
72 0x80FFFFFF, 0x00030002, /* 11: 1000 1000 0 */ 72 0x80FFFFFF, 0x00030002, /* 11: 1000 1000 0 */
73}; 73};
74 74
75static const u32 bdw_ddi_translations_dp[] = {
76 0x00FFFFFF, 0x0007000E, /* DP parameters */
77 0x00D75FFF, 0x000E000A,
78 0x00BEFFFF, 0x00140006,
79 0x00FFFFFF, 0x000E000A,
80 0x00D75FFF, 0x00180004,
81 0x80CB2FFF, 0x001B0002,
82 0x00F7DFFF, 0x00180004,
83 0x80D75FFF, 0x001B0002,
84 0x80FFFFFF, 0x001B0002,
85 0x00FFFFFF, 0x00140006 /* HDMI parameters 800mV 0dB*/
86};
87
88static const u32 bdw_ddi_translations_fdi[] = {
89 0x00FFFFFF, 0x0001000E, /* FDI parameters */
90 0x00D75FFF, 0x0004000A,
91 0x00C30FFF, 0x00070006,
92 0x00AAAFFF, 0x000C0000,
93 0x00FFFFFF, 0x0004000A,
94 0x00D75FFF, 0x00090004,
95 0x00C30FFF, 0x000C0000,
96 0x00FFFFFF, 0x00070006,
97 0x00D75FFF, 0x000C0000,
98 0x00FFFFFF, 0x00140006 /* HDMI parameters 800mV 0dB*/
99};
100
75enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder) 101enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder)
76{ 102{
77 struct drm_encoder *encoder = &intel_encoder->base; 103 struct drm_encoder *encoder = &intel_encoder->base;
@@ -92,8 +118,9 @@ enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder)
92 } 118 }
93} 119}
94 120
95/* On Haswell, DDI port buffers must be programmed with correct values 121/*
96 * in advance. The buffer values are different for FDI and DP modes, 122 * Starting with Haswell, DDI port buffers must be programmed with correct
123 * values in advance. The buffer values are different for FDI and DP modes,
97 * but the HDMI/DVI fields are shared among those. So we program the DDI 124 * but the HDMI/DVI fields are shared among those. So we program the DDI
98 * in either FDI or DP modes only, as HDMI connections will work with both 125 * in either FDI or DP modes only, as HDMI connections will work with both
99 * of those 126 * of those
@@ -103,10 +130,26 @@ static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port)
103 struct drm_i915_private *dev_priv = dev->dev_private; 130 struct drm_i915_private *dev_priv = dev->dev_private;
104 u32 reg; 131 u32 reg;
105 int i; 132 int i;
106 const u32 *ddi_translations = (port == PORT_E) ?
107 hsw_ddi_translations_fdi :
108 hsw_ddi_translations_dp;
109 int hdmi_level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift; 133 int hdmi_level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift;
134 const u32 *ddi_translations_fdi;
135 const u32 *ddi_translations_dp;
136 const u32 *ddi_translations;
137
138 if (IS_BROADWELL(dev)) {
139 ddi_translations_fdi = bdw_ddi_translations_fdi;
140 ddi_translations_dp = bdw_ddi_translations_dp;
141 } else if (IS_HASWELL(dev)) {
142 ddi_translations_fdi = hsw_ddi_translations_fdi;
143 ddi_translations_dp = hsw_ddi_translations_dp;
144 } else {
145 WARN(1, "ddi translation table missing\n");
146 ddi_translations_fdi = bdw_ddi_translations_fdi;
147 ddi_translations_dp = bdw_ddi_translations_dp;
148 }
149
150 ddi_translations = ((port == PORT_E) ?
151 ddi_translations_fdi :
152 ddi_translations_dp);
110 153
111 for (i = 0, reg = DDI_BUF_TRANS(port); 154 for (i = 0, reg = DDI_BUF_TRANS(port);
112 i < ARRAY_SIZE(hsw_ddi_translations_fdi); i++) { 155 i < ARRAY_SIZE(hsw_ddi_translations_fdi); i++) {