1 // SPDX-License-Identifier: MIT
3 * Copyright © 2020 Intel Corporation
6 #include "intel_atomic.h"
7 #include "intel_crtc.h"
10 #include "intel_display_types.h"
11 #include "intel_fdi.h"
13 struct intel_fdi_funcs {
14 void (*fdi_link_train)(struct intel_crtc *crtc,
15 const struct intel_crtc_state *crtc_state);
18 static void assert_fdi_tx(struct drm_i915_private *dev_priv,
19 enum pipe pipe, bool state)
23 if (HAS_DDI(dev_priv)) {
25 * DDI does not have a specific FDI_TX register.
27 * FDI is never fed from EDP transcoder
28 * so pipe->transcoder cast is fine here.
30 enum transcoder cpu_transcoder = (enum transcoder)pipe;
31 cur_state = intel_de_read(dev_priv, TRANS_DDI_FUNC_CTL(cpu_transcoder)) & TRANS_DDI_FUNC_ENABLE;
33 cur_state = intel_de_read(dev_priv, FDI_TX_CTL(pipe)) & FDI_TX_ENABLE;
35 I915_STATE_WARN(cur_state != state,
36 "FDI TX state assertion failure (expected %s, current %s)\n",
37 onoff(state), onoff(cur_state));
40 void assert_fdi_tx_enabled(struct drm_i915_private *i915, enum pipe pipe)
42 assert_fdi_tx(i915, pipe, true);
45 void assert_fdi_tx_disabled(struct drm_i915_private *i915, enum pipe pipe)
47 assert_fdi_tx(i915, pipe, false);
50 static void assert_fdi_rx(struct drm_i915_private *dev_priv,
51 enum pipe pipe, bool state)
55 cur_state = intel_de_read(dev_priv, FDI_RX_CTL(pipe)) & FDI_RX_ENABLE;
56 I915_STATE_WARN(cur_state != state,
57 "FDI RX state assertion failure (expected %s, current %s)\n",
58 onoff(state), onoff(cur_state));
61 void assert_fdi_rx_enabled(struct drm_i915_private *i915, enum pipe pipe)
63 assert_fdi_rx(i915, pipe, true);
66 void assert_fdi_rx_disabled(struct drm_i915_private *i915, enum pipe pipe)
68 assert_fdi_rx(i915, pipe, false);
71 void assert_fdi_tx_pll_enabled(struct drm_i915_private *i915,
76 /* ILK FDI PLL is always enabled */
77 if (IS_IRONLAKE(i915))
80 /* On Haswell, DDI ports are responsible for the FDI PLL setup */
84 cur_state = intel_de_read(i915, FDI_TX_CTL(pipe)) & FDI_TX_PLL_ENABLE;
85 I915_STATE_WARN(!cur_state, "FDI TX PLL assertion failure, should be active but is disabled\n");
88 static void assert_fdi_rx_pll(struct drm_i915_private *i915,
89 enum pipe pipe, bool state)
93 cur_state = intel_de_read(i915, FDI_RX_CTL(pipe)) & FDI_RX_PLL_ENABLE;
94 I915_STATE_WARN(cur_state != state,
95 "FDI RX PLL assertion failure (expected %s, current %s)\n",
96 onoff(state), onoff(cur_state));
99 void assert_fdi_rx_pll_enabled(struct drm_i915_private *i915, enum pipe pipe)
101 assert_fdi_rx_pll(i915, pipe, true);
104 void assert_fdi_rx_pll_disabled(struct drm_i915_private *i915, enum pipe pipe)
106 assert_fdi_rx_pll(i915, pipe, false);
109 void intel_fdi_link_train(struct intel_crtc *crtc,
110 const struct intel_crtc_state *crtc_state)
112 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
114 dev_priv->fdi_funcs->fdi_link_train(crtc, crtc_state);
117 /* units of 100MHz */
118 static int pipe_required_fdi_lanes(struct intel_crtc_state *crtc_state)
120 if (crtc_state->hw.enable && crtc_state->has_pch_encoder)
121 return crtc_state->fdi_lanes;
126 static int ilk_check_fdi_lanes(struct drm_device *dev, enum pipe pipe,
127 struct intel_crtc_state *pipe_config)
129 struct drm_i915_private *dev_priv = to_i915(dev);
130 struct drm_atomic_state *state = pipe_config->uapi.state;
131 struct intel_crtc *other_crtc;
132 struct intel_crtc_state *other_crtc_state;
134 drm_dbg_kms(&dev_priv->drm,
135 "checking fdi config on pipe %c, lanes %i\n",
136 pipe_name(pipe), pipe_config->fdi_lanes);
137 if (pipe_config->fdi_lanes > 4) {
138 drm_dbg_kms(&dev_priv->drm,
139 "invalid fdi lane config on pipe %c: %i lanes\n",
140 pipe_name(pipe), pipe_config->fdi_lanes);
144 if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
145 if (pipe_config->fdi_lanes > 2) {
146 drm_dbg_kms(&dev_priv->drm,
147 "only 2 lanes on haswell, required: %i lanes\n",
148 pipe_config->fdi_lanes);
155 if (INTEL_NUM_PIPES(dev_priv) == 2)
158 /* Ivybridge 3 pipe is really complicated */
163 if (pipe_config->fdi_lanes <= 2)
166 other_crtc = intel_crtc_for_pipe(dev_priv, PIPE_C);
168 intel_atomic_get_crtc_state(state, other_crtc);
169 if (IS_ERR(other_crtc_state))
170 return PTR_ERR(other_crtc_state);
172 if (pipe_required_fdi_lanes(other_crtc_state) > 0) {
173 drm_dbg_kms(&dev_priv->drm,
174 "invalid shared fdi lane config on pipe %c: %i lanes\n",
175 pipe_name(pipe), pipe_config->fdi_lanes);
180 if (pipe_config->fdi_lanes > 2) {
181 drm_dbg_kms(&dev_priv->drm,
182 "only 2 lanes on pipe %c: required %i lanes\n",
183 pipe_name(pipe), pipe_config->fdi_lanes);
187 other_crtc = intel_crtc_for_pipe(dev_priv, PIPE_B);
189 intel_atomic_get_crtc_state(state, other_crtc);
190 if (IS_ERR(other_crtc_state))
191 return PTR_ERR(other_crtc_state);
193 if (pipe_required_fdi_lanes(other_crtc_state) > 2) {
194 drm_dbg_kms(&dev_priv->drm,
195 "fdi link B uses too many lanes to enable link C\n");
205 void intel_fdi_pll_freq_update(struct drm_i915_private *i915)
207 if (IS_IRONLAKE(i915)) {
209 intel_de_read(i915, FDI_PLL_BIOS_0) & FDI_PLL_FB_CLOCK_MASK;
211 i915->fdi_pll_freq = (fdi_pll_clk + 2) * 10000;
212 } else if (IS_SANDYBRIDGE(i915) || IS_IVYBRIDGE(i915)) {
213 i915->fdi_pll_freq = 270000;
218 drm_dbg(&i915->drm, "FDI PLL freq=%d\n", i915->fdi_pll_freq);
221 int intel_fdi_link_freq(struct drm_i915_private *i915,
222 const struct intel_crtc_state *pipe_config)
225 return pipe_config->port_clock; /* SPLL */
227 return i915->fdi_pll_freq;
230 int ilk_fdi_compute_config(struct intel_crtc *crtc,
231 struct intel_crtc_state *pipe_config)
233 struct drm_device *dev = crtc->base.dev;
234 struct drm_i915_private *i915 = to_i915(dev);
235 const struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
236 int lane, link_bw, fdi_dotclock, ret;
237 bool needs_recompute = false;
240 /* FDI is a binary signal running at ~2.7GHz, encoding
241 * each output octet as 10 bits. The actual frequency
242 * is stored as a divider into a 100MHz clock, and the
243 * mode pixel clock is stored in units of 1KHz.
244 * Hence the bw of each lane in terms of the mode signal
247 link_bw = intel_fdi_link_freq(i915, pipe_config);
249 fdi_dotclock = adjusted_mode->crtc_clock;
251 lane = ilk_get_lanes_required(fdi_dotclock, link_bw,
252 pipe_config->pipe_bpp);
254 pipe_config->fdi_lanes = lane;
256 intel_link_compute_m_n(pipe_config->pipe_bpp, lane, fdi_dotclock,
257 link_bw, &pipe_config->fdi_m_n, false, false);
259 ret = ilk_check_fdi_lanes(dev, crtc->pipe, pipe_config);
263 if (ret == -EINVAL && pipe_config->pipe_bpp > 6*3) {
264 pipe_config->pipe_bpp -= 2*3;
265 drm_dbg_kms(&i915->drm,
266 "fdi link bw constraint, reducing pipe bpp to %i\n",
267 pipe_config->pipe_bpp);
268 needs_recompute = true;
269 pipe_config->bw_constrained = true;
280 static void cpt_set_fdi_bc_bifurcation(struct drm_i915_private *dev_priv, bool enable)
284 temp = intel_de_read(dev_priv, SOUTH_CHICKEN1);
285 if (!!(temp & FDI_BC_BIFURCATION_SELECT) == enable)
288 drm_WARN_ON(&dev_priv->drm,
289 intel_de_read(dev_priv, FDI_RX_CTL(PIPE_B)) &
291 drm_WARN_ON(&dev_priv->drm,
292 intel_de_read(dev_priv, FDI_RX_CTL(PIPE_C)) &
295 temp &= ~FDI_BC_BIFURCATION_SELECT;
297 temp |= FDI_BC_BIFURCATION_SELECT;
299 drm_dbg_kms(&dev_priv->drm, "%sabling fdi C rx\n",
300 enable ? "en" : "dis");
301 intel_de_write(dev_priv, SOUTH_CHICKEN1, temp);
302 intel_de_posting_read(dev_priv, SOUTH_CHICKEN1);
305 static void ivb_update_fdi_bc_bifurcation(const struct intel_crtc_state *crtc_state)
307 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
308 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
310 switch (crtc->pipe) {
314 if (crtc_state->fdi_lanes > 2)
315 cpt_set_fdi_bc_bifurcation(dev_priv, false);
317 cpt_set_fdi_bc_bifurcation(dev_priv, true);
321 cpt_set_fdi_bc_bifurcation(dev_priv, true);
325 MISSING_CASE(crtc->pipe);
329 void intel_fdi_normal_train(struct intel_crtc *crtc)
331 struct drm_device *dev = crtc->base.dev;
332 struct drm_i915_private *dev_priv = to_i915(dev);
333 enum pipe pipe = crtc->pipe;
337 /* enable normal train */
338 reg = FDI_TX_CTL(pipe);
339 temp = intel_de_read(dev_priv, reg);
340 if (IS_IVYBRIDGE(dev_priv)) {
341 temp &= ~FDI_LINK_TRAIN_NONE_IVB;
342 temp |= FDI_LINK_TRAIN_NONE_IVB | FDI_TX_ENHANCE_FRAME_ENABLE;
344 temp &= ~FDI_LINK_TRAIN_NONE;
345 temp |= FDI_LINK_TRAIN_NONE | FDI_TX_ENHANCE_FRAME_ENABLE;
347 intel_de_write(dev_priv, reg, temp);
349 reg = FDI_RX_CTL(pipe);
350 temp = intel_de_read(dev_priv, reg);
351 if (HAS_PCH_CPT(dev_priv)) {
352 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
353 temp |= FDI_LINK_TRAIN_NORMAL_CPT;
355 temp &= ~FDI_LINK_TRAIN_NONE;
356 temp |= FDI_LINK_TRAIN_NONE;
358 intel_de_write(dev_priv, reg, temp | FDI_RX_ENHANCE_FRAME_ENABLE);
360 /* wait one idle pattern time */
361 intel_de_posting_read(dev_priv, reg);
364 /* IVB wants error correction enabled */
365 if (IS_IVYBRIDGE(dev_priv))
366 intel_de_write(dev_priv, reg,
367 intel_de_read(dev_priv, reg) | FDI_FS_ERRC_ENABLE | FDI_FE_ERRC_ENABLE);
370 /* The FDI link training functions for ILK/Ibexpeak. */
371 static void ilk_fdi_link_train(struct intel_crtc *crtc,
372 const struct intel_crtc_state *crtc_state)
374 struct drm_device *dev = crtc->base.dev;
375 struct drm_i915_private *dev_priv = to_i915(dev);
376 enum pipe pipe = crtc->pipe;
381 * Write the TU size bits before fdi link training, so that error
384 intel_de_write(dev_priv, FDI_RX_TUSIZE1(pipe),
385 intel_de_read(dev_priv, PIPE_DATA_M1(pipe)) & TU_SIZE_MASK);
387 /* FDI needs bits from pipe first */
388 assert_transcoder_enabled(dev_priv, crtc_state->cpu_transcoder);
390 /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit
392 reg = FDI_RX_IMR(pipe);
393 temp = intel_de_read(dev_priv, reg);
394 temp &= ~FDI_RX_SYMBOL_LOCK;
395 temp &= ~FDI_RX_BIT_LOCK;
396 intel_de_write(dev_priv, reg, temp);
397 intel_de_read(dev_priv, reg);
400 /* enable CPU FDI TX and PCH FDI RX */
401 reg = FDI_TX_CTL(pipe);
402 temp = intel_de_read(dev_priv, reg);
403 temp &= ~FDI_DP_PORT_WIDTH_MASK;
404 temp |= FDI_DP_PORT_WIDTH(crtc_state->fdi_lanes);
405 temp &= ~FDI_LINK_TRAIN_NONE;
406 temp |= FDI_LINK_TRAIN_PATTERN_1;
407 intel_de_write(dev_priv, reg, temp | FDI_TX_ENABLE);
409 reg = FDI_RX_CTL(pipe);
410 temp = intel_de_read(dev_priv, reg);
411 temp &= ~FDI_LINK_TRAIN_NONE;
412 temp |= FDI_LINK_TRAIN_PATTERN_1;
413 intel_de_write(dev_priv, reg, temp | FDI_RX_ENABLE);
415 intel_de_posting_read(dev_priv, reg);
418 /* Ironlake workaround, enable clock pointer after FDI enable*/
419 intel_de_write(dev_priv, FDI_RX_CHICKEN(pipe),
420 FDI_RX_PHASE_SYNC_POINTER_OVR);
421 intel_de_write(dev_priv, FDI_RX_CHICKEN(pipe),
422 FDI_RX_PHASE_SYNC_POINTER_OVR | FDI_RX_PHASE_SYNC_POINTER_EN);
424 reg = FDI_RX_IIR(pipe);
425 for (tries = 0; tries < 5; tries++) {
426 temp = intel_de_read(dev_priv, reg);
427 drm_dbg_kms(&dev_priv->drm, "FDI_RX_IIR 0x%x\n", temp);
429 if ((temp & FDI_RX_BIT_LOCK)) {
430 drm_dbg_kms(&dev_priv->drm, "FDI train 1 done.\n");
431 intel_de_write(dev_priv, reg, temp | FDI_RX_BIT_LOCK);
436 drm_err(&dev_priv->drm, "FDI train 1 fail!\n");
439 reg = FDI_TX_CTL(pipe);
440 temp = intel_de_read(dev_priv, reg);
441 temp &= ~FDI_LINK_TRAIN_NONE;
442 temp |= FDI_LINK_TRAIN_PATTERN_2;
443 intel_de_write(dev_priv, reg, temp);
445 reg = FDI_RX_CTL(pipe);
446 temp = intel_de_read(dev_priv, reg);
447 temp &= ~FDI_LINK_TRAIN_NONE;
448 temp |= FDI_LINK_TRAIN_PATTERN_2;
449 intel_de_write(dev_priv, reg, temp);
451 intel_de_posting_read(dev_priv, reg);
454 reg = FDI_RX_IIR(pipe);
455 for (tries = 0; tries < 5; tries++) {
456 temp = intel_de_read(dev_priv, reg);
457 drm_dbg_kms(&dev_priv->drm, "FDI_RX_IIR 0x%x\n", temp);
459 if (temp & FDI_RX_SYMBOL_LOCK) {
460 intel_de_write(dev_priv, reg,
461 temp | FDI_RX_SYMBOL_LOCK);
462 drm_dbg_kms(&dev_priv->drm, "FDI train 2 done.\n");
467 drm_err(&dev_priv->drm, "FDI train 2 fail!\n");
469 drm_dbg_kms(&dev_priv->drm, "FDI train done\n");
473 static const int snb_b_fdi_train_param[] = {
474 FDI_LINK_TRAIN_400MV_0DB_SNB_B,
475 FDI_LINK_TRAIN_400MV_6DB_SNB_B,
476 FDI_LINK_TRAIN_600MV_3_5DB_SNB_B,
477 FDI_LINK_TRAIN_800MV_0DB_SNB_B,
480 /* The FDI link training functions for SNB/Cougarpoint. */
481 static void gen6_fdi_link_train(struct intel_crtc *crtc,
482 const struct intel_crtc_state *crtc_state)
484 struct drm_device *dev = crtc->base.dev;
485 struct drm_i915_private *dev_priv = to_i915(dev);
486 enum pipe pipe = crtc->pipe;
491 * Write the TU size bits before fdi link training, so that error
494 intel_de_write(dev_priv, FDI_RX_TUSIZE1(pipe),
495 intel_de_read(dev_priv, PIPE_DATA_M1(pipe)) & TU_SIZE_MASK);
497 /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit
499 reg = FDI_RX_IMR(pipe);
500 temp = intel_de_read(dev_priv, reg);
501 temp &= ~FDI_RX_SYMBOL_LOCK;
502 temp &= ~FDI_RX_BIT_LOCK;
503 intel_de_write(dev_priv, reg, temp);
505 intel_de_posting_read(dev_priv, reg);
508 /* enable CPU FDI TX and PCH FDI RX */
509 reg = FDI_TX_CTL(pipe);
510 temp = intel_de_read(dev_priv, reg);
511 temp &= ~FDI_DP_PORT_WIDTH_MASK;
512 temp |= FDI_DP_PORT_WIDTH(crtc_state->fdi_lanes);
513 temp &= ~FDI_LINK_TRAIN_NONE;
514 temp |= FDI_LINK_TRAIN_PATTERN_1;
515 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
517 temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B;
518 intel_de_write(dev_priv, reg, temp | FDI_TX_ENABLE);
520 intel_de_write(dev_priv, FDI_RX_MISC(pipe),
521 FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90);
523 reg = FDI_RX_CTL(pipe);
524 temp = intel_de_read(dev_priv, reg);
525 if (HAS_PCH_CPT(dev_priv)) {
526 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
527 temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
529 temp &= ~FDI_LINK_TRAIN_NONE;
530 temp |= FDI_LINK_TRAIN_PATTERN_1;
532 intel_de_write(dev_priv, reg, temp | FDI_RX_ENABLE);
534 intel_de_posting_read(dev_priv, reg);
537 for (i = 0; i < 4; i++) {
538 reg = FDI_TX_CTL(pipe);
539 temp = intel_de_read(dev_priv, reg);
540 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
541 temp |= snb_b_fdi_train_param[i];
542 intel_de_write(dev_priv, reg, temp);
544 intel_de_posting_read(dev_priv, reg);
547 for (retry = 0; retry < 5; retry++) {
548 reg = FDI_RX_IIR(pipe);
549 temp = intel_de_read(dev_priv, reg);
550 drm_dbg_kms(&dev_priv->drm, "FDI_RX_IIR 0x%x\n", temp);
551 if (temp & FDI_RX_BIT_LOCK) {
552 intel_de_write(dev_priv, reg,
553 temp | FDI_RX_BIT_LOCK);
554 drm_dbg_kms(&dev_priv->drm,
555 "FDI train 1 done.\n");
564 drm_err(&dev_priv->drm, "FDI train 1 fail!\n");
567 reg = FDI_TX_CTL(pipe);
568 temp = intel_de_read(dev_priv, reg);
569 temp &= ~FDI_LINK_TRAIN_NONE;
570 temp |= FDI_LINK_TRAIN_PATTERN_2;
571 if (IS_SANDYBRIDGE(dev_priv)) {
572 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
574 temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B;
576 intel_de_write(dev_priv, reg, temp);
578 reg = FDI_RX_CTL(pipe);
579 temp = intel_de_read(dev_priv, reg);
580 if (HAS_PCH_CPT(dev_priv)) {
581 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
582 temp |= FDI_LINK_TRAIN_PATTERN_2_CPT;
584 temp &= ~FDI_LINK_TRAIN_NONE;
585 temp |= FDI_LINK_TRAIN_PATTERN_2;
587 intel_de_write(dev_priv, reg, temp);
589 intel_de_posting_read(dev_priv, reg);
592 for (i = 0; i < 4; i++) {
593 reg = FDI_TX_CTL(pipe);
594 temp = intel_de_read(dev_priv, reg);
595 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
596 temp |= snb_b_fdi_train_param[i];
597 intel_de_write(dev_priv, reg, temp);
599 intel_de_posting_read(dev_priv, reg);
602 for (retry = 0; retry < 5; retry++) {
603 reg = FDI_RX_IIR(pipe);
604 temp = intel_de_read(dev_priv, reg);
605 drm_dbg_kms(&dev_priv->drm, "FDI_RX_IIR 0x%x\n", temp);
606 if (temp & FDI_RX_SYMBOL_LOCK) {
607 intel_de_write(dev_priv, reg,
608 temp | FDI_RX_SYMBOL_LOCK);
609 drm_dbg_kms(&dev_priv->drm,
610 "FDI train 2 done.\n");
619 drm_err(&dev_priv->drm, "FDI train 2 fail!\n");
621 drm_dbg_kms(&dev_priv->drm, "FDI train done.\n");
624 /* Manual link training for Ivy Bridge A0 parts */
625 static void ivb_manual_fdi_link_train(struct intel_crtc *crtc,
626 const struct intel_crtc_state *crtc_state)
628 struct drm_device *dev = crtc->base.dev;
629 struct drm_i915_private *dev_priv = to_i915(dev);
630 enum pipe pipe = crtc->pipe;
634 ivb_update_fdi_bc_bifurcation(crtc_state);
637 * Write the TU size bits before fdi link training, so that error
640 intel_de_write(dev_priv, FDI_RX_TUSIZE1(pipe),
641 intel_de_read(dev_priv, PIPE_DATA_M1(pipe)) & TU_SIZE_MASK);
643 /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit
645 reg = FDI_RX_IMR(pipe);
646 temp = intel_de_read(dev_priv, reg);
647 temp &= ~FDI_RX_SYMBOL_LOCK;
648 temp &= ~FDI_RX_BIT_LOCK;
649 intel_de_write(dev_priv, reg, temp);
651 intel_de_posting_read(dev_priv, reg);
654 drm_dbg_kms(&dev_priv->drm, "FDI_RX_IIR before link train 0x%x\n",
655 intel_de_read(dev_priv, FDI_RX_IIR(pipe)));
657 /* Try each vswing and preemphasis setting twice before moving on */
658 for (j = 0; j < ARRAY_SIZE(snb_b_fdi_train_param) * 2; j++) {
659 /* disable first in case we need to retry */
660 reg = FDI_TX_CTL(pipe);
661 temp = intel_de_read(dev_priv, reg);
662 temp &= ~(FDI_LINK_TRAIN_AUTO | FDI_LINK_TRAIN_NONE_IVB);
663 temp &= ~FDI_TX_ENABLE;
664 intel_de_write(dev_priv, reg, temp);
666 reg = FDI_RX_CTL(pipe);
667 temp = intel_de_read(dev_priv, reg);
668 temp &= ~FDI_LINK_TRAIN_AUTO;
669 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
670 temp &= ~FDI_RX_ENABLE;
671 intel_de_write(dev_priv, reg, temp);
673 /* enable CPU FDI TX and PCH FDI RX */
674 reg = FDI_TX_CTL(pipe);
675 temp = intel_de_read(dev_priv, reg);
676 temp &= ~FDI_DP_PORT_WIDTH_MASK;
677 temp |= FDI_DP_PORT_WIDTH(crtc_state->fdi_lanes);
678 temp |= FDI_LINK_TRAIN_PATTERN_1_IVB;
679 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
680 temp |= snb_b_fdi_train_param[j/2];
681 temp |= FDI_COMPOSITE_SYNC;
682 intel_de_write(dev_priv, reg, temp | FDI_TX_ENABLE);
684 intel_de_write(dev_priv, FDI_RX_MISC(pipe),
685 FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90);
687 reg = FDI_RX_CTL(pipe);
688 temp = intel_de_read(dev_priv, reg);
689 temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
690 temp |= FDI_COMPOSITE_SYNC;
691 intel_de_write(dev_priv, reg, temp | FDI_RX_ENABLE);
693 intel_de_posting_read(dev_priv, reg);
694 udelay(1); /* should be 0.5us */
696 for (i = 0; i < 4; i++) {
697 reg = FDI_RX_IIR(pipe);
698 temp = intel_de_read(dev_priv, reg);
699 drm_dbg_kms(&dev_priv->drm, "FDI_RX_IIR 0x%x\n", temp);
701 if (temp & FDI_RX_BIT_LOCK ||
702 (intel_de_read(dev_priv, reg) & FDI_RX_BIT_LOCK)) {
703 intel_de_write(dev_priv, reg,
704 temp | FDI_RX_BIT_LOCK);
705 drm_dbg_kms(&dev_priv->drm,
706 "FDI train 1 done, level %i.\n",
710 udelay(1); /* should be 0.5us */
713 drm_dbg_kms(&dev_priv->drm,
714 "FDI train 1 fail on vswing %d\n", j / 2);
719 reg = FDI_TX_CTL(pipe);
720 temp = intel_de_read(dev_priv, reg);
721 temp &= ~FDI_LINK_TRAIN_NONE_IVB;
722 temp |= FDI_LINK_TRAIN_PATTERN_2_IVB;
723 intel_de_write(dev_priv, reg, temp);
725 reg = FDI_RX_CTL(pipe);
726 temp = intel_de_read(dev_priv, reg);
727 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
728 temp |= FDI_LINK_TRAIN_PATTERN_2_CPT;
729 intel_de_write(dev_priv, reg, temp);
731 intel_de_posting_read(dev_priv, reg);
732 udelay(2); /* should be 1.5us */
734 for (i = 0; i < 4; i++) {
735 reg = FDI_RX_IIR(pipe);
736 temp = intel_de_read(dev_priv, reg);
737 drm_dbg_kms(&dev_priv->drm, "FDI_RX_IIR 0x%x\n", temp);
739 if (temp & FDI_RX_SYMBOL_LOCK ||
740 (intel_de_read(dev_priv, reg) & FDI_RX_SYMBOL_LOCK)) {
741 intel_de_write(dev_priv, reg,
742 temp | FDI_RX_SYMBOL_LOCK);
743 drm_dbg_kms(&dev_priv->drm,
744 "FDI train 2 done, level %i.\n",
748 udelay(2); /* should be 1.5us */
751 drm_dbg_kms(&dev_priv->drm,
752 "FDI train 2 fail on vswing %d\n", j / 2);
756 drm_dbg_kms(&dev_priv->drm, "FDI train done.\n");
759 /* Starting with Haswell, different DDI ports can work in FDI mode for
760 * connection to the PCH-located connectors. For this, it is necessary to train
761 * both the DDI port and PCH receiver for the desired DDI buffer settings.
763 * The recommended port to work in FDI mode is DDI E, which we use here. Also,
764 * please note that when FDI mode is active on DDI E, it shares 2 lines with
765 * DDI A (which is used for eDP)
767 void hsw_fdi_link_train(struct intel_encoder *encoder,
768 const struct intel_crtc_state *crtc_state)
770 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
771 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
772 u32 temp, i, rx_ctl_val;
775 encoder->get_buf_trans(encoder, crtc_state, &n_entries);
777 hsw_prepare_dp_ddi_buffers(encoder, crtc_state);
779 /* Set the FDI_RX_MISC pwrdn lanes and the 2 workarounds listed at the
780 * mode set "sequence for CRT port" document:
781 * - TP1 to TP2 time with the default value
784 * WaFDIAutoLinkSetTimingOverrride:hsw
786 intel_de_write(dev_priv, FDI_RX_MISC(PIPE_A),
787 FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2) | FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90);
789 /* Enable the PCH Receiver FDI PLL */
790 rx_ctl_val = dev_priv->fdi_rx_config | FDI_RX_ENHANCE_FRAME_ENABLE |
792 FDI_DP_PORT_WIDTH(crtc_state->fdi_lanes);
793 intel_de_write(dev_priv, FDI_RX_CTL(PIPE_A), rx_ctl_val);
794 intel_de_posting_read(dev_priv, FDI_RX_CTL(PIPE_A));
797 /* Switch from Rawclk to PCDclk */
798 rx_ctl_val |= FDI_PCDCLK;
799 intel_de_write(dev_priv, FDI_RX_CTL(PIPE_A), rx_ctl_val);
801 /* Configure Port Clock Select */
802 drm_WARN_ON(&dev_priv->drm, crtc_state->shared_dpll->info->id != DPLL_ID_SPLL);
803 intel_ddi_enable_clock(encoder, crtc_state);
805 /* Start the training iterating through available voltages and emphasis,
806 * testing each value twice. */
807 for (i = 0; i < n_entries * 2; i++) {
808 /* Configure DP_TP_CTL with auto-training */
809 intel_de_write(dev_priv, DP_TP_CTL(PORT_E),
810 DP_TP_CTL_FDI_AUTOTRAIN |
811 DP_TP_CTL_ENHANCED_FRAME_ENABLE |
812 DP_TP_CTL_LINK_TRAIN_PAT1 |
815 /* Configure and enable DDI_BUF_CTL for DDI E with next voltage.
816 * DDI E does not support port reversal, the functionality is
817 * achieved on the PCH side in FDI_RX_CTL, so no need to set the
818 * port reversal bit */
819 intel_de_write(dev_priv, DDI_BUF_CTL(PORT_E),
820 DDI_BUF_CTL_ENABLE | ((crtc_state->fdi_lanes - 1) << 1) | DDI_BUF_TRANS_SELECT(i / 2));
821 intel_de_posting_read(dev_priv, DDI_BUF_CTL(PORT_E));
825 /* Program PCH FDI Receiver TU */
826 intel_de_write(dev_priv, FDI_RX_TUSIZE1(PIPE_A), TU_SIZE(64));
828 /* Enable PCH FDI Receiver with auto-training */
829 rx_ctl_val |= FDI_RX_ENABLE | FDI_LINK_TRAIN_AUTO;
830 intel_de_write(dev_priv, FDI_RX_CTL(PIPE_A), rx_ctl_val);
831 intel_de_posting_read(dev_priv, FDI_RX_CTL(PIPE_A));
833 /* Wait for FDI receiver lane calibration */
836 /* Unset FDI_RX_MISC pwrdn lanes */
837 temp = intel_de_read(dev_priv, FDI_RX_MISC(PIPE_A));
838 temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
839 intel_de_write(dev_priv, FDI_RX_MISC(PIPE_A), temp);
840 intel_de_posting_read(dev_priv, FDI_RX_MISC(PIPE_A));
842 /* Wait for FDI auto training time */
845 temp = intel_de_read(dev_priv, DP_TP_STATUS(PORT_E));
846 if (temp & DP_TP_STATUS_AUTOTRAIN_DONE) {
847 drm_dbg_kms(&dev_priv->drm,
848 "FDI link training done on step %d\n", i);
853 * Leave things enabled even if we failed to train FDI.
854 * Results in less fireworks from the state checker.
856 if (i == n_entries * 2 - 1) {
857 drm_err(&dev_priv->drm, "FDI link training failed!\n");
861 rx_ctl_val &= ~FDI_RX_ENABLE;
862 intel_de_write(dev_priv, FDI_RX_CTL(PIPE_A), rx_ctl_val);
863 intel_de_posting_read(dev_priv, FDI_RX_CTL(PIPE_A));
865 temp = intel_de_read(dev_priv, DDI_BUF_CTL(PORT_E));
866 temp &= ~DDI_BUF_CTL_ENABLE;
867 intel_de_write(dev_priv, DDI_BUF_CTL(PORT_E), temp);
868 intel_de_posting_read(dev_priv, DDI_BUF_CTL(PORT_E));
870 /* Disable DP_TP_CTL and FDI_RX_CTL and retry */
871 temp = intel_de_read(dev_priv, DP_TP_CTL(PORT_E));
872 temp &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
873 temp |= DP_TP_CTL_LINK_TRAIN_PAT1;
874 intel_de_write(dev_priv, DP_TP_CTL(PORT_E), temp);
875 intel_de_posting_read(dev_priv, DP_TP_CTL(PORT_E));
877 intel_wait_ddi_buf_idle(dev_priv, PORT_E);
879 /* Reset FDI_RX_MISC pwrdn lanes */
880 temp = intel_de_read(dev_priv, FDI_RX_MISC(PIPE_A));
881 temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
882 temp |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
883 intel_de_write(dev_priv, FDI_RX_MISC(PIPE_A), temp);
884 intel_de_posting_read(dev_priv, FDI_RX_MISC(PIPE_A));
887 /* Enable normal pixel sending for FDI */
888 intel_de_write(dev_priv, DP_TP_CTL(PORT_E),
889 DP_TP_CTL_FDI_AUTOTRAIN |
890 DP_TP_CTL_LINK_TRAIN_NORMAL |
891 DP_TP_CTL_ENHANCED_FRAME_ENABLE |
895 void hsw_fdi_disable(struct intel_encoder *encoder)
897 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
901 * Bspec lists this as both step 13 (before DDI_BUF_CTL disable)
902 * and step 18 (after clearing PORT_CLK_SEL). Based on a BUN,
903 * step 13 is the correct place for it. Step 18 is where it was
904 * originally before the BUN.
906 val = intel_de_read(dev_priv, FDI_RX_CTL(PIPE_A));
907 val &= ~FDI_RX_ENABLE;
908 intel_de_write(dev_priv, FDI_RX_CTL(PIPE_A), val);
910 val = intel_de_read(dev_priv, DDI_BUF_CTL(PORT_E));
911 val &= ~DDI_BUF_CTL_ENABLE;
912 intel_de_write(dev_priv, DDI_BUF_CTL(PORT_E), val);
914 intel_wait_ddi_buf_idle(dev_priv, PORT_E);
916 intel_ddi_disable_clock(encoder);
918 val = intel_de_read(dev_priv, FDI_RX_MISC(PIPE_A));
919 val &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
920 val |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
921 intel_de_write(dev_priv, FDI_RX_MISC(PIPE_A), val);
923 val = intel_de_read(dev_priv, FDI_RX_CTL(PIPE_A));
925 intel_de_write(dev_priv, FDI_RX_CTL(PIPE_A), val);
927 val = intel_de_read(dev_priv, FDI_RX_CTL(PIPE_A));
928 val &= ~FDI_RX_PLL_ENABLE;
929 intel_de_write(dev_priv, FDI_RX_CTL(PIPE_A), val);
932 void ilk_fdi_pll_enable(const struct intel_crtc_state *crtc_state)
934 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
935 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
936 enum pipe pipe = crtc->pipe;
940 /* enable PCH FDI RX PLL, wait warmup plus DMI latency */
941 reg = FDI_RX_CTL(pipe);
942 temp = intel_de_read(dev_priv, reg);
943 temp &= ~(FDI_DP_PORT_WIDTH_MASK | (0x7 << 16));
944 temp |= FDI_DP_PORT_WIDTH(crtc_state->fdi_lanes);
945 temp |= (intel_de_read(dev_priv, PIPECONF(pipe)) & PIPECONF_BPC_MASK) << 11;
946 intel_de_write(dev_priv, reg, temp | FDI_RX_PLL_ENABLE);
948 intel_de_posting_read(dev_priv, reg);
951 /* Switch from Rawclk to PCDclk */
952 temp = intel_de_read(dev_priv, reg);
953 intel_de_write(dev_priv, reg, temp | FDI_PCDCLK);
955 intel_de_posting_read(dev_priv, reg);
958 /* Enable CPU FDI TX PLL, always on for Ironlake */
959 reg = FDI_TX_CTL(pipe);
960 temp = intel_de_read(dev_priv, reg);
961 if ((temp & FDI_TX_PLL_ENABLE) == 0) {
962 intel_de_write(dev_priv, reg, temp | FDI_TX_PLL_ENABLE);
964 intel_de_posting_read(dev_priv, reg);
969 void ilk_fdi_pll_disable(struct intel_crtc *crtc)
971 struct drm_device *dev = crtc->base.dev;
972 struct drm_i915_private *dev_priv = to_i915(dev);
973 enum pipe pipe = crtc->pipe;
977 /* Switch from PCDclk to Rawclk */
978 reg = FDI_RX_CTL(pipe);
979 temp = intel_de_read(dev_priv, reg);
980 intel_de_write(dev_priv, reg, temp & ~FDI_PCDCLK);
982 /* Disable CPU FDI TX PLL */
983 reg = FDI_TX_CTL(pipe);
984 temp = intel_de_read(dev_priv, reg);
985 intel_de_write(dev_priv, reg, temp & ~FDI_TX_PLL_ENABLE);
987 intel_de_posting_read(dev_priv, reg);
990 reg = FDI_RX_CTL(pipe);
991 temp = intel_de_read(dev_priv, reg);
992 intel_de_write(dev_priv, reg, temp & ~FDI_RX_PLL_ENABLE);
994 /* Wait for the clocks to turn off. */
995 intel_de_posting_read(dev_priv, reg);
999 void ilk_fdi_disable(struct intel_crtc *crtc)
1001 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1002 enum pipe pipe = crtc->pipe;
1006 /* disable CPU FDI tx and PCH FDI rx */
1007 reg = FDI_TX_CTL(pipe);
1008 temp = intel_de_read(dev_priv, reg);
1009 intel_de_write(dev_priv, reg, temp & ~FDI_TX_ENABLE);
1010 intel_de_posting_read(dev_priv, reg);
1012 reg = FDI_RX_CTL(pipe);
1013 temp = intel_de_read(dev_priv, reg);
1014 temp &= ~(0x7 << 16);
1015 temp |= (intel_de_read(dev_priv, PIPECONF(pipe)) & PIPECONF_BPC_MASK) << 11;
1016 intel_de_write(dev_priv, reg, temp & ~FDI_RX_ENABLE);
1018 intel_de_posting_read(dev_priv, reg);
1021 /* Ironlake workaround, disable clock pointer after downing FDI */
1022 if (HAS_PCH_IBX(dev_priv))
1023 intel_de_write(dev_priv, FDI_RX_CHICKEN(pipe),
1024 FDI_RX_PHASE_SYNC_POINTER_OVR);
1026 /* still set train pattern 1 */
1027 reg = FDI_TX_CTL(pipe);
1028 temp = intel_de_read(dev_priv, reg);
1029 temp &= ~FDI_LINK_TRAIN_NONE;
1030 temp |= FDI_LINK_TRAIN_PATTERN_1;
1031 intel_de_write(dev_priv, reg, temp);
1033 reg = FDI_RX_CTL(pipe);
1034 temp = intel_de_read(dev_priv, reg);
1035 if (HAS_PCH_CPT(dev_priv)) {
1036 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
1037 temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
1039 temp &= ~FDI_LINK_TRAIN_NONE;
1040 temp |= FDI_LINK_TRAIN_PATTERN_1;
1042 /* BPC in FDI rx is consistent with that in PIPECONF */
1043 temp &= ~(0x07 << 16);
1044 temp |= (intel_de_read(dev_priv, PIPECONF(pipe)) & PIPECONF_BPC_MASK) << 11;
1045 intel_de_write(dev_priv, reg, temp);
1047 intel_de_posting_read(dev_priv, reg);
1051 static const struct intel_fdi_funcs ilk_funcs = {
1052 .fdi_link_train = ilk_fdi_link_train,
1055 static const struct intel_fdi_funcs gen6_funcs = {
1056 .fdi_link_train = gen6_fdi_link_train,
1059 static const struct intel_fdi_funcs ivb_funcs = {
1060 .fdi_link_train = ivb_manual_fdi_link_train,
1064 intel_fdi_init_hook(struct drm_i915_private *dev_priv)
1066 if (IS_IRONLAKE(dev_priv)) {
1067 dev_priv->fdi_funcs = &ilk_funcs;
1068 } else if (IS_SANDYBRIDGE(dev_priv)) {
1069 dev_priv->fdi_funcs = &gen6_funcs;
1070 } else if (IS_IVYBRIDGE(dev_priv)) {
1071 /* FIXME: detect B0+ stepping and use auto training */
1072 dev_priv->fdi_funcs = &ivb_funcs;