2 * Copyright © 2012 Intel Corporation
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24 * Eugeni Dodonov <eugeni.dodonov@intel.com>
29 #include "intel_drv.h"
31 struct ddi_buf_trans {
32 u32 trans1; /* balance leg enable, de-emph level */
33 u32 trans2; /* vref sel, vswing */
34 u8 i_boost; /* SKL: I_boost; valid: 0x0, 0x1, 0x3, 0x7 */
37 /* HDMI/DVI modes ignore everything but the last 2 items. So we share
38 * them for both DP and FDI transports, allowing those ports to
39 * automatically adapt to HDMI connections as well
41 static const struct ddi_buf_trans hsw_ddi_translations_dp[] = {
42 { 0x00FFFFFF, 0x0006000E, 0x0 },
43 { 0x00D75FFF, 0x0005000A, 0x0 },
44 { 0x00C30FFF, 0x00040006, 0x0 },
45 { 0x80AAAFFF, 0x000B0000, 0x0 },
46 { 0x00FFFFFF, 0x0005000A, 0x0 },
47 { 0x00D75FFF, 0x000C0004, 0x0 },
48 { 0x80C30FFF, 0x000B0000, 0x0 },
49 { 0x00FFFFFF, 0x00040006, 0x0 },
50 { 0x80D75FFF, 0x000B0000, 0x0 },
53 static const struct ddi_buf_trans hsw_ddi_translations_fdi[] = {
54 { 0x00FFFFFF, 0x0007000E, 0x0 },
55 { 0x00D75FFF, 0x000F000A, 0x0 },
56 { 0x00C30FFF, 0x00060006, 0x0 },
57 { 0x00AAAFFF, 0x001E0000, 0x0 },
58 { 0x00FFFFFF, 0x000F000A, 0x0 },
59 { 0x00D75FFF, 0x00160004, 0x0 },
60 { 0x00C30FFF, 0x001E0000, 0x0 },
61 { 0x00FFFFFF, 0x00060006, 0x0 },
62 { 0x00D75FFF, 0x001E0000, 0x0 },
65 static const struct ddi_buf_trans hsw_ddi_translations_hdmi[] = {
66 /* Idx NT mV d T mV d db */
67 { 0x00FFFFFF, 0x0006000E, 0x0 },/* 0: 400 400 0 */
68 { 0x00E79FFF, 0x000E000C, 0x0 },/* 1: 400 500 2 */
69 { 0x00D75FFF, 0x0005000A, 0x0 },/* 2: 400 600 3.5 */
70 { 0x00FFFFFF, 0x0005000A, 0x0 },/* 3: 600 600 0 */
71 { 0x00E79FFF, 0x001D0007, 0x0 },/* 4: 600 750 2 */
72 { 0x00D75FFF, 0x000C0004, 0x0 },/* 5: 600 900 3.5 */
73 { 0x00FFFFFF, 0x00040006, 0x0 },/* 6: 800 800 0 */
74 { 0x80E79FFF, 0x00030002, 0x0 },/* 7: 800 1000 2 */
75 { 0x00FFFFFF, 0x00140005, 0x0 },/* 8: 850 850 0 */
76 { 0x00FFFFFF, 0x000C0004, 0x0 },/* 9: 900 900 0 */
77 { 0x00FFFFFF, 0x001C0003, 0x0 },/* 10: 950 950 0 */
78 { 0x80FFFFFF, 0x00030002, 0x0 },/* 11: 1000 1000 0 */
81 static const struct ddi_buf_trans bdw_ddi_translations_edp[] = {
82 { 0x00FFFFFF, 0x00000012, 0x0 },
83 { 0x00EBAFFF, 0x00020011, 0x0 },
84 { 0x00C71FFF, 0x0006000F, 0x0 },
85 { 0x00AAAFFF, 0x000E000A, 0x0 },
86 { 0x00FFFFFF, 0x00020011, 0x0 },
87 { 0x00DB6FFF, 0x0005000F, 0x0 },
88 { 0x00BEEFFF, 0x000A000C, 0x0 },
89 { 0x00FFFFFF, 0x0005000F, 0x0 },
90 { 0x00DB6FFF, 0x000A000C, 0x0 },
93 static const struct ddi_buf_trans bdw_ddi_translations_dp[] = {
94 { 0x00FFFFFF, 0x0007000E, 0x0 },
95 { 0x00D75FFF, 0x000E000A, 0x0 },
96 { 0x00BEFFFF, 0x00140006, 0x0 },
97 { 0x80B2CFFF, 0x001B0002, 0x0 },
98 { 0x00FFFFFF, 0x000E000A, 0x0 },
99 { 0x00DB6FFF, 0x00160005, 0x0 },
100 { 0x80C71FFF, 0x001A0002, 0x0 },
101 { 0x00F7DFFF, 0x00180004, 0x0 },
102 { 0x80D75FFF, 0x001B0002, 0x0 },
105 static const struct ddi_buf_trans bdw_ddi_translations_fdi[] = {
106 { 0x00FFFFFF, 0x0001000E, 0x0 },
107 { 0x00D75FFF, 0x0004000A, 0x0 },
108 { 0x00C30FFF, 0x00070006, 0x0 },
109 { 0x00AAAFFF, 0x000C0000, 0x0 },
110 { 0x00FFFFFF, 0x0004000A, 0x0 },
111 { 0x00D75FFF, 0x00090004, 0x0 },
112 { 0x00C30FFF, 0x000C0000, 0x0 },
113 { 0x00FFFFFF, 0x00070006, 0x0 },
114 { 0x00D75FFF, 0x000C0000, 0x0 },
117 static const struct ddi_buf_trans bdw_ddi_translations_hdmi[] = {
118 /* Idx NT mV d T mV df db */
119 { 0x00FFFFFF, 0x0007000E, 0x0 },/* 0: 400 400 0 */
120 { 0x00D75FFF, 0x000E000A, 0x0 },/* 1: 400 600 3.5 */
121 { 0x00BEFFFF, 0x00140006, 0x0 },/* 2: 400 800 6 */
122 { 0x00FFFFFF, 0x0009000D, 0x0 },/* 3: 450 450 0 */
123 { 0x00FFFFFF, 0x000E000A, 0x0 },/* 4: 600 600 0 */
124 { 0x00D7FFFF, 0x00140006, 0x0 },/* 5: 600 800 2.5 */
125 { 0x80CB2FFF, 0x001B0002, 0x0 },/* 6: 600 1000 4.5 */
126 { 0x00FFFFFF, 0x00140006, 0x0 },/* 7: 800 800 0 */
127 { 0x80E79FFF, 0x001B0002, 0x0 },/* 8: 800 1000 2 */
128 { 0x80FFFFFF, 0x001B0002, 0x0 },/* 9: 1000 1000 0 */
131 /* Skylake H and S */
132 static const struct ddi_buf_trans skl_ddi_translations_dp[] = {
133 { 0x00002016, 0x000000A0, 0x0 },
134 { 0x00005012, 0x0000009B, 0x0 },
135 { 0x00007011, 0x00000088, 0x0 },
136 { 0x80009010, 0x000000C0, 0x1 },
137 { 0x00002016, 0x0000009B, 0x0 },
138 { 0x00005012, 0x00000088, 0x0 },
139 { 0x80007011, 0x000000C0, 0x1 },
140 { 0x00002016, 0x000000DF, 0x0 },
141 { 0x80005012, 0x000000C0, 0x1 },
145 static const struct ddi_buf_trans skl_u_ddi_translations_dp[] = {
146 { 0x0000201B, 0x000000A2, 0x0 },
147 { 0x00005012, 0x00000088, 0x0 },
148 { 0x80007011, 0x000000CD, 0x0 },
149 { 0x80009010, 0x000000C0, 0x1 },
150 { 0x0000201B, 0x0000009D, 0x0 },
151 { 0x80005012, 0x000000C0, 0x1 },
152 { 0x80007011, 0x000000C0, 0x1 },
153 { 0x00002016, 0x00000088, 0x0 },
154 { 0x80005012, 0x000000C0, 0x1 },
158 static const struct ddi_buf_trans skl_y_ddi_translations_dp[] = {
159 { 0x00000018, 0x000000A2, 0x0 },
160 { 0x00005012, 0x00000088, 0x0 },
161 { 0x80007011, 0x000000CD, 0x0 },
162 { 0x80009010, 0x000000C0, 0x3 },
163 { 0x00000018, 0x0000009D, 0x0 },
164 { 0x80005012, 0x000000C0, 0x3 },
165 { 0x80007011, 0x000000C0, 0x3 },
166 { 0x00000018, 0x00000088, 0x0 },
167 { 0x80005012, 0x000000C0, 0x3 },
172 * eDP 1.4 low vswing translation parameters
174 static const struct ddi_buf_trans skl_ddi_translations_edp[] = {
175 { 0x00000018, 0x000000A8, 0x0 },
176 { 0x00004013, 0x000000A9, 0x0 },
177 { 0x00007011, 0x000000A2, 0x0 },
178 { 0x00009010, 0x0000009C, 0x0 },
179 { 0x00000018, 0x000000A9, 0x0 },
180 { 0x00006013, 0x000000A2, 0x0 },
181 { 0x00007011, 0x000000A6, 0x0 },
182 { 0x00000018, 0x000000AB, 0x0 },
183 { 0x00007013, 0x0000009F, 0x0 },
184 { 0x00000018, 0x000000DF, 0x0 },
189 * eDP 1.4 low vswing translation parameters
191 static const struct ddi_buf_trans skl_u_ddi_translations_edp[] = {
192 { 0x00000018, 0x000000A8, 0x0 },
193 { 0x00004013, 0x000000A9, 0x0 },
194 { 0x00007011, 0x000000A2, 0x0 },
195 { 0x00009010, 0x0000009C, 0x0 },
196 { 0x00000018, 0x000000A9, 0x0 },
197 { 0x00006013, 0x000000A2, 0x0 },
198 { 0x00007011, 0x000000A6, 0x0 },
199 { 0x00002016, 0x000000AB, 0x0 },
200 { 0x00005013, 0x0000009F, 0x0 },
201 { 0x00000018, 0x000000DF, 0x0 },
206 * eDP 1.4 low vswing translation parameters
208 static const struct ddi_buf_trans skl_y_ddi_translations_edp[] = {
209 { 0x00000018, 0x000000A8, 0x0 },
210 { 0x00004013, 0x000000AB, 0x0 },
211 { 0x00007011, 0x000000A4, 0x0 },
212 { 0x00009010, 0x000000DF, 0x0 },
213 { 0x00000018, 0x000000AA, 0x0 },
214 { 0x00006013, 0x000000A4, 0x0 },
215 { 0x00007011, 0x0000009D, 0x0 },
216 { 0x00000018, 0x000000A0, 0x0 },
217 { 0x00006012, 0x000000DF, 0x0 },
218 { 0x00000018, 0x0000008A, 0x0 },
221 /* Skylake U, H and S */
222 static const struct ddi_buf_trans skl_ddi_translations_hdmi[] = {
223 { 0x00000018, 0x000000AC, 0x0 },
224 { 0x00005012, 0x0000009D, 0x0 },
225 { 0x00007011, 0x00000088, 0x0 },
226 { 0x00000018, 0x000000A1, 0x0 },
227 { 0x00000018, 0x00000098, 0x0 },
228 { 0x00004013, 0x00000088, 0x0 },
229 { 0x80006012, 0x000000CD, 0x1 },
230 { 0x00000018, 0x000000DF, 0x0 },
231 { 0x80003015, 0x000000CD, 0x1 }, /* Default */
232 { 0x80003015, 0x000000C0, 0x1 },
233 { 0x80000018, 0x000000C0, 0x1 },
237 static const struct ddi_buf_trans skl_y_ddi_translations_hdmi[] = {
238 { 0x00000018, 0x000000A1, 0x0 },
239 { 0x00005012, 0x000000DF, 0x0 },
240 { 0x80007011, 0x000000CB, 0x3 },
241 { 0x00000018, 0x000000A4, 0x0 },
242 { 0x00000018, 0x0000009D, 0x0 },
243 { 0x00004013, 0x00000080, 0x0 },
244 { 0x80006013, 0x000000C0, 0x3 },
245 { 0x00000018, 0x0000008A, 0x0 },
246 { 0x80003015, 0x000000C0, 0x3 }, /* Default */
247 { 0x80003015, 0x000000C0, 0x3 },
248 { 0x80000018, 0x000000C0, 0x3 },
251 struct bxt_ddi_buf_trans {
252 u32 margin; /* swing value */
253 u32 scale; /* scale value */
254 u32 enable; /* scale enable */
256 bool default_index; /* true if the entry represents default value */
259 static const struct bxt_ddi_buf_trans bxt_ddi_translations_dp[] = {
260 /* Idx NT mV diff db */
261 { 52, 0x9A, 0, 128, true }, /* 0: 400 0 */
262 { 78, 0x9A, 0, 85, false }, /* 1: 400 3.5 */
263 { 104, 0x9A, 0, 64, false }, /* 2: 400 6 */
264 { 154, 0x9A, 0, 43, false }, /* 3: 400 9.5 */
265 { 77, 0x9A, 0, 128, false }, /* 4: 600 0 */
266 { 116, 0x9A, 0, 85, false }, /* 5: 600 3.5 */
267 { 154, 0x9A, 0, 64, false }, /* 6: 600 6 */
268 { 102, 0x9A, 0, 128, false }, /* 7: 800 0 */
269 { 154, 0x9A, 0, 85, false }, /* 8: 800 3.5 */
270 { 154, 0x9A, 1, 128, false }, /* 9: 1200 0 */
273 static const struct bxt_ddi_buf_trans bxt_ddi_translations_edp[] = {
274 /* Idx NT mV diff db */
275 { 26, 0, 0, 128, false }, /* 0: 200 0 */
276 { 38, 0, 0, 112, false }, /* 1: 200 1.5 */
277 { 48, 0, 0, 96, false }, /* 2: 200 4 */
278 { 54, 0, 0, 69, false }, /* 3: 200 6 */
279 { 32, 0, 0, 128, false }, /* 4: 250 0 */
280 { 48, 0, 0, 104, false }, /* 5: 250 1.5 */
281 { 54, 0, 0, 85, false }, /* 6: 250 4 */
282 { 43, 0, 0, 128, false }, /* 7: 300 0 */
283 { 54, 0, 0, 101, false }, /* 8: 300 1.5 */
284 { 48, 0, 0, 128, false }, /* 9: 300 0 */
287 /* BSpec has 2 recommended values - entries 0 and 8.
288 * Using the entry with higher vswing.
290 static const struct bxt_ddi_buf_trans bxt_ddi_translations_hdmi[] = {
291 /* Idx NT mV diff db */
292 { 52, 0x9A, 0, 128, false }, /* 0: 400 0 */
293 { 52, 0x9A, 0, 85, false }, /* 1: 400 3.5 */
294 { 52, 0x9A, 0, 64, false }, /* 2: 400 6 */
295 { 42, 0x9A, 0, 43, false }, /* 3: 400 9.5 */
296 { 77, 0x9A, 0, 128, false }, /* 4: 600 0 */
297 { 77, 0x9A, 0, 85, false }, /* 5: 600 3.5 */
298 { 77, 0x9A, 0, 64, false }, /* 6: 600 6 */
299 { 102, 0x9A, 0, 128, false }, /* 7: 800 0 */
300 { 102, 0x9A, 0, 85, false }, /* 8: 800 3.5 */
301 { 154, 0x9A, 1, 128, true }, /* 9: 1200 0 */
304 static void bxt_ddi_vswing_sequence(struct drm_i915_private *dev_priv,
305 u32 level, enum port port, int type);
307 static void ddi_get_encoder_port(struct intel_encoder *intel_encoder,
308 struct intel_digital_port **dig_port,
311 struct drm_encoder *encoder = &intel_encoder->base;
313 switch (intel_encoder->type) {
314 case INTEL_OUTPUT_DP_MST:
315 *dig_port = enc_to_mst(encoder)->primary;
316 *port = (*dig_port)->port;
318 case INTEL_OUTPUT_DISPLAYPORT:
319 case INTEL_OUTPUT_EDP:
320 case INTEL_OUTPUT_HDMI:
321 case INTEL_OUTPUT_UNKNOWN:
322 *dig_port = enc_to_dig_port(encoder);
323 *port = (*dig_port)->port;
325 case INTEL_OUTPUT_ANALOG:
330 WARN(1, "Invalid DDI encoder type %d\n", intel_encoder->type);
335 enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder)
337 struct intel_digital_port *dig_port;
340 ddi_get_encoder_port(intel_encoder, &dig_port, &port);
345 static const struct ddi_buf_trans *
346 skl_get_buf_trans_dp(struct drm_i915_private *dev_priv, int *n_entries)
348 if (IS_SKL_ULX(dev_priv) || IS_KBL_ULX(dev_priv)) {
349 *n_entries = ARRAY_SIZE(skl_y_ddi_translations_dp);
350 return skl_y_ddi_translations_dp;
351 } else if (IS_SKL_ULT(dev_priv) || IS_KBL_ULT(dev_priv)) {
352 *n_entries = ARRAY_SIZE(skl_u_ddi_translations_dp);
353 return skl_u_ddi_translations_dp;
355 *n_entries = ARRAY_SIZE(skl_ddi_translations_dp);
356 return skl_ddi_translations_dp;
360 static const struct ddi_buf_trans *
361 skl_get_buf_trans_edp(struct drm_i915_private *dev_priv, int *n_entries)
363 if (dev_priv->edp_low_vswing) {
364 if (IS_SKL_ULX(dev_priv) || IS_KBL_ULX(dev_priv)) {
365 *n_entries = ARRAY_SIZE(skl_y_ddi_translations_edp);
366 return skl_y_ddi_translations_edp;
367 } else if (IS_SKL_ULT(dev_priv) || IS_KBL_ULT(dev_priv)) {
368 *n_entries = ARRAY_SIZE(skl_u_ddi_translations_edp);
369 return skl_u_ddi_translations_edp;
371 *n_entries = ARRAY_SIZE(skl_ddi_translations_edp);
372 return skl_ddi_translations_edp;
376 return skl_get_buf_trans_dp(dev_priv, n_entries);
379 static const struct ddi_buf_trans *
380 skl_get_buf_trans_hdmi(struct drm_i915_private *dev_priv, int *n_entries)
382 if (IS_SKL_ULX(dev_priv) || IS_KBL_ULX(dev_priv)) {
383 *n_entries = ARRAY_SIZE(skl_y_ddi_translations_hdmi);
384 return skl_y_ddi_translations_hdmi;
386 *n_entries = ARRAY_SIZE(skl_ddi_translations_hdmi);
387 return skl_ddi_translations_hdmi;
392 * Starting with Haswell, DDI port buffers must be programmed with correct
393 * values in advance. The buffer values are different for FDI and DP modes,
394 * but the HDMI/DVI fields are shared among those. So we program the DDI
395 * in either FDI or DP modes only, as HDMI connections will work with both
398 void intel_prepare_ddi_buffer(struct intel_encoder *encoder)
400 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
402 int i, n_hdmi_entries, n_dp_entries, n_edp_entries, hdmi_default_entry,
406 const struct ddi_buf_trans *ddi_translations_fdi;
407 const struct ddi_buf_trans *ddi_translations_dp;
408 const struct ddi_buf_trans *ddi_translations_edp;
409 const struct ddi_buf_trans *ddi_translations_hdmi;
410 const struct ddi_buf_trans *ddi_translations;
412 port = intel_ddi_get_encoder_port(encoder);
413 hdmi_level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift;
415 if (IS_BROXTON(dev_priv)) {
416 if (encoder->type != INTEL_OUTPUT_HDMI)
419 /* Vswing programming for HDMI */
420 bxt_ddi_vswing_sequence(dev_priv, hdmi_level, port,
425 if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) {
426 ddi_translations_fdi = NULL;
427 ddi_translations_dp =
428 skl_get_buf_trans_dp(dev_priv, &n_dp_entries);
429 ddi_translations_edp =
430 skl_get_buf_trans_edp(dev_priv, &n_edp_entries);
431 ddi_translations_hdmi =
432 skl_get_buf_trans_hdmi(dev_priv, &n_hdmi_entries);
433 hdmi_default_entry = 8;
434 /* If we're boosting the current, set bit 31 of trans1 */
435 if (dev_priv->vbt.ddi_port_info[port].hdmi_boost_level ||
436 dev_priv->vbt.ddi_port_info[port].dp_boost_level)
439 if (WARN_ON(encoder->type == INTEL_OUTPUT_EDP &&
440 port != PORT_A && port != PORT_E &&
443 } else if (IS_BROADWELL(dev_priv)) {
444 ddi_translations_fdi = bdw_ddi_translations_fdi;
445 ddi_translations_dp = bdw_ddi_translations_dp;
446 ddi_translations_edp = bdw_ddi_translations_edp;
447 ddi_translations_hdmi = bdw_ddi_translations_hdmi;
448 n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
449 n_dp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
450 n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
451 hdmi_default_entry = 7;
452 } else if (IS_HASWELL(dev_priv)) {
453 ddi_translations_fdi = hsw_ddi_translations_fdi;
454 ddi_translations_dp = hsw_ddi_translations_dp;
455 ddi_translations_edp = hsw_ddi_translations_dp;
456 ddi_translations_hdmi = hsw_ddi_translations_hdmi;
457 n_dp_entries = n_edp_entries = ARRAY_SIZE(hsw_ddi_translations_dp);
458 n_hdmi_entries = ARRAY_SIZE(hsw_ddi_translations_hdmi);
459 hdmi_default_entry = 6;
461 WARN(1, "ddi translation table missing\n");
462 ddi_translations_edp = bdw_ddi_translations_dp;
463 ddi_translations_fdi = bdw_ddi_translations_fdi;
464 ddi_translations_dp = bdw_ddi_translations_dp;
465 ddi_translations_hdmi = bdw_ddi_translations_hdmi;
466 n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
467 n_dp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
468 n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
469 hdmi_default_entry = 7;
472 switch (encoder->type) {
473 case INTEL_OUTPUT_EDP:
474 ddi_translations = ddi_translations_edp;
475 size = n_edp_entries;
477 case INTEL_OUTPUT_DISPLAYPORT:
478 case INTEL_OUTPUT_HDMI:
479 ddi_translations = ddi_translations_dp;
482 case INTEL_OUTPUT_ANALOG:
483 ddi_translations = ddi_translations_fdi;
490 for (i = 0; i < size; i++) {
491 I915_WRITE(DDI_BUF_TRANS_LO(port, i),
492 ddi_translations[i].trans1 | iboost_bit);
493 I915_WRITE(DDI_BUF_TRANS_HI(port, i),
494 ddi_translations[i].trans2);
497 if (encoder->type != INTEL_OUTPUT_HDMI)
500 /* Choose a good default if VBT is badly populated */
501 if (hdmi_level == HDMI_LEVEL_SHIFT_UNKNOWN ||
502 hdmi_level >= n_hdmi_entries)
503 hdmi_level = hdmi_default_entry;
505 /* Entry 9 is for HDMI: */
506 I915_WRITE(DDI_BUF_TRANS_LO(port, i),
507 ddi_translations_hdmi[hdmi_level].trans1 | iboost_bit);
508 I915_WRITE(DDI_BUF_TRANS_HI(port, i),
509 ddi_translations_hdmi[hdmi_level].trans2);
512 static void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv,
515 i915_reg_t reg = DDI_BUF_CTL(port);
518 for (i = 0; i < 16; i++) {
520 if (I915_READ(reg) & DDI_BUF_IS_IDLE)
523 DRM_ERROR("Timeout waiting for DDI BUF %c idle bit\n", port_name(port));
526 /* Starting with Haswell, different DDI ports can work in FDI mode for
527 * connection to the PCH-located connectors. For this, it is necessary to train
528 * both the DDI port and PCH receiver for the desired DDI buffer settings.
530 * The recommended port to work in FDI mode is DDI E, which we use here. Also,
531 * please note that when FDI mode is active on DDI E, it shares 2 lines with
532 * DDI A (which is used for eDP)
535 void hsw_fdi_link_train(struct drm_crtc *crtc)
537 struct drm_device *dev = crtc->dev;
538 struct drm_i915_private *dev_priv = dev->dev_private;
539 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
540 struct intel_encoder *encoder;
541 u32 temp, i, rx_ctl_val;
543 for_each_encoder_on_crtc(dev, crtc, encoder) {
544 WARN_ON(encoder->type != INTEL_OUTPUT_ANALOG);
545 intel_prepare_ddi_buffer(encoder);
548 /* Set the FDI_RX_MISC pwrdn lanes and the 2 workarounds listed at the
549 * mode set "sequence for CRT port" document:
550 * - TP1 to TP2 time with the default value
553 * WaFDIAutoLinkSetTimingOverrride:hsw
555 I915_WRITE(FDI_RX_MISC(PIPE_A), FDI_RX_PWRDN_LANE1_VAL(2) |
556 FDI_RX_PWRDN_LANE0_VAL(2) |
557 FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90);
559 /* Enable the PCH Receiver FDI PLL */
560 rx_ctl_val = dev_priv->fdi_rx_config | FDI_RX_ENHANCE_FRAME_ENABLE |
562 FDI_DP_PORT_WIDTH(intel_crtc->config->fdi_lanes);
563 I915_WRITE(FDI_RX_CTL(PIPE_A), rx_ctl_val);
564 POSTING_READ(FDI_RX_CTL(PIPE_A));
567 /* Switch from Rawclk to PCDclk */
568 rx_ctl_val |= FDI_PCDCLK;
569 I915_WRITE(FDI_RX_CTL(PIPE_A), rx_ctl_val);
571 /* Configure Port Clock Select */
572 I915_WRITE(PORT_CLK_SEL(PORT_E), intel_crtc->config->ddi_pll_sel);
573 WARN_ON(intel_crtc->config->ddi_pll_sel != PORT_CLK_SEL_SPLL);
575 /* Start the training iterating through available voltages and emphasis,
576 * testing each value twice. */
577 for (i = 0; i < ARRAY_SIZE(hsw_ddi_translations_fdi) * 2; i++) {
578 /* Configure DP_TP_CTL with auto-training */
579 I915_WRITE(DP_TP_CTL(PORT_E),
580 DP_TP_CTL_FDI_AUTOTRAIN |
581 DP_TP_CTL_ENHANCED_FRAME_ENABLE |
582 DP_TP_CTL_LINK_TRAIN_PAT1 |
585 /* Configure and enable DDI_BUF_CTL for DDI E with next voltage.
586 * DDI E does not support port reversal, the functionality is
587 * achieved on the PCH side in FDI_RX_CTL, so no need to set the
588 * port reversal bit */
589 I915_WRITE(DDI_BUF_CTL(PORT_E),
591 ((intel_crtc->config->fdi_lanes - 1) << 1) |
592 DDI_BUF_TRANS_SELECT(i / 2));
593 POSTING_READ(DDI_BUF_CTL(PORT_E));
597 /* Program PCH FDI Receiver TU */
598 I915_WRITE(FDI_RX_TUSIZE1(PIPE_A), TU_SIZE(64));
600 /* Enable PCH FDI Receiver with auto-training */
601 rx_ctl_val |= FDI_RX_ENABLE | FDI_LINK_TRAIN_AUTO;
602 I915_WRITE(FDI_RX_CTL(PIPE_A), rx_ctl_val);
603 POSTING_READ(FDI_RX_CTL(PIPE_A));
605 /* Wait for FDI receiver lane calibration */
608 /* Unset FDI_RX_MISC pwrdn lanes */
609 temp = I915_READ(FDI_RX_MISC(PIPE_A));
610 temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
611 I915_WRITE(FDI_RX_MISC(PIPE_A), temp);
612 POSTING_READ(FDI_RX_MISC(PIPE_A));
614 /* Wait for FDI auto training time */
617 temp = I915_READ(DP_TP_STATUS(PORT_E));
618 if (temp & DP_TP_STATUS_AUTOTRAIN_DONE) {
619 DRM_DEBUG_KMS("FDI link training done on step %d\n", i);
624 * Leave things enabled even if we failed to train FDI.
625 * Results in less fireworks from the state checker.
627 if (i == ARRAY_SIZE(hsw_ddi_translations_fdi) * 2 - 1) {
628 DRM_ERROR("FDI link training failed!\n");
632 temp = I915_READ(DDI_BUF_CTL(PORT_E));
633 temp &= ~DDI_BUF_CTL_ENABLE;
634 I915_WRITE(DDI_BUF_CTL(PORT_E), temp);
635 POSTING_READ(DDI_BUF_CTL(PORT_E));
637 /* Disable DP_TP_CTL and FDI_RX_CTL and retry */
638 temp = I915_READ(DP_TP_CTL(PORT_E));
639 temp &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
640 temp |= DP_TP_CTL_LINK_TRAIN_PAT1;
641 I915_WRITE(DP_TP_CTL(PORT_E), temp);
642 POSTING_READ(DP_TP_CTL(PORT_E));
644 intel_wait_ddi_buf_idle(dev_priv, PORT_E);
646 rx_ctl_val &= ~FDI_RX_ENABLE;
647 I915_WRITE(FDI_RX_CTL(PIPE_A), rx_ctl_val);
648 POSTING_READ(FDI_RX_CTL(PIPE_A));
650 /* Reset FDI_RX_MISC pwrdn lanes */
651 temp = I915_READ(FDI_RX_MISC(PIPE_A));
652 temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
653 temp |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
654 I915_WRITE(FDI_RX_MISC(PIPE_A), temp);
655 POSTING_READ(FDI_RX_MISC(PIPE_A));
658 /* Enable normal pixel sending for FDI */
659 I915_WRITE(DP_TP_CTL(PORT_E),
660 DP_TP_CTL_FDI_AUTOTRAIN |
661 DP_TP_CTL_LINK_TRAIN_NORMAL |
662 DP_TP_CTL_ENHANCED_FRAME_ENABLE |
666 void intel_ddi_init_dp_buf_reg(struct intel_encoder *encoder)
668 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
669 struct intel_digital_port *intel_dig_port =
670 enc_to_dig_port(&encoder->base);
672 intel_dp->DP = intel_dig_port->saved_port_bits |
673 DDI_BUF_CTL_ENABLE | DDI_BUF_TRANS_SELECT(0);
674 intel_dp->DP |= DDI_PORT_WIDTH(intel_dp->lane_count);
677 static struct intel_encoder *
678 intel_ddi_get_crtc_encoder(struct drm_crtc *crtc)
680 struct drm_device *dev = crtc->dev;
681 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
682 struct intel_encoder *intel_encoder, *ret = NULL;
683 int num_encoders = 0;
685 for_each_encoder_on_crtc(dev, crtc, intel_encoder) {
690 if (num_encoders != 1)
691 WARN(1, "%d encoders on crtc for pipe %c\n", num_encoders,
692 pipe_name(intel_crtc->pipe));
698 struct intel_encoder *
699 intel_ddi_get_crtc_new_encoder(struct intel_crtc_state *crtc_state)
701 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
702 struct intel_encoder *ret = NULL;
703 struct drm_atomic_state *state;
704 struct drm_connector *connector;
705 struct drm_connector_state *connector_state;
706 int num_encoders = 0;
709 state = crtc_state->base.state;
711 for_each_connector_in_state(state, connector, connector_state, i) {
712 if (connector_state->crtc != crtc_state->base.crtc)
715 ret = to_intel_encoder(connector_state->best_encoder);
719 WARN(num_encoders != 1, "%d encoders on crtc for pipe %c\n", num_encoders,
720 pipe_name(crtc->pipe));
727 #define LC_FREQ_2K U64_C(LC_FREQ * 2000)
733 /* Constraints for PLL good behavior */
739 #define abs_diff(a, b) ({ \
740 typeof(a) __a = (a); \
741 typeof(b) __b = (b); \
742 (void) (&__a == &__b); \
743 __a > __b ? (__a - __b) : (__b - __a); })
745 struct hsw_wrpll_rnp {
749 static unsigned hsw_wrpll_get_budget_for_freq(int clock)
823 static void hsw_wrpll_update_rnp(uint64_t freq2k, unsigned budget,
824 unsigned r2, unsigned n2, unsigned p,
825 struct hsw_wrpll_rnp *best)
827 uint64_t a, b, c, d, diff, diff_best;
829 /* No best (r,n,p) yet */
838 * Output clock is (LC_FREQ_2K / 2000) * N / (P * R), which compares to
842 * abs(freq2k - (LC_FREQ_2K * n2/(p * r2))) /
845 * and we would like delta <= budget.
847 * If the discrepancy is above the PPM-based budget, always prefer to
848 * improve upon the previous solution. However, if you're within the
849 * budget, try to maximize Ref * VCO, that is N / (P * R^2).
851 a = freq2k * budget * p * r2;
852 b = freq2k * budget * best->p * best->r2;
853 diff = abs_diff(freq2k * p * r2, LC_FREQ_2K * n2);
854 diff_best = abs_diff(freq2k * best->p * best->r2,
855 LC_FREQ_2K * best->n2);
857 d = 1000000 * diff_best;
859 if (a < c && b < d) {
860 /* If both are above the budget, pick the closer */
861 if (best->p * best->r2 * diff < p * r2 * diff_best) {
866 } else if (a >= c && b < d) {
867 /* If A is below the threshold but B is above it? Update. */
871 } else if (a >= c && b >= d) {
872 /* Both are below the limit, so pick the higher n2/(r2*r2) */
873 if (n2 * best->r2 * best->r2 > best->n2 * r2 * r2) {
879 /* Otherwise a < c && b >= d, do nothing */
882 static int hsw_ddi_calc_wrpll_link(struct drm_i915_private *dev_priv,
885 int refclk = LC_FREQ;
889 wrpll = I915_READ(reg);
890 switch (wrpll & WRPLL_PLL_REF_MASK) {
892 case WRPLL_PLL_NON_SSC:
894 * We could calculate spread here, but our checking
895 * code only cares about 5% accuracy, and spread is a max of
900 case WRPLL_PLL_LCPLL:
904 WARN(1, "bad wrpll refclk\n");
908 r = wrpll & WRPLL_DIVIDER_REF_MASK;
909 p = (wrpll & WRPLL_DIVIDER_POST_MASK) >> WRPLL_DIVIDER_POST_SHIFT;
910 n = (wrpll & WRPLL_DIVIDER_FB_MASK) >> WRPLL_DIVIDER_FB_SHIFT;
912 /* Convert to KHz, p & r have a fixed point portion */
913 return (refclk * n * 100) / (p * r);
916 static int skl_calc_wrpll_link(struct drm_i915_private *dev_priv,
919 i915_reg_t cfgcr1_reg, cfgcr2_reg;
920 uint32_t cfgcr1_val, cfgcr2_val;
921 uint32_t p0, p1, p2, dco_freq;
923 cfgcr1_reg = DPLL_CFGCR1(dpll);
924 cfgcr2_reg = DPLL_CFGCR2(dpll);
926 cfgcr1_val = I915_READ(cfgcr1_reg);
927 cfgcr2_val = I915_READ(cfgcr2_reg);
929 p0 = cfgcr2_val & DPLL_CFGCR2_PDIV_MASK;
930 p2 = cfgcr2_val & DPLL_CFGCR2_KDIV_MASK;
932 if (cfgcr2_val & DPLL_CFGCR2_QDIV_MODE(1))
933 p1 = (cfgcr2_val & DPLL_CFGCR2_QDIV_RATIO_MASK) >> 8;
939 case DPLL_CFGCR2_PDIV_1:
942 case DPLL_CFGCR2_PDIV_2:
945 case DPLL_CFGCR2_PDIV_3:
948 case DPLL_CFGCR2_PDIV_7:
954 case DPLL_CFGCR2_KDIV_5:
957 case DPLL_CFGCR2_KDIV_2:
960 case DPLL_CFGCR2_KDIV_3:
963 case DPLL_CFGCR2_KDIV_1:
968 dco_freq = (cfgcr1_val & DPLL_CFGCR1_DCO_INTEGER_MASK) * 24 * 1000;
970 dco_freq += (((cfgcr1_val & DPLL_CFGCR1_DCO_FRACTION_MASK) >> 9) * 24 *
973 return dco_freq / (p0 * p1 * p2 * 5);
976 static void ddi_dotclock_get(struct intel_crtc_state *pipe_config)
980 if (pipe_config->has_pch_encoder)
981 dotclock = intel_dotclock_calculate(pipe_config->port_clock,
982 &pipe_config->fdi_m_n);
983 else if (pipe_config->has_dp_encoder)
984 dotclock = intel_dotclock_calculate(pipe_config->port_clock,
985 &pipe_config->dp_m_n);
986 else if (pipe_config->has_hdmi_sink && pipe_config->pipe_bpp == 36)
987 dotclock = pipe_config->port_clock * 2 / 3;
989 dotclock = pipe_config->port_clock;
991 if (pipe_config->pixel_multiplier)
992 dotclock /= pipe_config->pixel_multiplier;
994 pipe_config->base.adjusted_mode.crtc_clock = dotclock;
997 static void skl_ddi_clock_get(struct intel_encoder *encoder,
998 struct intel_crtc_state *pipe_config)
1000 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
1002 uint32_t dpll_ctl1, dpll;
1004 dpll = pipe_config->ddi_pll_sel;
1006 dpll_ctl1 = I915_READ(DPLL_CTRL1);
1008 if (dpll_ctl1 & DPLL_CTRL1_HDMI_MODE(dpll)) {
1009 link_clock = skl_calc_wrpll_link(dev_priv, dpll);
1011 link_clock = dpll_ctl1 & DPLL_CTRL1_LINK_RATE_MASK(dpll);
1012 link_clock >>= DPLL_CTRL1_LINK_RATE_SHIFT(dpll);
1014 switch (link_clock) {
1015 case DPLL_CTRL1_LINK_RATE_810:
1018 case DPLL_CTRL1_LINK_RATE_1080:
1019 link_clock = 108000;
1021 case DPLL_CTRL1_LINK_RATE_1350:
1022 link_clock = 135000;
1024 case DPLL_CTRL1_LINK_RATE_1620:
1025 link_clock = 162000;
1027 case DPLL_CTRL1_LINK_RATE_2160:
1028 link_clock = 216000;
1030 case DPLL_CTRL1_LINK_RATE_2700:
1031 link_clock = 270000;
1034 WARN(1, "Unsupported link rate\n");
1040 pipe_config->port_clock = link_clock;
1042 ddi_dotclock_get(pipe_config);
1045 static void hsw_ddi_clock_get(struct intel_encoder *encoder,
1046 struct intel_crtc_state *pipe_config)
1048 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
1052 val = pipe_config->ddi_pll_sel;
1053 switch (val & PORT_CLK_SEL_MASK) {
1054 case PORT_CLK_SEL_LCPLL_810:
1057 case PORT_CLK_SEL_LCPLL_1350:
1058 link_clock = 135000;
1060 case PORT_CLK_SEL_LCPLL_2700:
1061 link_clock = 270000;
1063 case PORT_CLK_SEL_WRPLL1:
1064 link_clock = hsw_ddi_calc_wrpll_link(dev_priv, WRPLL_CTL(0));
1066 case PORT_CLK_SEL_WRPLL2:
1067 link_clock = hsw_ddi_calc_wrpll_link(dev_priv, WRPLL_CTL(1));
1069 case PORT_CLK_SEL_SPLL:
1070 pll = I915_READ(SPLL_CTL) & SPLL_PLL_FREQ_MASK;
1071 if (pll == SPLL_PLL_FREQ_810MHz)
1073 else if (pll == SPLL_PLL_FREQ_1350MHz)
1074 link_clock = 135000;
1075 else if (pll == SPLL_PLL_FREQ_2700MHz)
1076 link_clock = 270000;
1078 WARN(1, "bad spll freq\n");
1083 WARN(1, "bad port clock sel\n");
1087 pipe_config->port_clock = link_clock * 2;
1089 ddi_dotclock_get(pipe_config);
1092 static int bxt_calc_pll_link(struct drm_i915_private *dev_priv,
1093 enum intel_dpll_id dpll)
1095 struct intel_shared_dpll *pll;
1096 struct intel_dpll_hw_state *state;
1097 intel_clock_t clock;
1099 /* For DDI ports we always use a shared PLL. */
1100 if (WARN_ON(dpll == DPLL_ID_PRIVATE))
1103 pll = &dev_priv->shared_dplls[dpll];
1104 state = &pll->config.hw_state;
1107 clock.m2 = (state->pll0 & PORT_PLL_M2_MASK) << 22;
1108 if (state->pll3 & PORT_PLL_M2_FRAC_ENABLE)
1109 clock.m2 |= state->pll2 & PORT_PLL_M2_FRAC_MASK;
1110 clock.n = (state->pll1 & PORT_PLL_N_MASK) >> PORT_PLL_N_SHIFT;
1111 clock.p1 = (state->ebb0 & PORT_PLL_P1_MASK) >> PORT_PLL_P1_SHIFT;
1112 clock.p2 = (state->ebb0 & PORT_PLL_P2_MASK) >> PORT_PLL_P2_SHIFT;
1114 return chv_calc_dpll_params(100000, &clock);
1117 static void bxt_ddi_clock_get(struct intel_encoder *encoder,
1118 struct intel_crtc_state *pipe_config)
1120 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
1121 enum port port = intel_ddi_get_encoder_port(encoder);
1122 uint32_t dpll = port;
1124 pipe_config->port_clock = bxt_calc_pll_link(dev_priv, dpll);
1126 ddi_dotclock_get(pipe_config);
1129 void intel_ddi_clock_get(struct intel_encoder *encoder,
1130 struct intel_crtc_state *pipe_config)
1132 struct drm_device *dev = encoder->base.dev;
1134 if (INTEL_INFO(dev)->gen <= 8)
1135 hsw_ddi_clock_get(encoder, pipe_config);
1136 else if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
1137 skl_ddi_clock_get(encoder, pipe_config);
1138 else if (IS_BROXTON(dev))
1139 bxt_ddi_clock_get(encoder, pipe_config);
1143 hsw_ddi_calculate_wrpll(int clock /* in Hz */,
1144 unsigned *r2_out, unsigned *n2_out, unsigned *p_out)
1148 struct hsw_wrpll_rnp best = { 0, 0, 0 };
1151 freq2k = clock / 100;
1153 budget = hsw_wrpll_get_budget_for_freq(clock);
1155 /* Special case handling for 540 pixel clock: bypass WR PLL entirely
1156 * and directly pass the LC PLL to it. */
1157 if (freq2k == 5400000) {
1165 * Ref = LC_FREQ / R, where Ref is the actual reference input seen by
1168 * We want R so that REF_MIN <= Ref <= REF_MAX.
1169 * Injecting R2 = 2 * R gives:
1170 * REF_MAX * r2 > LC_FREQ * 2 and
1171 * REF_MIN * r2 < LC_FREQ * 2
1173 * Which means the desired boundaries for r2 are:
1174 * LC_FREQ * 2 / REF_MAX < r2 < LC_FREQ * 2 / REF_MIN
1177 for (r2 = LC_FREQ * 2 / REF_MAX + 1;
1178 r2 <= LC_FREQ * 2 / REF_MIN;
1182 * VCO = N * Ref, that is: VCO = N * LC_FREQ / R
1184 * Once again we want VCO_MIN <= VCO <= VCO_MAX.
1185 * Injecting R2 = 2 * R and N2 = 2 * N, we get:
1186 * VCO_MAX * r2 > n2 * LC_FREQ and
1187 * VCO_MIN * r2 < n2 * LC_FREQ)
1189 * Which means the desired boundaries for n2 are:
1190 * VCO_MIN * r2 / LC_FREQ < n2 < VCO_MAX * r2 / LC_FREQ
1192 for (n2 = VCO_MIN * r2 / LC_FREQ + 1;
1193 n2 <= VCO_MAX * r2 / LC_FREQ;
1196 for (p = P_MIN; p <= P_MAX; p += P_INC)
1197 hsw_wrpll_update_rnp(freq2k, budget,
1208 hsw_ddi_pll_select(struct intel_crtc *intel_crtc,
1209 struct intel_crtc_state *crtc_state,
1210 struct intel_encoder *intel_encoder)
1212 int clock = crtc_state->port_clock;
1214 if (intel_encoder->type == INTEL_OUTPUT_HDMI) {
1215 struct intel_shared_dpll *pll;
1219 hsw_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
1221 val = WRPLL_PLL_ENABLE | WRPLL_PLL_LCPLL |
1222 WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
1223 WRPLL_DIVIDER_POST(p);
1225 memset(&crtc_state->dpll_hw_state, 0,
1226 sizeof(crtc_state->dpll_hw_state));
1228 crtc_state->dpll_hw_state.wrpll = val;
1230 pll = intel_get_shared_dpll(intel_crtc, crtc_state);
1232 DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
1233 pipe_name(intel_crtc->pipe));
1237 crtc_state->ddi_pll_sel = PORT_CLK_SEL_WRPLL(pll->id);
1238 } else if (crtc_state->ddi_pll_sel == PORT_CLK_SEL_SPLL) {
1239 struct drm_atomic_state *state = crtc_state->base.state;
1240 struct intel_shared_dpll_config *spll =
1241 &intel_atomic_get_shared_dpll_state(state)[DPLL_ID_SPLL];
1243 if (spll->crtc_mask &&
1244 WARN_ON(spll->hw_state.spll != crtc_state->dpll_hw_state.spll))
1247 crtc_state->shared_dpll = DPLL_ID_SPLL;
1248 spll->hw_state.spll = crtc_state->dpll_hw_state.spll;
1249 spll->crtc_mask |= 1 << intel_crtc->pipe;
1255 struct skl_wrpll_context {
1256 uint64_t min_deviation; /* current minimal deviation */
1257 uint64_t central_freq; /* chosen central freq */
1258 uint64_t dco_freq; /* chosen dco freq */
1259 unsigned int p; /* chosen divider */
1262 static void skl_wrpll_context_init(struct skl_wrpll_context *ctx)
1264 memset(ctx, 0, sizeof(*ctx));
1266 ctx->min_deviation = U64_MAX;
1269 /* DCO freq must be within +1%/-6% of the DCO central freq */
1270 #define SKL_DCO_MAX_PDEVIATION 100
1271 #define SKL_DCO_MAX_NDEVIATION 600
1273 static void skl_wrpll_try_divider(struct skl_wrpll_context *ctx,
1274 uint64_t central_freq,
1276 unsigned int divider)
1280 deviation = div64_u64(10000 * abs_diff(dco_freq, central_freq),
1283 /* positive deviation */
1284 if (dco_freq >= central_freq) {
1285 if (deviation < SKL_DCO_MAX_PDEVIATION &&
1286 deviation < ctx->min_deviation) {
1287 ctx->min_deviation = deviation;
1288 ctx->central_freq = central_freq;
1289 ctx->dco_freq = dco_freq;
1292 /* negative deviation */
1293 } else if (deviation < SKL_DCO_MAX_NDEVIATION &&
1294 deviation < ctx->min_deviation) {
1295 ctx->min_deviation = deviation;
1296 ctx->central_freq = central_freq;
1297 ctx->dco_freq = dco_freq;
1302 static void skl_wrpll_get_multipliers(unsigned int p,
1303 unsigned int *p0 /* out */,
1304 unsigned int *p1 /* out */,
1305 unsigned int *p2 /* out */)
1309 unsigned int half = p / 2;
1311 if (half == 1 || half == 2 || half == 3 || half == 5) {
1315 } else if (half % 2 == 0) {
1319 } else if (half % 3 == 0) {
1323 } else if (half % 7 == 0) {
1328 } else if (p == 3 || p == 9) { /* 3, 5, 7, 9, 15, 21, 35 */
1332 } else if (p == 5 || p == 7) {
1336 } else if (p == 15) {
1340 } else if (p == 21) {
1344 } else if (p == 35) {
1351 struct skl_wrpll_params {
1352 uint32_t dco_fraction;
1353 uint32_t dco_integer;
1354 uint32_t qdiv_ratio;
1358 uint32_t central_freq;
1361 static void skl_wrpll_params_populate(struct skl_wrpll_params *params,
1363 uint64_t central_freq,
1364 uint32_t p0, uint32_t p1, uint32_t p2)
1368 switch (central_freq) {
1370 params->central_freq = 0;
1373 params->central_freq = 1;
1376 params->central_freq = 3;
1393 WARN(1, "Incorrect PDiv\n");
1410 WARN(1, "Incorrect KDiv\n");
1413 params->qdiv_ratio = p1;
1414 params->qdiv_mode = (params->qdiv_ratio == 1) ? 0 : 1;
1416 dco_freq = p0 * p1 * p2 * afe_clock;
1419 * Intermediate values are in Hz.
1420 * Divide by MHz to match bsepc
1422 params->dco_integer = div_u64(dco_freq, 24 * MHz(1));
1423 params->dco_fraction =
1424 div_u64((div_u64(dco_freq, 24) -
1425 params->dco_integer * MHz(1)) * 0x8000, MHz(1));
1429 skl_ddi_calculate_wrpll(int clock /* in Hz */,
1430 struct skl_wrpll_params *wrpll_params)
1432 uint64_t afe_clock = clock * 5; /* AFE Clock is 5x Pixel clock */
1433 uint64_t dco_central_freq[3] = {8400000000ULL,
1436 static const int even_dividers[] = { 4, 6, 8, 10, 12, 14, 16, 18, 20,
1437 24, 28, 30, 32, 36, 40, 42, 44,
1438 48, 52, 54, 56, 60, 64, 66, 68,
1439 70, 72, 76, 78, 80, 84, 88, 90,
1441 static const int odd_dividers[] = { 3, 5, 7, 9, 15, 21, 35 };
1442 static const struct {
1446 { even_dividers, ARRAY_SIZE(even_dividers) },
1447 { odd_dividers, ARRAY_SIZE(odd_dividers) },
1449 struct skl_wrpll_context ctx;
1450 unsigned int dco, d, i;
1451 unsigned int p0, p1, p2;
1453 skl_wrpll_context_init(&ctx);
1455 for (d = 0; d < ARRAY_SIZE(dividers); d++) {
1456 for (dco = 0; dco < ARRAY_SIZE(dco_central_freq); dco++) {
1457 for (i = 0; i < dividers[d].n_dividers; i++) {
1458 unsigned int p = dividers[d].list[i];
1459 uint64_t dco_freq = p * afe_clock;
1461 skl_wrpll_try_divider(&ctx,
1462 dco_central_freq[dco],
1466 * Skip the remaining dividers if we're sure to
1467 * have found the definitive divider, we can't
1468 * improve a 0 deviation.
1470 if (ctx.min_deviation == 0)
1471 goto skip_remaining_dividers;
1475 skip_remaining_dividers:
1477 * If a solution is found with an even divider, prefer
1480 if (d == 0 && ctx.p)
1485 DRM_DEBUG_DRIVER("No valid divider found for %dHz\n", clock);
1490 * gcc incorrectly analyses that these can be used without being
1491 * initialized. To be fair, it's hard to guess.
1494 skl_wrpll_get_multipliers(ctx.p, &p0, &p1, &p2);
1495 skl_wrpll_params_populate(wrpll_params, afe_clock, ctx.central_freq,
1502 skl_ddi_pll_select(struct intel_crtc *intel_crtc,
1503 struct intel_crtc_state *crtc_state,
1504 struct intel_encoder *intel_encoder)
1506 struct intel_shared_dpll *pll;
1507 uint32_t ctrl1, cfgcr1, cfgcr2;
1508 int clock = crtc_state->port_clock;
1511 * See comment in intel_dpll_hw_state to understand why we always use 0
1512 * as the DPLL id in this function.
1515 ctrl1 = DPLL_CTRL1_OVERRIDE(0);
1517 if (intel_encoder->type == INTEL_OUTPUT_HDMI) {
1518 struct skl_wrpll_params wrpll_params = { 0, };
1520 ctrl1 |= DPLL_CTRL1_HDMI_MODE(0);
1522 if (!skl_ddi_calculate_wrpll(clock * 1000, &wrpll_params))
1525 cfgcr1 = DPLL_CFGCR1_FREQ_ENABLE |
1526 DPLL_CFGCR1_DCO_FRACTION(wrpll_params.dco_fraction) |
1527 wrpll_params.dco_integer;
1529 cfgcr2 = DPLL_CFGCR2_QDIV_RATIO(wrpll_params.qdiv_ratio) |
1530 DPLL_CFGCR2_QDIV_MODE(wrpll_params.qdiv_mode) |
1531 DPLL_CFGCR2_KDIV(wrpll_params.kdiv) |
1532 DPLL_CFGCR2_PDIV(wrpll_params.pdiv) |
1533 wrpll_params.central_freq;
1534 } else if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
1535 intel_encoder->type == INTEL_OUTPUT_DP_MST) {
1536 switch (crtc_state->port_clock / 2) {
1538 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, 0);
1541 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, 0);
1544 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, 0);
1548 cfgcr1 = cfgcr2 = 0;
1549 } else if (intel_encoder->type == INTEL_OUTPUT_EDP) {
1554 memset(&crtc_state->dpll_hw_state, 0,
1555 sizeof(crtc_state->dpll_hw_state));
1557 crtc_state->dpll_hw_state.ctrl1 = ctrl1;
1558 crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
1559 crtc_state->dpll_hw_state.cfgcr2 = cfgcr2;
1561 pll = intel_get_shared_dpll(intel_crtc, crtc_state);
1563 DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
1564 pipe_name(intel_crtc->pipe));
1568 /* shared DPLL id 0 is DPLL 1 */
1569 crtc_state->ddi_pll_sel = pll->id + 1;
1574 /* bxt clock parameters */
1575 struct bxt_clk_div {
1585 /* pre-calculated values for DP linkrates */
1586 static const struct bxt_clk_div bxt_dp_clk_val[] = {
1587 {162000, 4, 2, 32, 1677722, 1, 1},
1588 {270000, 4, 1, 27, 0, 0, 1},
1589 {540000, 2, 1, 27, 0, 0, 1},
1590 {216000, 3, 2, 32, 1677722, 1, 1},
1591 {243000, 4, 1, 24, 1258291, 1, 1},
1592 {324000, 4, 1, 32, 1677722, 1, 1},
1593 {432000, 3, 1, 32, 1677722, 1, 1}
1597 bxt_ddi_pll_select(struct intel_crtc *intel_crtc,
1598 struct intel_crtc_state *crtc_state,
1599 struct intel_encoder *intel_encoder)
1601 struct intel_shared_dpll *pll;
1602 struct bxt_clk_div clk_div = {0};
1604 uint32_t prop_coef, int_coef, gain_ctl, targ_cnt;
1605 uint32_t lanestagger;
1606 int clock = crtc_state->port_clock;
1608 if (intel_encoder->type == INTEL_OUTPUT_HDMI) {
1609 intel_clock_t best_clock;
1611 /* Calculate HDMI div */
1613 * FIXME: tie the following calculation into
1614 * i9xx_crtc_compute_clock
1616 if (!bxt_find_best_dpll(crtc_state, clock, &best_clock)) {
1617 DRM_DEBUG_DRIVER("no PLL dividers found for clock %d pipe %c\n",
1618 clock, pipe_name(intel_crtc->pipe));
1622 clk_div.p1 = best_clock.p1;
1623 clk_div.p2 = best_clock.p2;
1624 WARN_ON(best_clock.m1 != 2);
1625 clk_div.n = best_clock.n;
1626 clk_div.m2_int = best_clock.m2 >> 22;
1627 clk_div.m2_frac = best_clock.m2 & ((1 << 22) - 1);
1628 clk_div.m2_frac_en = clk_div.m2_frac != 0;
1630 vco = best_clock.vco;
1631 } else if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
1632 intel_encoder->type == INTEL_OUTPUT_EDP) {
1635 clk_div = bxt_dp_clk_val[0];
1636 for (i = 0; i < ARRAY_SIZE(bxt_dp_clk_val); ++i) {
1637 if (bxt_dp_clk_val[i].clock == clock) {
1638 clk_div = bxt_dp_clk_val[i];
1642 vco = clock * 10 / 2 * clk_div.p1 * clk_div.p2;
1645 if (vco >= 6200000 && vco <= 6700000) {
1650 } else if ((vco > 5400000 && vco < 6200000) ||
1651 (vco >= 4800000 && vco < 5400000)) {
1656 } else if (vco == 5400000) {
1662 DRM_ERROR("Invalid VCO\n");
1666 memset(&crtc_state->dpll_hw_state, 0,
1667 sizeof(crtc_state->dpll_hw_state));
1671 else if (clock > 135000)
1673 else if (clock > 67000)
1675 else if (clock > 33000)
1680 crtc_state->dpll_hw_state.ebb0 =
1681 PORT_PLL_P1(clk_div.p1) | PORT_PLL_P2(clk_div.p2);
1682 crtc_state->dpll_hw_state.pll0 = clk_div.m2_int;
1683 crtc_state->dpll_hw_state.pll1 = PORT_PLL_N(clk_div.n);
1684 crtc_state->dpll_hw_state.pll2 = clk_div.m2_frac;
1686 if (clk_div.m2_frac_en)
1687 crtc_state->dpll_hw_state.pll3 =
1688 PORT_PLL_M2_FRAC_ENABLE;
1690 crtc_state->dpll_hw_state.pll6 =
1691 prop_coef | PORT_PLL_INT_COEFF(int_coef);
1692 crtc_state->dpll_hw_state.pll6 |=
1693 PORT_PLL_GAIN_CTL(gain_ctl);
1695 crtc_state->dpll_hw_state.pll8 = targ_cnt;
1697 crtc_state->dpll_hw_state.pll9 = 5 << PORT_PLL_LOCK_THRESHOLD_SHIFT;
1699 crtc_state->dpll_hw_state.pll10 =
1700 PORT_PLL_DCO_AMP(PORT_PLL_DCO_AMP_DEFAULT)
1701 | PORT_PLL_DCO_AMP_OVR_EN_H;
1703 crtc_state->dpll_hw_state.ebb4 = PORT_PLL_10BIT_CLK_ENABLE;
1705 crtc_state->dpll_hw_state.pcsdw12 =
1706 LANESTAGGER_STRAP_OVRD | lanestagger;
1708 pll = intel_get_shared_dpll(intel_crtc, crtc_state);
1710 DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
1711 pipe_name(intel_crtc->pipe));
1715 /* shared DPLL id 0 is DPLL A */
1716 crtc_state->ddi_pll_sel = pll->id;
1722 * Tries to find a *shared* PLL for the CRTC and store it in
1723 * intel_crtc->ddi_pll_sel.
1725 * For private DPLLs, compute_config() should do the selection for us. This
1726 * function should be folded into compute_config() eventually.
1728 bool intel_ddi_pll_select(struct intel_crtc *intel_crtc,
1729 struct intel_crtc_state *crtc_state)
1731 struct drm_device *dev = intel_crtc->base.dev;
1732 struct intel_encoder *intel_encoder =
1733 intel_ddi_get_crtc_new_encoder(crtc_state);
1735 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
1736 return skl_ddi_pll_select(intel_crtc, crtc_state,
1738 else if (IS_BROXTON(dev))
1739 return bxt_ddi_pll_select(intel_crtc, crtc_state,
1742 return hsw_ddi_pll_select(intel_crtc, crtc_state,
1746 void intel_ddi_set_pipe_settings(struct drm_crtc *crtc)
1748 struct drm_i915_private *dev_priv = crtc->dev->dev_private;
1749 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1750 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
1751 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
1752 int type = intel_encoder->type;
1755 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP || type == INTEL_OUTPUT_DP_MST) {
1756 temp = TRANS_MSA_SYNC_CLK;
1757 switch (intel_crtc->config->pipe_bpp) {
1759 temp |= TRANS_MSA_6_BPC;
1762 temp |= TRANS_MSA_8_BPC;
1765 temp |= TRANS_MSA_10_BPC;
1768 temp |= TRANS_MSA_12_BPC;
1773 I915_WRITE(TRANS_MSA_MISC(cpu_transcoder), temp);
1777 void intel_ddi_set_vc_payload_alloc(struct drm_crtc *crtc, bool state)
1779 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1780 struct drm_device *dev = crtc->dev;
1781 struct drm_i915_private *dev_priv = dev->dev_private;
1782 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
1784 temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
1786 temp |= TRANS_DDI_DP_VC_PAYLOAD_ALLOC;
1788 temp &= ~TRANS_DDI_DP_VC_PAYLOAD_ALLOC;
1789 I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
1792 void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
1794 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1795 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
1796 struct drm_encoder *encoder = &intel_encoder->base;
1797 struct drm_device *dev = crtc->dev;
1798 struct drm_i915_private *dev_priv = dev->dev_private;
1799 enum pipe pipe = intel_crtc->pipe;
1800 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
1801 enum port port = intel_ddi_get_encoder_port(intel_encoder);
1802 int type = intel_encoder->type;
1805 /* Enable TRANS_DDI_FUNC_CTL for the pipe to work in HDMI mode */
1806 temp = TRANS_DDI_FUNC_ENABLE;
1807 temp |= TRANS_DDI_SELECT_PORT(port);
1809 switch (intel_crtc->config->pipe_bpp) {
1811 temp |= TRANS_DDI_BPC_6;
1814 temp |= TRANS_DDI_BPC_8;
1817 temp |= TRANS_DDI_BPC_10;
1820 temp |= TRANS_DDI_BPC_12;
1826 if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_PVSYNC)
1827 temp |= TRANS_DDI_PVSYNC;
1828 if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_PHSYNC)
1829 temp |= TRANS_DDI_PHSYNC;
1831 if (cpu_transcoder == TRANSCODER_EDP) {
1834 /* On Haswell, can only use the always-on power well for
1835 * eDP when not using the panel fitter, and when not
1836 * using motion blur mitigation (which we don't
1838 if (IS_HASWELL(dev) &&
1839 (intel_crtc->config->pch_pfit.enabled ||
1840 intel_crtc->config->pch_pfit.force_thru))
1841 temp |= TRANS_DDI_EDP_INPUT_A_ONOFF;
1843 temp |= TRANS_DDI_EDP_INPUT_A_ON;
1846 temp |= TRANS_DDI_EDP_INPUT_B_ONOFF;
1849 temp |= TRANS_DDI_EDP_INPUT_C_ONOFF;
1857 if (type == INTEL_OUTPUT_HDMI) {
1858 if (intel_crtc->config->has_hdmi_sink)
1859 temp |= TRANS_DDI_MODE_SELECT_HDMI;
1861 temp |= TRANS_DDI_MODE_SELECT_DVI;
1863 } else if (type == INTEL_OUTPUT_ANALOG) {
1864 temp |= TRANS_DDI_MODE_SELECT_FDI;
1865 temp |= (intel_crtc->config->fdi_lanes - 1) << 1;
1867 } else if (type == INTEL_OUTPUT_DISPLAYPORT ||
1868 type == INTEL_OUTPUT_EDP) {
1869 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1871 if (intel_dp->is_mst) {
1872 temp |= TRANS_DDI_MODE_SELECT_DP_MST;
1874 temp |= TRANS_DDI_MODE_SELECT_DP_SST;
1876 temp |= DDI_PORT_WIDTH(intel_crtc->config->lane_count);
1877 } else if (type == INTEL_OUTPUT_DP_MST) {
1878 struct intel_dp *intel_dp = &enc_to_mst(encoder)->primary->dp;
1880 if (intel_dp->is_mst) {
1881 temp |= TRANS_DDI_MODE_SELECT_DP_MST;
1883 temp |= TRANS_DDI_MODE_SELECT_DP_SST;
1885 temp |= DDI_PORT_WIDTH(intel_crtc->config->lane_count);
1887 WARN(1, "Invalid encoder type %d for pipe %c\n",
1888 intel_encoder->type, pipe_name(pipe));
1891 I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
1894 void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv,
1895 enum transcoder cpu_transcoder)
1897 i915_reg_t reg = TRANS_DDI_FUNC_CTL(cpu_transcoder);
1898 uint32_t val = I915_READ(reg);
1900 val &= ~(TRANS_DDI_FUNC_ENABLE | TRANS_DDI_PORT_MASK | TRANS_DDI_DP_VC_PAYLOAD_ALLOC);
1901 val |= TRANS_DDI_PORT_NONE;
1902 I915_WRITE(reg, val);
1905 bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector)
1907 struct drm_device *dev = intel_connector->base.dev;
1908 struct drm_i915_private *dev_priv = dev->dev_private;
1909 struct intel_encoder *intel_encoder = intel_connector->encoder;
1910 int type = intel_connector->base.connector_type;
1911 enum port port = intel_ddi_get_encoder_port(intel_encoder);
1913 enum transcoder cpu_transcoder;
1914 enum intel_display_power_domain power_domain;
1917 power_domain = intel_display_port_power_domain(intel_encoder);
1918 if (!intel_display_power_is_enabled(dev_priv, power_domain))
1921 if (!intel_encoder->get_hw_state(intel_encoder, &pipe))
1925 cpu_transcoder = TRANSCODER_EDP;
1927 cpu_transcoder = (enum transcoder) pipe;
1929 tmp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
1931 switch (tmp & TRANS_DDI_MODE_SELECT_MASK) {
1932 case TRANS_DDI_MODE_SELECT_HDMI:
1933 case TRANS_DDI_MODE_SELECT_DVI:
1934 return (type == DRM_MODE_CONNECTOR_HDMIA);
1936 case TRANS_DDI_MODE_SELECT_DP_SST:
1937 if (type == DRM_MODE_CONNECTOR_eDP)
1939 return (type == DRM_MODE_CONNECTOR_DisplayPort);
1940 case TRANS_DDI_MODE_SELECT_DP_MST:
1941 /* if the transcoder is in MST state then
1942 * connector isn't connected */
1945 case TRANS_DDI_MODE_SELECT_FDI:
1946 return (type == DRM_MODE_CONNECTOR_VGA);
1953 bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
1956 struct drm_device *dev = encoder->base.dev;
1957 struct drm_i915_private *dev_priv = dev->dev_private;
1958 enum port port = intel_ddi_get_encoder_port(encoder);
1959 enum intel_display_power_domain power_domain;
1963 power_domain = intel_display_port_power_domain(encoder);
1964 if (!intel_display_power_is_enabled(dev_priv, power_domain))
1967 tmp = I915_READ(DDI_BUF_CTL(port));
1969 if (!(tmp & DDI_BUF_CTL_ENABLE))
1972 if (port == PORT_A) {
1973 tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP));
1975 switch (tmp & TRANS_DDI_EDP_INPUT_MASK) {
1976 case TRANS_DDI_EDP_INPUT_A_ON:
1977 case TRANS_DDI_EDP_INPUT_A_ONOFF:
1980 case TRANS_DDI_EDP_INPUT_B_ONOFF:
1983 case TRANS_DDI_EDP_INPUT_C_ONOFF:
1990 for (i = TRANSCODER_A; i <= TRANSCODER_C; i++) {
1991 tmp = I915_READ(TRANS_DDI_FUNC_CTL(i));
1993 if ((tmp & TRANS_DDI_PORT_MASK)
1994 == TRANS_DDI_SELECT_PORT(port)) {
1995 if ((tmp & TRANS_DDI_MODE_SELECT_MASK) == TRANS_DDI_MODE_SELECT_DP_MST)
2004 DRM_DEBUG_KMS("No pipe for ddi port %c found\n", port_name(port));
2009 void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc)
2011 struct drm_crtc *crtc = &intel_crtc->base;
2012 struct drm_device *dev = crtc->dev;
2013 struct drm_i915_private *dev_priv = dev->dev_private;
2014 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
2015 enum port port = intel_ddi_get_encoder_port(intel_encoder);
2016 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
2018 if (cpu_transcoder != TRANSCODER_EDP)
2019 I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
2020 TRANS_CLK_SEL_PORT(port));
2023 void intel_ddi_disable_pipe_clock(struct intel_crtc *intel_crtc)
2025 struct drm_i915_private *dev_priv = intel_crtc->base.dev->dev_private;
2026 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
2028 if (cpu_transcoder != TRANSCODER_EDP)
2029 I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
2030 TRANS_CLK_SEL_DISABLED);
2033 static void skl_ddi_set_iboost(struct drm_i915_private *dev_priv,
2034 u32 level, enum port port, int type)
2036 const struct ddi_buf_trans *ddi_translations;
2038 uint8_t dp_iboost, hdmi_iboost;
2042 /* VBT may override standard boost values */
2043 dp_iboost = dev_priv->vbt.ddi_port_info[port].dp_boost_level;
2044 hdmi_iboost = dev_priv->vbt.ddi_port_info[port].hdmi_boost_level;
2046 if (type == INTEL_OUTPUT_DISPLAYPORT) {
2050 ddi_translations = skl_get_buf_trans_dp(dev_priv, &n_entries);
2051 iboost = ddi_translations[level].i_boost;
2053 } else if (type == INTEL_OUTPUT_EDP) {
2057 ddi_translations = skl_get_buf_trans_edp(dev_priv, &n_entries);
2059 if (WARN_ON(port != PORT_A &&
2060 port != PORT_E && n_entries > 9))
2063 iboost = ddi_translations[level].i_boost;
2065 } else if (type == INTEL_OUTPUT_HDMI) {
2067 iboost = hdmi_iboost;
2069 ddi_translations = skl_get_buf_trans_hdmi(dev_priv, &n_entries);
2070 iboost = ddi_translations[level].i_boost;
2076 /* Make sure that the requested I_boost is valid */
2077 if (iboost && iboost != 0x1 && iboost != 0x3 && iboost != 0x7) {
2078 DRM_ERROR("Invalid I_boost value %u\n", iboost);
2082 reg = I915_READ(DISPIO_CR_TX_BMU_CR0);
2083 reg &= ~BALANCE_LEG_MASK(port);
2084 reg &= ~(1 << (BALANCE_LEG_DISABLE_SHIFT + port));
2087 reg |= iboost << BALANCE_LEG_SHIFT(port);
2089 reg |= 1 << (BALANCE_LEG_DISABLE_SHIFT + port);
2091 I915_WRITE(DISPIO_CR_TX_BMU_CR0, reg);
2094 static void bxt_ddi_vswing_sequence(struct drm_i915_private *dev_priv,
2095 u32 level, enum port port, int type)
2097 const struct bxt_ddi_buf_trans *ddi_translations;
2101 if (type == INTEL_OUTPUT_EDP && dev_priv->edp_low_vswing) {
2102 n_entries = ARRAY_SIZE(bxt_ddi_translations_edp);
2103 ddi_translations = bxt_ddi_translations_edp;
2104 } else if (type == INTEL_OUTPUT_DISPLAYPORT
2105 || type == INTEL_OUTPUT_EDP) {
2106 n_entries = ARRAY_SIZE(bxt_ddi_translations_dp);
2107 ddi_translations = bxt_ddi_translations_dp;
2108 } else if (type == INTEL_OUTPUT_HDMI) {
2109 n_entries = ARRAY_SIZE(bxt_ddi_translations_hdmi);
2110 ddi_translations = bxt_ddi_translations_hdmi;
2112 DRM_DEBUG_KMS("Vswing programming not done for encoder %d\n",
2117 /* Check if default value has to be used */
2118 if (level >= n_entries ||
2119 (type == INTEL_OUTPUT_HDMI && level == HDMI_LEVEL_SHIFT_UNKNOWN)) {
2120 for (i = 0; i < n_entries; i++) {
2121 if (ddi_translations[i].default_index) {
2129 * While we write to the group register to program all lanes at once we
2130 * can read only lane registers and we pick lanes 0/1 for that.
2132 val = I915_READ(BXT_PORT_PCS_DW10_LN01(port));
2133 val &= ~(TX2_SWING_CALC_INIT | TX1_SWING_CALC_INIT);
2134 I915_WRITE(BXT_PORT_PCS_DW10_GRP(port), val);
2136 val = I915_READ(BXT_PORT_TX_DW2_LN0(port));
2137 val &= ~(MARGIN_000 | UNIQ_TRANS_SCALE);
2138 val |= ddi_translations[level].margin << MARGIN_000_SHIFT |
2139 ddi_translations[level].scale << UNIQ_TRANS_SCALE_SHIFT;
2140 I915_WRITE(BXT_PORT_TX_DW2_GRP(port), val);
2142 val = I915_READ(BXT_PORT_TX_DW3_LN0(port));
2143 val &= ~SCALE_DCOMP_METHOD;
2144 if (ddi_translations[level].enable)
2145 val |= SCALE_DCOMP_METHOD;
2147 if ((val & UNIQUE_TRANGE_EN_METHOD) && !(val & SCALE_DCOMP_METHOD))
2148 DRM_ERROR("Disabled scaling while ouniqetrangenmethod was set");
2150 I915_WRITE(BXT_PORT_TX_DW3_GRP(port), val);
2152 val = I915_READ(BXT_PORT_TX_DW4_LN0(port));
2153 val &= ~DE_EMPHASIS;
2154 val |= ddi_translations[level].deemphasis << DEEMPH_SHIFT;
2155 I915_WRITE(BXT_PORT_TX_DW4_GRP(port), val);
2157 val = I915_READ(BXT_PORT_PCS_DW10_LN01(port));
2158 val |= TX2_SWING_CALC_INIT | TX1_SWING_CALC_INIT;
2159 I915_WRITE(BXT_PORT_PCS_DW10_GRP(port), val);
2162 static uint32_t translate_signal_level(int signal_levels)
2166 switch (signal_levels) {
2168 DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level: 0x%x\n",
2170 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_0:
2173 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_1:
2176 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_2:
2179 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_3:
2183 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_0:
2186 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_1:
2189 case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_2:
2193 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_0:
2196 case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_1:
2200 case DP_TRAIN_VOLTAGE_SWING_LEVEL_3 | DP_TRAIN_PRE_EMPH_LEVEL_0:
2208 uint32_t ddi_signal_levels(struct intel_dp *intel_dp)
2210 struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
2211 struct drm_i915_private *dev_priv = to_i915(dport->base.base.dev);
2212 struct intel_encoder *encoder = &dport->base;
2213 uint8_t train_set = intel_dp->train_set[0];
2214 int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
2215 DP_TRAIN_PRE_EMPHASIS_MASK);
2216 enum port port = dport->port;
2219 level = translate_signal_level(signal_levels);
2221 if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))
2222 skl_ddi_set_iboost(dev_priv, level, port, encoder->type);
2223 else if (IS_BROXTON(dev_priv))
2224 bxt_ddi_vswing_sequence(dev_priv, level, port, encoder->type);
2226 return DDI_BUF_TRANS_SELECT(level);
2229 void intel_ddi_clk_select(struct intel_encoder *encoder,
2230 const struct intel_crtc_state *pipe_config)
2232 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2233 enum port port = intel_ddi_get_encoder_port(encoder);
2235 if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) {
2236 uint32_t dpll = pipe_config->ddi_pll_sel;
2240 * DPLL0 is used for eDP and is the only "private" DPLL (as
2241 * opposed to shared) on SKL
2243 if (encoder->type == INTEL_OUTPUT_EDP) {
2244 WARN_ON(dpll != SKL_DPLL0);
2246 val = I915_READ(DPLL_CTRL1);
2248 val &= ~(DPLL_CTRL1_HDMI_MODE(dpll) |
2249 DPLL_CTRL1_SSC(dpll) |
2250 DPLL_CTRL1_LINK_RATE_MASK(dpll));
2251 val |= pipe_config->dpll_hw_state.ctrl1 << (dpll * 6);
2253 I915_WRITE(DPLL_CTRL1, val);
2254 POSTING_READ(DPLL_CTRL1);
2257 /* DDI -> PLL mapping */
2258 val = I915_READ(DPLL_CTRL2);
2260 val &= ~(DPLL_CTRL2_DDI_CLK_OFF(port) |
2261 DPLL_CTRL2_DDI_CLK_SEL_MASK(port));
2262 val |= (DPLL_CTRL2_DDI_CLK_SEL(dpll, port) |
2263 DPLL_CTRL2_DDI_SEL_OVERRIDE(port));
2265 I915_WRITE(DPLL_CTRL2, val);
2267 } else if (INTEL_INFO(dev_priv)->gen < 9) {
2268 WARN_ON(pipe_config->ddi_pll_sel == PORT_CLK_SEL_NONE);
2269 I915_WRITE(PORT_CLK_SEL(port), pipe_config->ddi_pll_sel);
2273 static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder)
2275 struct drm_encoder *encoder = &intel_encoder->base;
2276 struct drm_i915_private *dev_priv = to_i915(encoder->dev);
2277 struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
2278 enum port port = intel_ddi_get_encoder_port(intel_encoder);
2279 int type = intel_encoder->type;
2281 intel_prepare_ddi_buffer(intel_encoder);
2283 if (type == INTEL_OUTPUT_EDP) {
2284 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2285 intel_edp_panel_on(intel_dp);
2288 intel_ddi_clk_select(intel_encoder, crtc->config);
2290 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
2291 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2293 intel_dp_set_link_params(intel_dp, crtc->config);
2295 intel_ddi_init_dp_buf_reg(intel_encoder);
2297 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
2298 intel_dp_start_link_train(intel_dp);
2299 if (port != PORT_A || INTEL_INFO(dev_priv)->gen >= 9)
2300 intel_dp_stop_link_train(intel_dp);
2301 } else if (type == INTEL_OUTPUT_HDMI) {
2302 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
2304 intel_hdmi->set_infoframes(encoder,
2305 crtc->config->has_hdmi_sink,
2306 &crtc->config->base.adjusted_mode);
2310 static void intel_ddi_post_disable(struct intel_encoder *intel_encoder)
2312 struct drm_encoder *encoder = &intel_encoder->base;
2313 struct drm_device *dev = encoder->dev;
2314 struct drm_i915_private *dev_priv = dev->dev_private;
2315 enum port port = intel_ddi_get_encoder_port(intel_encoder);
2316 int type = intel_encoder->type;
2320 val = I915_READ(DDI_BUF_CTL(port));
2321 if (val & DDI_BUF_CTL_ENABLE) {
2322 val &= ~DDI_BUF_CTL_ENABLE;
2323 I915_WRITE(DDI_BUF_CTL(port), val);
2327 val = I915_READ(DP_TP_CTL(port));
2328 val &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
2329 val |= DP_TP_CTL_LINK_TRAIN_PAT1;
2330 I915_WRITE(DP_TP_CTL(port), val);
2333 intel_wait_ddi_buf_idle(dev_priv, port);
2335 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
2336 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2337 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
2338 intel_edp_panel_vdd_on(intel_dp);
2339 intel_edp_panel_off(intel_dp);
2342 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
2343 I915_WRITE(DPLL_CTRL2, (I915_READ(DPLL_CTRL2) |
2344 DPLL_CTRL2_DDI_CLK_OFF(port)));
2345 else if (INTEL_INFO(dev)->gen < 9)
2346 I915_WRITE(PORT_CLK_SEL(port), PORT_CLK_SEL_NONE);
2349 static void intel_enable_ddi(struct intel_encoder *intel_encoder)
2351 struct drm_encoder *encoder = &intel_encoder->base;
2352 struct drm_crtc *crtc = encoder->crtc;
2353 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2354 struct drm_device *dev = encoder->dev;
2355 struct drm_i915_private *dev_priv = dev->dev_private;
2356 enum port port = intel_ddi_get_encoder_port(intel_encoder);
2357 int type = intel_encoder->type;
2359 if (type == INTEL_OUTPUT_HDMI) {
2360 struct intel_digital_port *intel_dig_port =
2361 enc_to_dig_port(encoder);
2363 /* In HDMI/DVI mode, the port width, and swing/emphasis values
2364 * are ignored so nothing special needs to be done besides
2365 * enabling the port.
2367 I915_WRITE(DDI_BUF_CTL(port),
2368 intel_dig_port->saved_port_bits |
2369 DDI_BUF_CTL_ENABLE);
2370 } else if (type == INTEL_OUTPUT_EDP) {
2371 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2373 if (port == PORT_A && INTEL_INFO(dev)->gen < 9)
2374 intel_dp_stop_link_train(intel_dp);
2376 intel_edp_backlight_on(intel_dp);
2377 intel_psr_enable(intel_dp);
2378 intel_edp_drrs_enable(intel_dp);
2381 if (intel_crtc->config->has_audio) {
2382 intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO);
2383 intel_audio_codec_enable(intel_encoder);
2387 static void intel_disable_ddi(struct intel_encoder *intel_encoder)
2389 struct drm_encoder *encoder = &intel_encoder->base;
2390 struct drm_crtc *crtc = encoder->crtc;
2391 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2392 int type = intel_encoder->type;
2393 struct drm_device *dev = encoder->dev;
2394 struct drm_i915_private *dev_priv = dev->dev_private;
2396 if (intel_crtc->config->has_audio) {
2397 intel_audio_codec_disable(intel_encoder);
2398 intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
2401 if (type == INTEL_OUTPUT_EDP) {
2402 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2404 intel_edp_drrs_disable(intel_dp);
2405 intel_psr_disable(intel_dp);
2406 intel_edp_backlight_off(intel_dp);
2410 static void hsw_ddi_wrpll_enable(struct drm_i915_private *dev_priv,
2411 struct intel_shared_dpll *pll)
2413 I915_WRITE(WRPLL_CTL(pll->id), pll->config.hw_state.wrpll);
2414 POSTING_READ(WRPLL_CTL(pll->id));
2418 static void hsw_ddi_spll_enable(struct drm_i915_private *dev_priv,
2419 struct intel_shared_dpll *pll)
2421 I915_WRITE(SPLL_CTL, pll->config.hw_state.spll);
2422 POSTING_READ(SPLL_CTL);
2426 static void hsw_ddi_wrpll_disable(struct drm_i915_private *dev_priv,
2427 struct intel_shared_dpll *pll)
2431 val = I915_READ(WRPLL_CTL(pll->id));
2432 I915_WRITE(WRPLL_CTL(pll->id), val & ~WRPLL_PLL_ENABLE);
2433 POSTING_READ(WRPLL_CTL(pll->id));
2436 static void hsw_ddi_spll_disable(struct drm_i915_private *dev_priv,
2437 struct intel_shared_dpll *pll)
2441 val = I915_READ(SPLL_CTL);
2442 I915_WRITE(SPLL_CTL, val & ~SPLL_PLL_ENABLE);
2443 POSTING_READ(SPLL_CTL);
2446 static bool hsw_ddi_wrpll_get_hw_state(struct drm_i915_private *dev_priv,
2447 struct intel_shared_dpll *pll,
2448 struct intel_dpll_hw_state *hw_state)
2452 if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
2455 val = I915_READ(WRPLL_CTL(pll->id));
2456 hw_state->wrpll = val;
2458 return val & WRPLL_PLL_ENABLE;
2461 static bool hsw_ddi_spll_get_hw_state(struct drm_i915_private *dev_priv,
2462 struct intel_shared_dpll *pll,
2463 struct intel_dpll_hw_state *hw_state)
2467 if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
2470 val = I915_READ(SPLL_CTL);
2471 hw_state->spll = val;
2473 return val & SPLL_PLL_ENABLE;
2477 static const char * const hsw_ddi_pll_names[] = {
2483 static void hsw_shared_dplls_init(struct drm_i915_private *dev_priv)
2487 dev_priv->num_shared_dpll = 3;
2489 for (i = 0; i < 2; i++) {
2490 dev_priv->shared_dplls[i].id = i;
2491 dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i];
2492 dev_priv->shared_dplls[i].disable = hsw_ddi_wrpll_disable;
2493 dev_priv->shared_dplls[i].enable = hsw_ddi_wrpll_enable;
2494 dev_priv->shared_dplls[i].get_hw_state =
2495 hsw_ddi_wrpll_get_hw_state;
2498 /* SPLL is special, but needs to be initialized anyway.. */
2499 dev_priv->shared_dplls[i].id = i;
2500 dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i];
2501 dev_priv->shared_dplls[i].disable = hsw_ddi_spll_disable;
2502 dev_priv->shared_dplls[i].enable = hsw_ddi_spll_enable;
2503 dev_priv->shared_dplls[i].get_hw_state = hsw_ddi_spll_get_hw_state;
2507 static const char * const skl_ddi_pll_names[] = {
2513 struct skl_dpll_regs {
2514 i915_reg_t ctl, cfgcr1, cfgcr2;
2517 /* this array is indexed by the *shared* pll id */
2518 static const struct skl_dpll_regs skl_dpll_regs[3] = {
2522 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL1),
2523 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL1),
2527 .ctl = WRPLL_CTL(0),
2528 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL2),
2529 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL2),
2533 .ctl = WRPLL_CTL(1),
2534 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL3),
2535 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL3),
2539 static void skl_ddi_pll_enable(struct drm_i915_private *dev_priv,
2540 struct intel_shared_dpll *pll)
2544 const struct skl_dpll_regs *regs = skl_dpll_regs;
2546 /* DPLL0 is not part of the shared DPLLs, so pll->id is 0 for DPLL1 */
2549 val = I915_READ(DPLL_CTRL1);
2551 val &= ~(DPLL_CTRL1_HDMI_MODE(dpll) | DPLL_CTRL1_SSC(dpll) |
2552 DPLL_CTRL1_LINK_RATE_MASK(dpll));
2553 val |= pll->config.hw_state.ctrl1 << (dpll * 6);
2555 I915_WRITE(DPLL_CTRL1, val);
2556 POSTING_READ(DPLL_CTRL1);
2558 I915_WRITE(regs[pll->id].cfgcr1, pll->config.hw_state.cfgcr1);
2559 I915_WRITE(regs[pll->id].cfgcr2, pll->config.hw_state.cfgcr2);
2560 POSTING_READ(regs[pll->id].cfgcr1);
2561 POSTING_READ(regs[pll->id].cfgcr2);
2563 /* the enable bit is always bit 31 */
2564 I915_WRITE(regs[pll->id].ctl,
2565 I915_READ(regs[pll->id].ctl) | LCPLL_PLL_ENABLE);
2567 if (wait_for(I915_READ(DPLL_STATUS) & DPLL_LOCK(dpll), 5))
2568 DRM_ERROR("DPLL %d not locked\n", dpll);
2571 static void skl_ddi_pll_disable(struct drm_i915_private *dev_priv,
2572 struct intel_shared_dpll *pll)
2574 const struct skl_dpll_regs *regs = skl_dpll_regs;
2576 /* the enable bit is always bit 31 */
2577 I915_WRITE(regs[pll->id].ctl,
2578 I915_READ(regs[pll->id].ctl) & ~LCPLL_PLL_ENABLE);
2579 POSTING_READ(regs[pll->id].ctl);
2582 static bool skl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
2583 struct intel_shared_dpll *pll,
2584 struct intel_dpll_hw_state *hw_state)
2588 const struct skl_dpll_regs *regs = skl_dpll_regs;
2590 if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
2593 /* DPLL0 is not part of the shared DPLLs, so pll->id is 0 for DPLL1 */
2596 val = I915_READ(regs[pll->id].ctl);
2597 if (!(val & LCPLL_PLL_ENABLE))
2600 val = I915_READ(DPLL_CTRL1);
2601 hw_state->ctrl1 = (val >> (dpll * 6)) & 0x3f;
2603 /* avoid reading back stale values if HDMI mode is not enabled */
2604 if (val & DPLL_CTRL1_HDMI_MODE(dpll)) {
2605 hw_state->cfgcr1 = I915_READ(regs[pll->id].cfgcr1);
2606 hw_state->cfgcr2 = I915_READ(regs[pll->id].cfgcr2);
2612 static void skl_shared_dplls_init(struct drm_i915_private *dev_priv)
2616 dev_priv->num_shared_dpll = 3;
2618 for (i = 0; i < dev_priv->num_shared_dpll; i++) {
2619 dev_priv->shared_dplls[i].id = i;
2620 dev_priv->shared_dplls[i].name = skl_ddi_pll_names[i];
2621 dev_priv->shared_dplls[i].disable = skl_ddi_pll_disable;
2622 dev_priv->shared_dplls[i].enable = skl_ddi_pll_enable;
2623 dev_priv->shared_dplls[i].get_hw_state =
2624 skl_ddi_pll_get_hw_state;
2628 static void broxton_phy_init(struct drm_i915_private *dev_priv,
2634 val = I915_READ(BXT_P_CR_GT_DISP_PWRON);
2635 val |= GT_DISPLAY_POWER_ON(phy);
2636 I915_WRITE(BXT_P_CR_GT_DISP_PWRON, val);
2638 /* Considering 10ms timeout until BSpec is updated */
2639 if (wait_for(I915_READ(BXT_PORT_CL1CM_DW0(phy)) & PHY_POWER_GOOD, 10))
2640 DRM_ERROR("timeout during PHY%d power on\n", phy);
2642 for (port = (phy == DPIO_PHY0 ? PORT_B : PORT_A);
2643 port <= (phy == DPIO_PHY0 ? PORT_C : PORT_A); port++) {
2646 for (lane = 0; lane < 4; lane++) {
2647 val = I915_READ(BXT_PORT_TX_DW14_LN(port, lane));
2649 * Note that on CHV this flag is called UPAR, but has
2650 * the same function.
2652 val &= ~LATENCY_OPTIM;
2654 val |= LATENCY_OPTIM;
2656 I915_WRITE(BXT_PORT_TX_DW14_LN(port, lane), val);
2660 /* Program PLL Rcomp code offset */
2661 val = I915_READ(BXT_PORT_CL1CM_DW9(phy));
2662 val &= ~IREF0RC_OFFSET_MASK;
2663 val |= 0xE4 << IREF0RC_OFFSET_SHIFT;
2664 I915_WRITE(BXT_PORT_CL1CM_DW9(phy), val);
2666 val = I915_READ(BXT_PORT_CL1CM_DW10(phy));
2667 val &= ~IREF1RC_OFFSET_MASK;
2668 val |= 0xE4 << IREF1RC_OFFSET_SHIFT;
2669 I915_WRITE(BXT_PORT_CL1CM_DW10(phy), val);
2671 /* Program power gating */
2672 val = I915_READ(BXT_PORT_CL1CM_DW28(phy));
2673 val |= OCL1_POWER_DOWN_EN | DW28_OLDO_DYN_PWR_DOWN_EN |
2675 I915_WRITE(BXT_PORT_CL1CM_DW28(phy), val);
2677 if (phy == DPIO_PHY0) {
2678 val = I915_READ(BXT_PORT_CL2CM_DW6_BC);
2679 val |= DW6_OLDO_DYN_PWR_DOWN_EN;
2680 I915_WRITE(BXT_PORT_CL2CM_DW6_BC, val);
2683 val = I915_READ(BXT_PORT_CL1CM_DW30(phy));
2684 val &= ~OCL2_LDOFUSE_PWR_DIS;
2686 * On PHY1 disable power on the second channel, since no port is
2687 * connected there. On PHY0 both channels have a port, so leave it
2689 * TODO: port C is only connected on BXT-P, so on BXT0/1 we should
2690 * power down the second channel on PHY0 as well.
2692 if (phy == DPIO_PHY1)
2693 val |= OCL2_LDOFUSE_PWR_DIS;
2694 I915_WRITE(BXT_PORT_CL1CM_DW30(phy), val);
2696 if (phy == DPIO_PHY0) {
2699 * PHY0 isn't connected to an RCOMP resistor so copy over
2700 * the corresponding calibrated value from PHY1, and disable
2701 * the automatic calibration on PHY0.
2703 if (wait_for(I915_READ(BXT_PORT_REF_DW3(DPIO_PHY1)) & GRC_DONE,
2705 DRM_ERROR("timeout waiting for PHY1 GRC\n");
2707 val = I915_READ(BXT_PORT_REF_DW6(DPIO_PHY1));
2708 val = (val & GRC_CODE_MASK) >> GRC_CODE_SHIFT;
2709 grc_code = val << GRC_CODE_FAST_SHIFT |
2710 val << GRC_CODE_SLOW_SHIFT |
2712 I915_WRITE(BXT_PORT_REF_DW6(DPIO_PHY0), grc_code);
2714 val = I915_READ(BXT_PORT_REF_DW8(DPIO_PHY0));
2715 val |= GRC_DIS | GRC_RDY_OVRD;
2716 I915_WRITE(BXT_PORT_REF_DW8(DPIO_PHY0), val);
2719 val = I915_READ(BXT_PHY_CTL_FAMILY(phy));
2720 val |= COMMON_RESET_DIS;
2721 I915_WRITE(BXT_PHY_CTL_FAMILY(phy), val);
2724 void broxton_ddi_phy_init(struct drm_device *dev)
2726 /* Enable PHY1 first since it provides Rcomp for PHY0 */
2727 broxton_phy_init(dev->dev_private, DPIO_PHY1);
2728 broxton_phy_init(dev->dev_private, DPIO_PHY0);
2731 static void broxton_phy_uninit(struct drm_i915_private *dev_priv,
2736 val = I915_READ(BXT_PHY_CTL_FAMILY(phy));
2737 val &= ~COMMON_RESET_DIS;
2738 I915_WRITE(BXT_PHY_CTL_FAMILY(phy), val);
2741 void broxton_ddi_phy_uninit(struct drm_device *dev)
2743 struct drm_i915_private *dev_priv = dev->dev_private;
2745 broxton_phy_uninit(dev_priv, DPIO_PHY1);
2746 broxton_phy_uninit(dev_priv, DPIO_PHY0);
2748 /* FIXME: do this in broxton_phy_uninit per phy */
2749 I915_WRITE(BXT_P_CR_GT_DISP_PWRON, 0);
2752 static const char * const bxt_ddi_pll_names[] = {
2758 static void bxt_ddi_pll_enable(struct drm_i915_private *dev_priv,
2759 struct intel_shared_dpll *pll)
2762 enum port port = (enum port)pll->id; /* 1:1 port->PLL mapping */
2764 temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
2765 temp &= ~PORT_PLL_REF_SEL;
2766 /* Non-SSC reference */
2767 I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
2769 /* Disable 10 bit clock */
2770 temp = I915_READ(BXT_PORT_PLL_EBB_4(port));
2771 temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
2772 I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp);
2775 temp = I915_READ(BXT_PORT_PLL_EBB_0(port));
2776 temp &= ~(PORT_PLL_P1_MASK | PORT_PLL_P2_MASK);
2777 temp |= pll->config.hw_state.ebb0;
2778 I915_WRITE(BXT_PORT_PLL_EBB_0(port), temp);
2780 /* Write M2 integer */
2781 temp = I915_READ(BXT_PORT_PLL(port, 0));
2782 temp &= ~PORT_PLL_M2_MASK;
2783 temp |= pll->config.hw_state.pll0;
2784 I915_WRITE(BXT_PORT_PLL(port, 0), temp);
2787 temp = I915_READ(BXT_PORT_PLL(port, 1));
2788 temp &= ~PORT_PLL_N_MASK;
2789 temp |= pll->config.hw_state.pll1;
2790 I915_WRITE(BXT_PORT_PLL(port, 1), temp);
2792 /* Write M2 fraction */
2793 temp = I915_READ(BXT_PORT_PLL(port, 2));
2794 temp &= ~PORT_PLL_M2_FRAC_MASK;
2795 temp |= pll->config.hw_state.pll2;
2796 I915_WRITE(BXT_PORT_PLL(port, 2), temp);
2798 /* Write M2 fraction enable */
2799 temp = I915_READ(BXT_PORT_PLL(port, 3));
2800 temp &= ~PORT_PLL_M2_FRAC_ENABLE;
2801 temp |= pll->config.hw_state.pll3;
2802 I915_WRITE(BXT_PORT_PLL(port, 3), temp);
2805 temp = I915_READ(BXT_PORT_PLL(port, 6));
2806 temp &= ~PORT_PLL_PROP_COEFF_MASK;
2807 temp &= ~PORT_PLL_INT_COEFF_MASK;
2808 temp &= ~PORT_PLL_GAIN_CTL_MASK;
2809 temp |= pll->config.hw_state.pll6;
2810 I915_WRITE(BXT_PORT_PLL(port, 6), temp);
2812 /* Write calibration val */
2813 temp = I915_READ(BXT_PORT_PLL(port, 8));
2814 temp &= ~PORT_PLL_TARGET_CNT_MASK;
2815 temp |= pll->config.hw_state.pll8;
2816 I915_WRITE(BXT_PORT_PLL(port, 8), temp);
2818 temp = I915_READ(BXT_PORT_PLL(port, 9));
2819 temp &= ~PORT_PLL_LOCK_THRESHOLD_MASK;
2820 temp |= pll->config.hw_state.pll9;
2821 I915_WRITE(BXT_PORT_PLL(port, 9), temp);
2823 temp = I915_READ(BXT_PORT_PLL(port, 10));
2824 temp &= ~PORT_PLL_DCO_AMP_OVR_EN_H;
2825 temp &= ~PORT_PLL_DCO_AMP_MASK;
2826 temp |= pll->config.hw_state.pll10;
2827 I915_WRITE(BXT_PORT_PLL(port, 10), temp);
2829 /* Recalibrate with new settings */
2830 temp = I915_READ(BXT_PORT_PLL_EBB_4(port));
2831 temp |= PORT_PLL_RECALIBRATE;
2832 I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp);
2833 temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
2834 temp |= pll->config.hw_state.ebb4;
2835 I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp);
2838 temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
2839 temp |= PORT_PLL_ENABLE;
2840 I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
2841 POSTING_READ(BXT_PORT_PLL_ENABLE(port));
2843 if (wait_for_atomic_us((I915_READ(BXT_PORT_PLL_ENABLE(port)) &
2844 PORT_PLL_LOCK), 200))
2845 DRM_ERROR("PLL %d not locked\n", port);
2848 * While we write to the group register to program all lanes at once we
2849 * can read only lane registers and we pick lanes 0/1 for that.
2851 temp = I915_READ(BXT_PORT_PCS_DW12_LN01(port));
2852 temp &= ~LANE_STAGGER_MASK;
2853 temp &= ~LANESTAGGER_STRAP_OVRD;
2854 temp |= pll->config.hw_state.pcsdw12;
2855 I915_WRITE(BXT_PORT_PCS_DW12_GRP(port), temp);
2858 static void bxt_ddi_pll_disable(struct drm_i915_private *dev_priv,
2859 struct intel_shared_dpll *pll)
2861 enum port port = (enum port)pll->id; /* 1:1 port->PLL mapping */
2864 temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
2865 temp &= ~PORT_PLL_ENABLE;
2866 I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
2867 POSTING_READ(BXT_PORT_PLL_ENABLE(port));
2870 static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
2871 struct intel_shared_dpll *pll,
2872 struct intel_dpll_hw_state *hw_state)
2874 enum port port = (enum port)pll->id; /* 1:1 port->PLL mapping */
2877 if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
2880 val = I915_READ(BXT_PORT_PLL_ENABLE(port));
2881 if (!(val & PORT_PLL_ENABLE))
2884 hw_state->ebb0 = I915_READ(BXT_PORT_PLL_EBB_0(port));
2885 hw_state->ebb0 &= PORT_PLL_P1_MASK | PORT_PLL_P2_MASK;
2887 hw_state->ebb4 = I915_READ(BXT_PORT_PLL_EBB_4(port));
2888 hw_state->ebb4 &= PORT_PLL_10BIT_CLK_ENABLE;
2890 hw_state->pll0 = I915_READ(BXT_PORT_PLL(port, 0));
2891 hw_state->pll0 &= PORT_PLL_M2_MASK;
2893 hw_state->pll1 = I915_READ(BXT_PORT_PLL(port, 1));
2894 hw_state->pll1 &= PORT_PLL_N_MASK;
2896 hw_state->pll2 = I915_READ(BXT_PORT_PLL(port, 2));
2897 hw_state->pll2 &= PORT_PLL_M2_FRAC_MASK;
2899 hw_state->pll3 = I915_READ(BXT_PORT_PLL(port, 3));
2900 hw_state->pll3 &= PORT_PLL_M2_FRAC_ENABLE;
2902 hw_state->pll6 = I915_READ(BXT_PORT_PLL(port, 6));
2903 hw_state->pll6 &= PORT_PLL_PROP_COEFF_MASK |
2904 PORT_PLL_INT_COEFF_MASK |
2905 PORT_PLL_GAIN_CTL_MASK;
2907 hw_state->pll8 = I915_READ(BXT_PORT_PLL(port, 8));
2908 hw_state->pll8 &= PORT_PLL_TARGET_CNT_MASK;
2910 hw_state->pll9 = I915_READ(BXT_PORT_PLL(port, 9));
2911 hw_state->pll9 &= PORT_PLL_LOCK_THRESHOLD_MASK;
2913 hw_state->pll10 = I915_READ(BXT_PORT_PLL(port, 10));
2914 hw_state->pll10 &= PORT_PLL_DCO_AMP_OVR_EN_H |
2915 PORT_PLL_DCO_AMP_MASK;
2918 * While we write to the group register to program all lanes at once we
2919 * can read only lane registers. We configure all lanes the same way, so
2920 * here just read out lanes 0/1 and output a note if lanes 2/3 differ.
2922 hw_state->pcsdw12 = I915_READ(BXT_PORT_PCS_DW12_LN01(port));
2923 if (I915_READ(BXT_PORT_PCS_DW12_LN23(port)) != hw_state->pcsdw12)
2924 DRM_DEBUG_DRIVER("lane stagger config different for lane 01 (%08x) and 23 (%08x)\n",
2926 I915_READ(BXT_PORT_PCS_DW12_LN23(port)));
2927 hw_state->pcsdw12 &= LANE_STAGGER_MASK | LANESTAGGER_STRAP_OVRD;
2932 static void bxt_shared_dplls_init(struct drm_i915_private *dev_priv)
2936 dev_priv->num_shared_dpll = 3;
2938 for (i = 0; i < dev_priv->num_shared_dpll; i++) {
2939 dev_priv->shared_dplls[i].id = i;
2940 dev_priv->shared_dplls[i].name = bxt_ddi_pll_names[i];
2941 dev_priv->shared_dplls[i].disable = bxt_ddi_pll_disable;
2942 dev_priv->shared_dplls[i].enable = bxt_ddi_pll_enable;
2943 dev_priv->shared_dplls[i].get_hw_state =
2944 bxt_ddi_pll_get_hw_state;
2948 void intel_ddi_pll_init(struct drm_device *dev)
2950 struct drm_i915_private *dev_priv = dev->dev_private;
2951 uint32_t val = I915_READ(LCPLL_CTL);
2953 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
2954 skl_shared_dplls_init(dev_priv);
2955 else if (IS_BROXTON(dev))
2956 bxt_shared_dplls_init(dev_priv);
2958 hsw_shared_dplls_init(dev_priv);
2960 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
2963 cdclk_freq = dev_priv->display.get_display_clock_speed(dev);
2964 dev_priv->skl_boot_cdclk = cdclk_freq;
2965 if (skl_sanitize_cdclk(dev_priv))
2966 DRM_DEBUG_KMS("Sanitized cdclk programmed by pre-os\n");
2967 if (!(I915_READ(LCPLL1_CTL) & LCPLL_PLL_ENABLE))
2968 DRM_ERROR("LCPLL1 is disabled\n");
2969 } else if (IS_BROXTON(dev)) {
2970 broxton_init_cdclk(dev);
2971 broxton_ddi_phy_init(dev);
2974 * The LCPLL register should be turned on by the BIOS. For now
2975 * let's just check its state and print errors in case
2976 * something is wrong. Don't even try to turn it on.
2979 if (val & LCPLL_CD_SOURCE_FCLK)
2980 DRM_ERROR("CDCLK source is not LCPLL\n");
2982 if (val & LCPLL_PLL_DISABLE)
2983 DRM_ERROR("LCPLL is disabled\n");
2987 void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp)
2989 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2990 struct drm_i915_private *dev_priv =
2991 to_i915(intel_dig_port->base.base.dev);
2992 enum port port = intel_dig_port->port;
2996 if (I915_READ(DP_TP_CTL(port)) & DP_TP_CTL_ENABLE) {
2997 val = I915_READ(DDI_BUF_CTL(port));
2998 if (val & DDI_BUF_CTL_ENABLE) {
2999 val &= ~DDI_BUF_CTL_ENABLE;
3000 I915_WRITE(DDI_BUF_CTL(port), val);
3004 val = I915_READ(DP_TP_CTL(port));
3005 val &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
3006 val |= DP_TP_CTL_LINK_TRAIN_PAT1;
3007 I915_WRITE(DP_TP_CTL(port), val);
3008 POSTING_READ(DP_TP_CTL(port));
3011 intel_wait_ddi_buf_idle(dev_priv, port);
3014 val = DP_TP_CTL_ENABLE |
3015 DP_TP_CTL_LINK_TRAIN_PAT1 | DP_TP_CTL_SCRAMBLE_DISABLE;
3016 if (intel_dp->is_mst)
3017 val |= DP_TP_CTL_MODE_MST;
3019 val |= DP_TP_CTL_MODE_SST;
3020 if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
3021 val |= DP_TP_CTL_ENHANCED_FRAME_ENABLE;
3023 I915_WRITE(DP_TP_CTL(port), val);
3024 POSTING_READ(DP_TP_CTL(port));
3026 intel_dp->DP |= DDI_BUF_CTL_ENABLE;
3027 I915_WRITE(DDI_BUF_CTL(port), intel_dp->DP);
3028 POSTING_READ(DDI_BUF_CTL(port));
3033 void intel_ddi_fdi_disable(struct drm_crtc *crtc)
3035 struct drm_i915_private *dev_priv = crtc->dev->dev_private;
3036 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
3039 intel_ddi_post_disable(intel_encoder);
3041 val = I915_READ(FDI_RX_CTL(PIPE_A));
3042 val &= ~FDI_RX_ENABLE;
3043 I915_WRITE(FDI_RX_CTL(PIPE_A), val);
3045 val = I915_READ(FDI_RX_MISC(PIPE_A));
3046 val &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
3047 val |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
3048 I915_WRITE(FDI_RX_MISC(PIPE_A), val);
3050 val = I915_READ(FDI_RX_CTL(PIPE_A));
3052 I915_WRITE(FDI_RX_CTL(PIPE_A), val);
3054 val = I915_READ(FDI_RX_CTL(PIPE_A));
3055 val &= ~FDI_RX_PLL_ENABLE;
3056 I915_WRITE(FDI_RX_CTL(PIPE_A), val);
3059 bool intel_ddi_is_audio_enabled(struct drm_i915_private *dev_priv,
3060 struct intel_crtc *intel_crtc)
3064 if (intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_AUDIO)) {
3065 temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
3066 if (temp & AUDIO_OUTPUT_ENABLE(intel_crtc->pipe))
3072 void intel_ddi_get_config(struct intel_encoder *encoder,
3073 struct intel_crtc_state *pipe_config)
3075 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
3076 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
3077 enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
3078 struct intel_hdmi *intel_hdmi;
3079 u32 temp, flags = 0;
3081 temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
3082 if (temp & TRANS_DDI_PHSYNC)
3083 flags |= DRM_MODE_FLAG_PHSYNC;
3085 flags |= DRM_MODE_FLAG_NHSYNC;
3086 if (temp & TRANS_DDI_PVSYNC)
3087 flags |= DRM_MODE_FLAG_PVSYNC;
3089 flags |= DRM_MODE_FLAG_NVSYNC;
3091 pipe_config->base.adjusted_mode.flags |= flags;
3093 switch (temp & TRANS_DDI_BPC_MASK) {
3094 case TRANS_DDI_BPC_6:
3095 pipe_config->pipe_bpp = 18;
3097 case TRANS_DDI_BPC_8:
3098 pipe_config->pipe_bpp = 24;
3100 case TRANS_DDI_BPC_10:
3101 pipe_config->pipe_bpp = 30;
3103 case TRANS_DDI_BPC_12:
3104 pipe_config->pipe_bpp = 36;
3110 switch (temp & TRANS_DDI_MODE_SELECT_MASK) {
3111 case TRANS_DDI_MODE_SELECT_HDMI:
3112 pipe_config->has_hdmi_sink = true;
3113 intel_hdmi = enc_to_intel_hdmi(&encoder->base);
3115 if (intel_hdmi->infoframe_enabled(&encoder->base, pipe_config))
3116 pipe_config->has_infoframe = true;
3118 case TRANS_DDI_MODE_SELECT_DVI:
3119 case TRANS_DDI_MODE_SELECT_FDI:
3121 case TRANS_DDI_MODE_SELECT_DP_SST:
3122 case TRANS_DDI_MODE_SELECT_DP_MST:
3123 pipe_config->has_dp_encoder = true;
3124 pipe_config->lane_count =
3125 ((temp & DDI_PORT_WIDTH_MASK) >> DDI_PORT_WIDTH_SHIFT) + 1;
3126 intel_dp_get_m_n(intel_crtc, pipe_config);
3132 pipe_config->has_audio =
3133 intel_ddi_is_audio_enabled(dev_priv, intel_crtc);
3135 if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp_bpp &&
3136 pipe_config->pipe_bpp > dev_priv->vbt.edp_bpp) {
3138 * This is a big fat ugly hack.
3140 * Some machines in UEFI boot mode provide us a VBT that has 18
3141 * bpp and 1.62 GHz link bandwidth for eDP, which for reasons
3142 * unknown we fail to light up. Yet the same BIOS boots up with
3143 * 24 bpp and 2.7 GHz link. Use the same bpp as the BIOS uses as
3144 * max, not what it tells us to use.
3146 * Note: This will still be broken if the eDP panel is not lit
3147 * up by the BIOS, and thus we can't get the mode at module
3150 DRM_DEBUG_KMS("pipe has %d bpp for eDP panel, overriding BIOS-provided max %d bpp\n",
3151 pipe_config->pipe_bpp, dev_priv->vbt.edp_bpp);
3152 dev_priv->vbt.edp_bpp = pipe_config->pipe_bpp;
3155 intel_ddi_clock_get(encoder, pipe_config);
3158 static void intel_ddi_destroy(struct drm_encoder *encoder)
3160 /* HDMI has nothing special to destroy, so we can go with this. */
3161 intel_dp_encoder_destroy(encoder);
3164 static bool intel_ddi_compute_config(struct intel_encoder *encoder,
3165 struct intel_crtc_state *pipe_config)
3167 int type = encoder->type;
3168 int port = intel_ddi_get_encoder_port(encoder);
3170 WARN(type == INTEL_OUTPUT_UNKNOWN, "compute_config() on unknown output!\n");
3173 pipe_config->cpu_transcoder = TRANSCODER_EDP;
3175 if (type == INTEL_OUTPUT_HDMI)
3176 return intel_hdmi_compute_config(encoder, pipe_config);
3178 return intel_dp_compute_config(encoder, pipe_config);
3181 static const struct drm_encoder_funcs intel_ddi_funcs = {
3182 .destroy = intel_ddi_destroy,
3185 static struct intel_connector *
3186 intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port)
3188 struct intel_connector *connector;
3189 enum port port = intel_dig_port->port;
3191 connector = intel_connector_alloc();
3195 intel_dig_port->dp.output_reg = DDI_BUF_CTL(port);
3196 if (!intel_dp_init_connector(intel_dig_port, connector)) {
3204 static struct intel_connector *
3205 intel_ddi_init_hdmi_connector(struct intel_digital_port *intel_dig_port)
3207 struct intel_connector *connector;
3208 enum port port = intel_dig_port->port;
3210 connector = intel_connector_alloc();
3214 intel_dig_port->hdmi.hdmi_reg = DDI_BUF_CTL(port);
3215 intel_hdmi_init_connector(intel_dig_port, connector);
3220 void intel_ddi_init(struct drm_device *dev, enum port port)
3222 struct drm_i915_private *dev_priv = dev->dev_private;
3223 struct intel_digital_port *intel_dig_port;
3224 struct intel_encoder *intel_encoder;
3225 struct drm_encoder *encoder;
3226 bool init_hdmi, init_dp;
3229 if (I915_READ(DDI_BUF_CTL(PORT_A)) & DDI_A_4_LANES) {
3255 init_hdmi = (dev_priv->vbt.ddi_port_info[port].supports_dvi ||
3256 dev_priv->vbt.ddi_port_info[port].supports_hdmi);
3257 init_dp = dev_priv->vbt.ddi_port_info[port].supports_dp;
3258 if (!init_dp && !init_hdmi) {
3259 DRM_DEBUG_KMS("VBT says port %c is not DVI/HDMI/DP compatible, respect it\n",
3264 intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
3265 if (!intel_dig_port)
3268 intel_encoder = &intel_dig_port->base;
3269 encoder = &intel_encoder->base;
3271 drm_encoder_init(dev, encoder, &intel_ddi_funcs,
3272 DRM_MODE_ENCODER_TMDS, NULL);
3274 intel_encoder->compute_config = intel_ddi_compute_config;
3275 intel_encoder->enable = intel_enable_ddi;
3276 intel_encoder->pre_enable = intel_ddi_pre_enable;
3277 intel_encoder->disable = intel_disable_ddi;
3278 intel_encoder->post_disable = intel_ddi_post_disable;
3279 intel_encoder->get_hw_state = intel_ddi_get_hw_state;
3280 intel_encoder->get_config = intel_ddi_get_config;
3282 intel_dig_port->port = port;
3283 dev_priv->dig_port_map[port] = intel_encoder;
3284 intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) &
3285 (DDI_BUF_PORT_REVERSAL |
3289 * Bspec says that DDI_A_4_LANES is the only supported configuration
3290 * for Broxton. Yet some BIOS fail to set this bit on port A if eDP
3291 * wasn't lit up at boot. Force this bit on in our internal
3292 * configuration so that we use the proper lane count for our
3295 if (IS_BROXTON(dev) && port == PORT_A) {
3296 if (!(intel_dig_port->saved_port_bits & DDI_A_4_LANES)) {
3297 DRM_DEBUG_KMS("BXT BIOS forgot to set DDI_A_4_LANES for port A; fixing\n");
3298 intel_dig_port->saved_port_bits |= DDI_A_4_LANES;
3303 intel_dig_port->max_lanes = max_lanes;
3305 intel_encoder->type = INTEL_OUTPUT_UNKNOWN;
3306 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
3307 intel_encoder->cloneable = 0;
3310 if (!intel_ddi_init_dp_connector(intel_dig_port))
3313 intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
3315 * On BXT A0/A1, sw needs to activate DDIA HPD logic and
3316 * interrupts to check the external panel connection.
3318 if (IS_BXT_REVID(dev, 0, BXT_REVID_A1) && port == PORT_B)
3319 dev_priv->hotplug.irq_port[PORT_A] = intel_dig_port;
3321 dev_priv->hotplug.irq_port[port] = intel_dig_port;
3324 /* In theory we don't need the encoder->type check, but leave it just in
3325 * case we have some really bad VBTs... */
3326 if (intel_encoder->type != INTEL_OUTPUT_EDP && init_hdmi) {
3327 if (!intel_ddi_init_hdmi_connector(intel_dig_port))
3334 drm_encoder_cleanup(encoder);
3335 kfree(intel_dig_port);