aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_ddi.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2017-12-03 18:40:35 -0500
committerDave Airlie <airlied@redhat.com>2017-12-03 19:56:53 -0500
commitca797d29cd63e7b71b4eea29aff3b1cefd1ecb59 (patch)
treedb1ada69f713da68b43c828bd15f90e250f86ab7 /drivers/gpu/drm/i915/intel_ddi.c
parent2c1c55cb75a9c72f9726fabb8c3607947711a8df (diff)
parent010d118c20617021025a930bc8e90f371ab99da5 (diff)
Merge tag 'drm-intel-next-2017-11-17-1' of git://anongit.freedesktop.org/drm/drm-intel into drm-next
More change sets for 4.16: - Many improvements for selftests and other igt tests (Chris) - Forcewake with PUNIT->PMIC bus fixes and robustness (Hans) - Define an engine class for uABI (Tvrtko) - Context switch fixes and improvements (Chris) - GT powersavings and power gating simplification and fixes (Chris) - Other general driver clean-ups (Chris, Lucas, Ville) - Removing old, useless and/or bad workarounds (Chris, Oscar, Radhakrishna) - IPS, pipe config, etc in preparation for another Fast Boot attempt (Maarten) - OA perf fixes and support to Coffee Lake and Cannonlake (Lionel) - Fixes around GPU fault registers (Michel) - GEM Proxy (Tina) - Refactor of Geminilake and Cannonlake plane color handling (James) - Generalize transcoder loop (Mika Kahola) - New HW Workaround for Cannonlake and Geminilake (Rodrigo) - Resume GuC before using GEM (Chris) - Stolen Memory handling improvements (Ville) - Initialize entry in PPAT for older compilers (Chris) - Other fixes and robustness improvements on execbuf (Chris) - Improve logs of GEM_BUG_ON (Mika Kuoppala) - Rework with massive rename of GuC functions and files (Sagar) - Don't sanitize frame start delay if pipe is off (Ville) - Cannonlake clock fixes (Rodrigo) - Cannonlake HDMI 2.0 support (Rodrigo) - Add a GuC doorbells selftest (Michel) - Add might_sleep() check to our wait_for() (Chris) Many GVT changes for 4.16: - CSB HWSP update support (Weinan) - GVT debug helpers, dyndbg and debugfs (Chuanxiao, Shuo) - full virtualized opregion (Xiaolin) - VM health check for sane fallback (Fred) - workload submission code refactor for future enabling (Zhi) - Updated repo URL in MAINTAINERS (Zhenyu) - other many misc fixes * tag 'drm-intel-next-2017-11-17-1' of git://anongit.freedesktop.org/drm/drm-intel: (260 commits) drm/i915: Update DRIVER_DATE to 20171117 drm/i915: Add a policy note for removing workarounds drm/i915/selftests: Report ENOMEM clearly for an allocation failure Revert "drm/i915: Display WA #1133 WaFbcSkipSegments:cnl, glk" drm/i915: Calculate g4x intermediate watermarks correctly drm/i915: Calculate vlv/chv intermediate watermarks correctly, v3. drm/i915: Pass crtc_state to ips toggle functions, v2 drm/i915: Pass idle crtc_state to intel_dp_sink_crc drm/i915: Enable FIFO underrun reporting after initial fastset, v4. drm/i915: Mark the userptr invalidate workqueue as WQ_MEM_RECLAIM drm/i915: Add might_sleep() check to wait_for() drm/i915/selftests: Add a GuC doorbells selftest drm/i915/cnl: Extend HDMI 2.0 support to CNL. drm/i915/cnl: Simplify dco_fraction calculation. drm/i915/cnl: Don't blindly replace qdiv. drm/i915/cnl: Fix wrpll math for higher freqs. drm/i915/cnl: Fix, simplify and unify wrpll variable sizes. drm/i915/cnl: Remove useless conversion. drm/i915/cnl: Remove spurious central_freq. drm/i915/selftests: exercise_ggtt may have nothing to do ...
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ddi.c')
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c323
1 files changed, 184 insertions, 139 deletions
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 933c18fd4258..eff3b51872eb 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -492,24 +492,6 @@ static const struct cnl_ddi_buf_trans cnl_ddi_translations_edp_1_05V[] = {
492 { 0x2, 0x7F, 0x3F, 0x00, 0x00 }, /* 400 400 0.0 */ 492 { 0x2, 0x7F, 0x3F, 0x00, 0x00 }, /* 400 400 0.0 */
493}; 493};
494 494
495enum port intel_ddi_get_encoder_port(struct intel_encoder *encoder)
496{
497 switch (encoder->type) {
498 case INTEL_OUTPUT_DP_MST:
499 return enc_to_mst(&encoder->base)->primary->port;
500 case INTEL_OUTPUT_DP:
501 case INTEL_OUTPUT_EDP:
502 case INTEL_OUTPUT_HDMI:
503 case INTEL_OUTPUT_UNKNOWN:
504 return enc_to_dig_port(&encoder->base)->port;
505 case INTEL_OUTPUT_ANALOG:
506 return PORT_E;
507 default:
508 MISSING_CASE(encoder->type);
509 return PORT_A;
510 }
511}
512
513static const struct ddi_buf_trans * 495static const struct ddi_buf_trans *
514bdw_get_buf_trans_edp(struct drm_i915_private *dev_priv, int *n_entries) 496bdw_get_buf_trans_edp(struct drm_i915_private *dev_priv, int *n_entries)
515{ 497{
@@ -811,31 +793,24 @@ static int intel_ddi_hdmi_level(struct drm_i915_private *dev_priv, enum port por
811 * values in advance. This function programs the correct values for 793 * values in advance. This function programs the correct values for
812 * DP/eDP/FDI use cases. 794 * DP/eDP/FDI use cases.
813 */ 795 */
814static void intel_prepare_dp_ddi_buffers(struct intel_encoder *encoder) 796static void intel_prepare_dp_ddi_buffers(struct intel_encoder *encoder,
797 const struct intel_crtc_state *crtc_state)
815{ 798{
816 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 799 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
817 u32 iboost_bit = 0; 800 u32 iboost_bit = 0;
818 int i, n_entries; 801 int i, n_entries;
819 enum port port = intel_ddi_get_encoder_port(encoder); 802 enum port port = encoder->port;
820 const struct ddi_buf_trans *ddi_translations; 803 const struct ddi_buf_trans *ddi_translations;
821 804
822 switch (encoder->type) { 805 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG))
823 case INTEL_OUTPUT_EDP: 806 ddi_translations = intel_ddi_get_buf_trans_fdi(dev_priv,
807 &n_entries);
808 else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP))
824 ddi_translations = intel_ddi_get_buf_trans_edp(dev_priv, port, 809 ddi_translations = intel_ddi_get_buf_trans_edp(dev_priv, port,
825 &n_entries); 810 &n_entries);
826 break; 811 else
827 case INTEL_OUTPUT_DP:
828 ddi_translations = intel_ddi_get_buf_trans_dp(dev_priv, port, 812 ddi_translations = intel_ddi_get_buf_trans_dp(dev_priv, port,
829 &n_entries); 813 &n_entries);
830 break;
831 case INTEL_OUTPUT_ANALOG:
832 ddi_translations = intel_ddi_get_buf_trans_fdi(dev_priv,
833 &n_entries);
834 break;
835 default:
836 MISSING_CASE(encoder->type);
837 return;
838 }
839 814
840 /* If we're boosting the current, set bit 31 of trans1 */ 815 /* If we're boosting the current, set bit 31 of trans1 */
841 if (IS_GEN9_BC(dev_priv) && 816 if (IS_GEN9_BC(dev_priv) &&
@@ -861,7 +836,7 @@ static void intel_prepare_hdmi_ddi_buffers(struct intel_encoder *encoder,
861 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 836 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
862 u32 iboost_bit = 0; 837 u32 iboost_bit = 0;
863 int n_entries; 838 int n_entries;
864 enum port port = intel_ddi_get_encoder_port(encoder); 839 enum port port = encoder->port;
865 const struct ddi_buf_trans *ddi_translations; 840 const struct ddi_buf_trans *ddi_translations;
866 841
867 ddi_translations = intel_ddi_get_buf_trans_hdmi(dev_priv, &n_entries); 842 ddi_translations = intel_ddi_get_buf_trans_hdmi(dev_priv, &n_entries);
@@ -937,7 +912,7 @@ void hsw_fdi_link_train(struct intel_crtc *crtc,
937 912
938 for_each_encoder_on_crtc(dev, &crtc->base, encoder) { 913 for_each_encoder_on_crtc(dev, &crtc->base, encoder) {
939 WARN_ON(encoder->type != INTEL_OUTPUT_ANALOG); 914 WARN_ON(encoder->type != INTEL_OUTPUT_ANALOG);
940 intel_prepare_dp_ddi_buffers(encoder); 915 intel_prepare_dp_ddi_buffers(encoder, crtc_state);
941 } 916 }
942 917
943 /* Set the FDI_RX_MISC pwrdn lanes and the 2 workarounds listed at the 918 /* Set the FDI_RX_MISC pwrdn lanes and the 2 workarounds listed at the
@@ -1448,19 +1423,16 @@ static void hsw_ddi_clock_get(struct intel_encoder *encoder,
1448 ddi_dotclock_get(pipe_config); 1423 ddi_dotclock_get(pipe_config);
1449} 1424}
1450 1425
1451static int bxt_calc_pll_link(struct drm_i915_private *dev_priv, 1426static int bxt_calc_pll_link(struct intel_crtc_state *crtc_state)
1452 enum intel_dpll_id pll_id)
1453{ 1427{
1454 struct intel_shared_dpll *pll;
1455 struct intel_dpll_hw_state *state; 1428 struct intel_dpll_hw_state *state;
1456 struct dpll clock; 1429 struct dpll clock;
1457 1430
1458 /* For DDI ports we always use a shared PLL. */ 1431 /* For DDI ports we always use a shared PLL. */
1459 if (WARN_ON(pll_id == DPLL_ID_PRIVATE)) 1432 if (WARN_ON(!crtc_state->shared_dpll))
1460 return 0; 1433 return 0;
1461 1434
1462 pll = &dev_priv->shared_dplls[pll_id]; 1435 state = &crtc_state->dpll_hw_state;
1463 state = &pll->state.hw_state;
1464 1436
1465 clock.m1 = 2; 1437 clock.m1 = 2;
1466 clock.m2 = (state->pll0 & PORT_PLL_M2_MASK) << 22; 1438 clock.m2 = (state->pll0 & PORT_PLL_M2_MASK) << 22;
@@ -1474,19 +1446,15 @@ static int bxt_calc_pll_link(struct drm_i915_private *dev_priv,
1474} 1446}
1475 1447
1476static void bxt_ddi_clock_get(struct intel_encoder *encoder, 1448static void bxt_ddi_clock_get(struct intel_encoder *encoder,
1477 struct intel_crtc_state *pipe_config) 1449 struct intel_crtc_state *pipe_config)
1478{ 1450{
1479 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1451 pipe_config->port_clock = bxt_calc_pll_link(pipe_config);
1480 enum port port = intel_ddi_get_encoder_port(encoder);
1481 enum intel_dpll_id pll_id = port;
1482
1483 pipe_config->port_clock = bxt_calc_pll_link(dev_priv, pll_id);
1484 1452
1485 ddi_dotclock_get(pipe_config); 1453 ddi_dotclock_get(pipe_config);
1486} 1454}
1487 1455
1488void intel_ddi_clock_get(struct intel_encoder *encoder, 1456static void intel_ddi_clock_get(struct intel_encoder *encoder,
1489 struct intel_crtc_state *pipe_config) 1457 struct intel_crtc_state *pipe_config)
1490{ 1458{
1491 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1459 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1492 1460
@@ -1504,33 +1472,34 @@ void intel_ddi_set_pipe_settings(const struct intel_crtc_state *crtc_state)
1504{ 1472{
1505 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc); 1473 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
1506 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1474 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1507 struct intel_encoder *encoder = intel_ddi_get_crtc_encoder(crtc);
1508 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 1475 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
1509 int type = encoder->type; 1476 u32 temp;
1510 uint32_t temp;
1511 1477
1512 if (type == INTEL_OUTPUT_DP || type == INTEL_OUTPUT_EDP || type == INTEL_OUTPUT_DP_MST) { 1478 if (!intel_crtc_has_dp_encoder(crtc_state))
1513 WARN_ON(transcoder_is_dsi(cpu_transcoder)); 1479 return;
1514 1480
1515 temp = TRANS_MSA_SYNC_CLK; 1481 WARN_ON(transcoder_is_dsi(cpu_transcoder));
1516 switch (crtc_state->pipe_bpp) { 1482
1517 case 18: 1483 temp = TRANS_MSA_SYNC_CLK;
1518 temp |= TRANS_MSA_6_BPC; 1484 switch (crtc_state->pipe_bpp) {
1519 break; 1485 case 18:
1520 case 24: 1486 temp |= TRANS_MSA_6_BPC;
1521 temp |= TRANS_MSA_8_BPC; 1487 break;
1522 break; 1488 case 24:
1523 case 30: 1489 temp |= TRANS_MSA_8_BPC;
1524 temp |= TRANS_MSA_10_BPC; 1490 break;
1525 break; 1491 case 30:
1526 case 36: 1492 temp |= TRANS_MSA_10_BPC;
1527 temp |= TRANS_MSA_12_BPC; 1493 break;
1528 break; 1494 case 36:
1529 default: 1495 temp |= TRANS_MSA_12_BPC;
1530 BUG(); 1496 break;
1531 } 1497 default:
1532 I915_WRITE(TRANS_MSA_MISC(cpu_transcoder), temp); 1498 MISSING_CASE(crtc_state->pipe_bpp);
1499 break;
1533 } 1500 }
1501
1502 I915_WRITE(TRANS_MSA_MISC(cpu_transcoder), temp);
1534} 1503}
1535 1504
1536void intel_ddi_set_vc_payload_alloc(const struct intel_crtc_state *crtc_state, 1505void intel_ddi_set_vc_payload_alloc(const struct intel_crtc_state *crtc_state,
@@ -1540,6 +1509,7 @@ void intel_ddi_set_vc_payload_alloc(const struct intel_crtc_state *crtc_state,
1540 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1509 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1541 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 1510 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
1542 uint32_t temp; 1511 uint32_t temp;
1512
1543 temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder)); 1513 temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
1544 if (state == true) 1514 if (state == true)
1545 temp |= TRANS_DDI_DP_VC_PAYLOAD_ALLOC; 1515 temp |= TRANS_DDI_DP_VC_PAYLOAD_ALLOC;
@@ -1555,8 +1525,7 @@ void intel_ddi_enable_transcoder_func(const struct intel_crtc_state *crtc_state)
1555 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1525 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1556 enum pipe pipe = crtc->pipe; 1526 enum pipe pipe = crtc->pipe;
1557 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 1527 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
1558 enum port port = intel_ddi_get_encoder_port(encoder); 1528 enum port port = encoder->port;
1559 int type = encoder->type;
1560 uint32_t temp; 1529 uint32_t temp;
1561 1530
1562 /* Enable TRANS_DDI_FUNC_CTL for the pipe to work in HDMI mode */ 1531 /* Enable TRANS_DDI_FUNC_CTL for the pipe to work in HDMI mode */
@@ -1611,7 +1580,7 @@ void intel_ddi_enable_transcoder_func(const struct intel_crtc_state *crtc_state)
1611 } 1580 }
1612 } 1581 }
1613 1582
1614 if (type == INTEL_OUTPUT_HDMI) { 1583 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
1615 if (crtc_state->has_hdmi_sink) 1584 if (crtc_state->has_hdmi_sink)
1616 temp |= TRANS_DDI_MODE_SELECT_HDMI; 1585 temp |= TRANS_DDI_MODE_SELECT_HDMI;
1617 else 1586 else
@@ -1621,19 +1590,15 @@ void intel_ddi_enable_transcoder_func(const struct intel_crtc_state *crtc_state)
1621 temp |= TRANS_DDI_HDMI_SCRAMBLING_MASK; 1590 temp |= TRANS_DDI_HDMI_SCRAMBLING_MASK;
1622 if (crtc_state->hdmi_high_tmds_clock_ratio) 1591 if (crtc_state->hdmi_high_tmds_clock_ratio)
1623 temp |= TRANS_DDI_HIGH_TMDS_CHAR_RATE; 1592 temp |= TRANS_DDI_HIGH_TMDS_CHAR_RATE;
1624 } else if (type == INTEL_OUTPUT_ANALOG) { 1593 } else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG)) {
1625 temp |= TRANS_DDI_MODE_SELECT_FDI; 1594 temp |= TRANS_DDI_MODE_SELECT_FDI;
1626 temp |= (crtc_state->fdi_lanes - 1) << 1; 1595 temp |= (crtc_state->fdi_lanes - 1) << 1;
1627 } else if (type == INTEL_OUTPUT_DP || 1596 } else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST)) {
1628 type == INTEL_OUTPUT_EDP) {
1629 temp |= TRANS_DDI_MODE_SELECT_DP_SST;
1630 temp |= DDI_PORT_WIDTH(crtc_state->lane_count);
1631 } else if (type == INTEL_OUTPUT_DP_MST) {
1632 temp |= TRANS_DDI_MODE_SELECT_DP_MST; 1597 temp |= TRANS_DDI_MODE_SELECT_DP_MST;
1633 temp |= DDI_PORT_WIDTH(crtc_state->lane_count); 1598 temp |= DDI_PORT_WIDTH(crtc_state->lane_count);
1634 } else { 1599 } else {
1635 WARN(1, "Invalid encoder type %d for pipe %c\n", 1600 temp |= TRANS_DDI_MODE_SELECT_DP_SST;
1636 encoder->type, pipe_name(pipe)); 1601 temp |= DDI_PORT_WIDTH(crtc_state->lane_count);
1637 } 1602 }
1638 1603
1639 I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp); 1604 I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
@@ -1656,7 +1621,7 @@ bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector)
1656 struct drm_i915_private *dev_priv = to_i915(dev); 1621 struct drm_i915_private *dev_priv = to_i915(dev);
1657 struct intel_encoder *encoder = intel_connector->encoder; 1622 struct intel_encoder *encoder = intel_connector->encoder;
1658 int type = intel_connector->base.connector_type; 1623 int type = intel_connector->base.connector_type;
1659 enum port port = intel_ddi_get_encoder_port(encoder); 1624 enum port port = encoder->port;
1660 enum pipe pipe = 0; 1625 enum pipe pipe = 0;
1661 enum transcoder cpu_transcoder; 1626 enum transcoder cpu_transcoder;
1662 uint32_t tmp; 1627 uint32_t tmp;
@@ -1715,9 +1680,9 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
1715{ 1680{
1716 struct drm_device *dev = encoder->base.dev; 1681 struct drm_device *dev = encoder->base.dev;
1717 struct drm_i915_private *dev_priv = to_i915(dev); 1682 struct drm_i915_private *dev_priv = to_i915(dev);
1718 enum port port = intel_ddi_get_encoder_port(encoder); 1683 enum port port = encoder->port;
1684 enum pipe p;
1719 u32 tmp; 1685 u32 tmp;
1720 int i;
1721 bool ret; 1686 bool ret;
1722 1687
1723 if (!intel_display_power_get_if_enabled(dev_priv, 1688 if (!intel_display_power_get_if_enabled(dev_priv,
@@ -1752,15 +1717,17 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
1752 goto out; 1717 goto out;
1753 } 1718 }
1754 1719
1755 for (i = TRANSCODER_A; i <= TRANSCODER_C; i++) { 1720 for_each_pipe(dev_priv, p) {
1756 tmp = I915_READ(TRANS_DDI_FUNC_CTL(i)); 1721 enum transcoder cpu_transcoder = (enum transcoder) p;
1722
1723 tmp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
1757 1724
1758 if ((tmp & TRANS_DDI_PORT_MASK) == TRANS_DDI_SELECT_PORT(port)) { 1725 if ((tmp & TRANS_DDI_PORT_MASK) == TRANS_DDI_SELECT_PORT(port)) {
1759 if ((tmp & TRANS_DDI_MODE_SELECT_MASK) == 1726 if ((tmp & TRANS_DDI_MODE_SELECT_MASK) ==
1760 TRANS_DDI_MODE_SELECT_DP_MST) 1727 TRANS_DDI_MODE_SELECT_DP_MST)
1761 goto out; 1728 goto out;
1762 1729
1763 *pipe = i; 1730 *pipe = p;
1764 ret = true; 1731 ret = true;
1765 1732
1766 goto out; 1733 goto out;
@@ -1800,7 +1767,7 @@ void intel_ddi_enable_pipe_clock(const struct intel_crtc_state *crtc_state)
1800 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc); 1767 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
1801 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1768 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1802 struct intel_encoder *encoder = intel_ddi_get_crtc_encoder(crtc); 1769 struct intel_encoder *encoder = intel_ddi_get_crtc_encoder(crtc);
1803 enum port port = intel_ddi_get_encoder_port(encoder); 1770 enum port port = encoder->port;
1804 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 1771 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
1805 1772
1806 if (cpu_transcoder != TRANSCODER_EDP) 1773 if (cpu_transcoder != TRANSCODER_EDP)
@@ -1836,8 +1803,8 @@ static void skl_ddi_set_iboost(struct intel_encoder *encoder,
1836 int level, enum intel_output_type type) 1803 int level, enum intel_output_type type)
1837{ 1804{
1838 struct intel_digital_port *intel_dig_port = enc_to_dig_port(&encoder->base); 1805 struct intel_digital_port *intel_dig_port = enc_to_dig_port(&encoder->base);
1839 struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev); 1806 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1840 enum port port = intel_dig_port->port; 1807 enum port port = encoder->port;
1841 uint8_t iboost; 1808 uint8_t iboost;
1842 1809
1843 if (type == INTEL_OUTPUT_HDMI) 1810 if (type == INTEL_OUTPUT_HDMI)
@@ -1939,8 +1906,8 @@ static void cnl_ddi_vswing_program(struct intel_encoder *encoder,
1939 int level, enum intel_output_type type) 1906 int level, enum intel_output_type type)
1940{ 1907{
1941 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1908 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1942 enum port port = intel_ddi_get_encoder_port(encoder);
1943 const struct cnl_ddi_buf_trans *ddi_translations; 1909 const struct cnl_ddi_buf_trans *ddi_translations;
1910 enum port port = encoder->port;
1944 int n_entries, ln; 1911 int n_entries, ln;
1945 u32 val; 1912 u32 val;
1946 1913
@@ -2003,7 +1970,7 @@ static void cnl_ddi_vswing_sequence(struct intel_encoder *encoder,
2003 int level, enum intel_output_type type) 1970 int level, enum intel_output_type type)
2004{ 1971{
2005 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1972 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2006 enum port port = intel_ddi_get_encoder_port(encoder); 1973 enum port port = encoder->port;
2007 int width, rate, ln; 1974 int width, rate, ln;
2008 u32 val; 1975 u32 val;
2009 1976
@@ -2122,7 +2089,7 @@ static void intel_ddi_clk_select(struct intel_encoder *encoder,
2122 const struct intel_shared_dpll *pll) 2089 const struct intel_shared_dpll *pll)
2123{ 2090{
2124 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 2091 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2125 enum port port = intel_ddi_get_encoder_port(encoder); 2092 enum port port = encoder->port;
2126 uint32_t val; 2093 uint32_t val;
2127 2094
2128 if (WARN_ON(!pll)) 2095 if (WARN_ON(!pll))
@@ -2161,7 +2128,7 @@ static void intel_ddi_clk_select(struct intel_encoder *encoder,
2161static void intel_ddi_clk_disable(struct intel_encoder *encoder) 2128static void intel_ddi_clk_disable(struct intel_encoder *encoder)
2162{ 2129{
2163 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 2130 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2164 enum port port = intel_ddi_get_encoder_port(encoder); 2131 enum port port = encoder->port;
2165 2132
2166 if (IS_CANNONLAKE(dev_priv)) 2133 if (IS_CANNONLAKE(dev_priv))
2167 I915_WRITE(DPCLKA_CFGCR0, I915_READ(DPCLKA_CFGCR0) | 2134 I915_WRITE(DPCLKA_CFGCR0, I915_READ(DPCLKA_CFGCR0) |
@@ -2179,7 +2146,7 @@ static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
2179{ 2146{
2180 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); 2147 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2181 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 2148 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2182 enum port port = intel_ddi_get_encoder_port(encoder); 2149 enum port port = encoder->port;
2183 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); 2150 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
2184 bool is_mst = intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST); 2151 bool is_mst = intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST);
2185 int level = intel_ddi_dp_level(intel_dp); 2152 int level = intel_ddi_dp_level(intel_dp);
@@ -2200,7 +2167,7 @@ static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
2200 else if (IS_GEN9_LP(dev_priv)) 2167 else if (IS_GEN9_LP(dev_priv))
2201 bxt_ddi_vswing_sequence(encoder, level, encoder->type); 2168 bxt_ddi_vswing_sequence(encoder, level, encoder->type);
2202 else 2169 else
2203 intel_prepare_dp_ddi_buffers(encoder); 2170 intel_prepare_dp_ddi_buffers(encoder, crtc_state);
2204 2171
2205 intel_ddi_init_dp_buf_reg(encoder); 2172 intel_ddi_init_dp_buf_reg(encoder);
2206 if (!is_mst) 2173 if (!is_mst)
@@ -2217,7 +2184,7 @@ static void intel_ddi_pre_enable_hdmi(struct intel_encoder *encoder,
2217 struct intel_digital_port *intel_dig_port = enc_to_dig_port(&encoder->base); 2184 struct intel_digital_port *intel_dig_port = enc_to_dig_port(&encoder->base);
2218 struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi; 2185 struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
2219 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 2186 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2220 enum port port = intel_ddi_get_encoder_port(encoder); 2187 enum port port = encoder->port;
2221 int level = intel_ddi_hdmi_level(dev_priv, port); 2188 int level = intel_ddi_hdmi_level(dev_priv, port);
2222 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); 2189 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
2223 2190
@@ -2249,6 +2216,19 @@ static void intel_ddi_pre_enable(struct intel_encoder *encoder,
2249 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 2216 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
2250 enum pipe pipe = crtc->pipe; 2217 enum pipe pipe = crtc->pipe;
2251 2218
2219 /*
2220 * When called from DP MST code:
2221 * - conn_state will be NULL
2222 * - encoder will be the main encoder (ie. mst->primary)
2223 * - the main connector associated with this port
2224 * won't be active or linked to a crtc
2225 * - crtc_state will be the state of the first stream to
2226 * be activated on this port, and it may not be the same
2227 * stream that will be deactivated last, but each stream
2228 * should have a state that is identical when it comes to
2229 * the DP link parameteres
2230 */
2231
2252 WARN_ON(crtc_state->has_pch_encoder); 2232 WARN_ON(crtc_state->has_pch_encoder);
2253 2233
2254 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true); 2234 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
@@ -2262,7 +2242,7 @@ static void intel_ddi_pre_enable(struct intel_encoder *encoder,
2262static void intel_disable_ddi_buf(struct intel_encoder *encoder) 2242static void intel_disable_ddi_buf(struct intel_encoder *encoder)
2263{ 2243{
2264 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 2244 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2265 enum port port = intel_ddi_get_encoder_port(encoder); 2245 enum port port = encoder->port;
2266 bool wait = false; 2246 bool wait = false;
2267 u32 val; 2247 u32 val;
2268 2248
@@ -2289,12 +2269,7 @@ static void intel_ddi_post_disable_dp(struct intel_encoder *encoder,
2289 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 2269 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2290 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); 2270 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
2291 struct intel_dp *intel_dp = &dig_port->dp; 2271 struct intel_dp *intel_dp = &dig_port->dp;
2292 /* 2272 bool is_mst = intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST);
2293 * old_crtc_state and old_conn_state are NULL when called from
2294 * DP_MST. The main connector associated with this port is never
2295 * bound to a crtc for MST.
2296 */
2297 bool is_mst = !old_crtc_state;
2298 2273
2299 /* 2274 /*
2300 * Power down sink before disabling the port, otherwise we end 2275 * Power down sink before disabling the port, otherwise we end
@@ -2338,12 +2313,19 @@ static void intel_ddi_post_disable(struct intel_encoder *encoder,
2338 const struct drm_connector_state *old_conn_state) 2313 const struct drm_connector_state *old_conn_state)
2339{ 2314{
2340 /* 2315 /*
2341 * old_crtc_state and old_conn_state are NULL when called from 2316 * When called from DP MST code:
2342 * DP_MST. The main connector associated with this port is never 2317 * - old_conn_state will be NULL
2343 * bound to a crtc for MST. 2318 * - encoder will be the main encoder (ie. mst->primary)
2319 * - the main connector associated with this port
2320 * won't be active or linked to a crtc
2321 * - old_crtc_state will be the state of the last stream to
2322 * be deactivated on this port, and it may not be the same
2323 * stream that was activated last, but each stream
2324 * should have a state that is identical when it comes to
2325 * the DP link parameteres
2344 */ 2326 */
2345 if (old_crtc_state && 2327
2346 intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_HDMI)) 2328 if (intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_HDMI))
2347 intel_ddi_post_disable_hdmi(encoder, 2329 intel_ddi_post_disable_hdmi(encoder,
2348 old_crtc_state, old_conn_state); 2330 old_crtc_state, old_conn_state);
2349 else 2331 else
@@ -2391,7 +2373,7 @@ static void intel_enable_ddi_dp(struct intel_encoder *encoder,
2391{ 2373{
2392 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 2374 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2393 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); 2375 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2394 enum port port = intel_ddi_get_encoder_port(encoder); 2376 enum port port = encoder->port;
2395 2377
2396 if (port == PORT_A && INTEL_GEN(dev_priv) < 9) 2378 if (port == PORT_A && INTEL_GEN(dev_priv) < 9)
2397 intel_dp_stop_link_train(intel_dp); 2379 intel_dp_stop_link_train(intel_dp);
@@ -2410,7 +2392,7 @@ static void intel_enable_ddi_hdmi(struct intel_encoder *encoder,
2410{ 2392{
2411 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 2393 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2412 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); 2394 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
2413 enum port port = intel_ddi_get_encoder_port(encoder); 2395 enum port port = encoder->port;
2414 2396
2415 intel_hdmi_handle_sink_scrambling(encoder, 2397 intel_hdmi_handle_sink_scrambling(encoder,
2416 conn_state->connector, 2398 conn_state->connector,
@@ -2445,7 +2427,8 @@ static void intel_disable_ddi_dp(struct intel_encoder *encoder,
2445 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); 2427 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2446 2428
2447 if (old_crtc_state->has_audio) 2429 if (old_crtc_state->has_audio)
2448 intel_audio_codec_disable(encoder); 2430 intel_audio_codec_disable(encoder,
2431 old_crtc_state, old_conn_state);
2449 2432
2450 intel_edp_drrs_disable(intel_dp, old_crtc_state); 2433 intel_edp_drrs_disable(intel_dp, old_crtc_state);
2451 intel_psr_disable(intel_dp, old_crtc_state); 2434 intel_psr_disable(intel_dp, old_crtc_state);
@@ -2457,7 +2440,8 @@ static void intel_disable_ddi_hdmi(struct intel_encoder *encoder,
2457 const struct drm_connector_state *old_conn_state) 2440 const struct drm_connector_state *old_conn_state)
2458{ 2441{
2459 if (old_crtc_state->has_audio) 2442 if (old_crtc_state->has_audio)
2460 intel_audio_codec_disable(encoder); 2443 intel_audio_codec_disable(encoder,
2444 old_crtc_state, old_conn_state);
2461 2445
2462 intel_hdmi_handle_sink_scrambling(encoder, 2446 intel_hdmi_handle_sink_scrambling(encoder,
2463 old_conn_state->connector, 2447 old_conn_state->connector,
@@ -2488,7 +2472,7 @@ void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp)
2488 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); 2472 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2489 struct drm_i915_private *dev_priv = 2473 struct drm_i915_private *dev_priv =
2490 to_i915(intel_dig_port->base.base.dev); 2474 to_i915(intel_dig_port->base.base.dev);
2491 enum port port = intel_dig_port->port; 2475 enum port port = intel_dig_port->base.port;
2492 uint32_t val; 2476 uint32_t val;
2493 bool wait = false; 2477 bool wait = false;
2494 2478
@@ -2542,11 +2526,18 @@ bool intel_ddi_is_audio_enabled(struct drm_i915_private *dev_priv,
2542 return false; 2526 return false;
2543} 2527}
2544 2528
2529void intel_ddi_compute_min_voltage_level(struct drm_i915_private *dev_priv,
2530 struct intel_crtc_state *crtc_state)
2531{
2532 if (IS_CANNONLAKE(dev_priv) && crtc_state->port_clock > 594000)
2533 crtc_state->min_voltage_level = 2;
2534}
2535
2545void intel_ddi_get_config(struct intel_encoder *encoder, 2536void intel_ddi_get_config(struct intel_encoder *encoder,
2546 struct intel_crtc_state *pipe_config) 2537 struct intel_crtc_state *pipe_config)
2547{ 2538{
2548 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 2539 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2549 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc); 2540 struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->base.crtc);
2550 enum transcoder cpu_transcoder = pipe_config->cpu_transcoder; 2541 enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
2551 struct intel_digital_port *intel_dig_port; 2542 struct intel_digital_port *intel_dig_port;
2552 u32 temp, flags = 0; 2543 u32 temp, flags = 0;
@@ -2599,12 +2590,23 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
2599 pipe_config->hdmi_high_tmds_clock_ratio = true; 2590 pipe_config->hdmi_high_tmds_clock_ratio = true;
2600 /* fall through */ 2591 /* fall through */
2601 case TRANS_DDI_MODE_SELECT_DVI: 2592 case TRANS_DDI_MODE_SELECT_DVI:
2593 pipe_config->output_types |= BIT(INTEL_OUTPUT_HDMI);
2602 pipe_config->lane_count = 4; 2594 pipe_config->lane_count = 4;
2603 break; 2595 break;
2604 case TRANS_DDI_MODE_SELECT_FDI: 2596 case TRANS_DDI_MODE_SELECT_FDI:
2597 pipe_config->output_types |= BIT(INTEL_OUTPUT_ANALOG);
2605 break; 2598 break;
2606 case TRANS_DDI_MODE_SELECT_DP_SST: 2599 case TRANS_DDI_MODE_SELECT_DP_SST:
2600 if (encoder->type == INTEL_OUTPUT_EDP)
2601 pipe_config->output_types |= BIT(INTEL_OUTPUT_EDP);
2602 else
2603 pipe_config->output_types |= BIT(INTEL_OUTPUT_DP);
2604 pipe_config->lane_count =
2605 ((temp & DDI_PORT_WIDTH_MASK) >> DDI_PORT_WIDTH_SHIFT) + 1;
2606 intel_dp_get_m_n(intel_crtc, pipe_config);
2607 break;
2607 case TRANS_DDI_MODE_SELECT_DP_MST: 2608 case TRANS_DDI_MODE_SELECT_DP_MST:
2609 pipe_config->output_types |= BIT(INTEL_OUTPUT_DP_MST);
2608 pipe_config->lane_count = 2610 pipe_config->lane_count =
2609 ((temp & DDI_PORT_WIDTH_MASK) >> DDI_PORT_WIDTH_SHIFT) + 1; 2611 ((temp & DDI_PORT_WIDTH_MASK) >> DDI_PORT_WIDTH_SHIFT) + 1;
2610 intel_dp_get_m_n(intel_crtc, pipe_config); 2612 intel_dp_get_m_n(intel_crtc, pipe_config);
@@ -2641,6 +2643,26 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
2641 if (IS_GEN9_LP(dev_priv)) 2643 if (IS_GEN9_LP(dev_priv))
2642 pipe_config->lane_lat_optim_mask = 2644 pipe_config->lane_lat_optim_mask =
2643 bxt_ddi_phy_get_lane_lat_optim_mask(encoder); 2645 bxt_ddi_phy_get_lane_lat_optim_mask(encoder);
2646
2647 intel_ddi_compute_min_voltage_level(dev_priv, pipe_config);
2648}
2649
2650static enum intel_output_type
2651intel_ddi_compute_output_type(struct intel_encoder *encoder,
2652 struct intel_crtc_state *crtc_state,
2653 struct drm_connector_state *conn_state)
2654{
2655 switch (conn_state->connector->connector_type) {
2656 case DRM_MODE_CONNECTOR_HDMIA:
2657 return INTEL_OUTPUT_HDMI;
2658 case DRM_MODE_CONNECTOR_eDP:
2659 return INTEL_OUTPUT_EDP;
2660 case DRM_MODE_CONNECTOR_DisplayPort:
2661 return INTEL_OUTPUT_DP;
2662 default:
2663 MISSING_CASE(conn_state->connector->connector_type);
2664 return INTEL_OUTPUT_UNUSED;
2665 }
2644} 2666}
2645 2667
2646static bool intel_ddi_compute_config(struct intel_encoder *encoder, 2668static bool intel_ddi_compute_config(struct intel_encoder *encoder,
@@ -2648,24 +2670,22 @@ static bool intel_ddi_compute_config(struct intel_encoder *encoder,
2648 struct drm_connector_state *conn_state) 2670 struct drm_connector_state *conn_state)
2649{ 2671{
2650 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 2672 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2651 int type = encoder->type; 2673 enum port port = encoder->port;
2652 int port = intel_ddi_get_encoder_port(encoder);
2653 int ret; 2674 int ret;
2654 2675
2655 WARN(type == INTEL_OUTPUT_UNKNOWN, "compute_config() on unknown output!\n");
2656
2657 if (port == PORT_A) 2676 if (port == PORT_A)
2658 pipe_config->cpu_transcoder = TRANSCODER_EDP; 2677 pipe_config->cpu_transcoder = TRANSCODER_EDP;
2659 2678
2660 if (type == INTEL_OUTPUT_HDMI) 2679 if (intel_crtc_has_type(pipe_config, INTEL_OUTPUT_HDMI))
2661 ret = intel_hdmi_compute_config(encoder, pipe_config, conn_state); 2680 ret = intel_hdmi_compute_config(encoder, pipe_config, conn_state);
2662 else 2681 else
2663 ret = intel_dp_compute_config(encoder, pipe_config, conn_state); 2682 ret = intel_dp_compute_config(encoder, pipe_config, conn_state);
2664 2683
2665 if (IS_GEN9_LP(dev_priv) && ret) 2684 if (IS_GEN9_LP(dev_priv) && ret)
2666 pipe_config->lane_lat_optim_mask = 2685 pipe_config->lane_lat_optim_mask =
2667 bxt_ddi_phy_calc_lane_lat_optim_mask(encoder, 2686 bxt_ddi_phy_calc_lane_lat_optim_mask(pipe_config->lane_count);
2668 pipe_config->lane_count); 2687
2688 intel_ddi_compute_min_voltage_level(dev_priv, pipe_config);
2669 2689
2670 return ret; 2690 return ret;
2671 2691
@@ -2680,7 +2700,7 @@ static struct intel_connector *
2680intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port) 2700intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port)
2681{ 2701{
2682 struct intel_connector *connector; 2702 struct intel_connector *connector;
2683 enum port port = intel_dig_port->port; 2703 enum port port = intel_dig_port->base.port;
2684 2704
2685 connector = intel_connector_alloc(); 2705 connector = intel_connector_alloc();
2686 if (!connector) 2706 if (!connector)
@@ -2699,7 +2719,7 @@ static struct intel_connector *
2699intel_ddi_init_hdmi_connector(struct intel_digital_port *intel_dig_port) 2719intel_ddi_init_hdmi_connector(struct intel_digital_port *intel_dig_port)
2700{ 2720{
2701 struct intel_connector *connector; 2721 struct intel_connector *connector;
2702 enum port port = intel_dig_port->port; 2722 enum port port = intel_dig_port->base.port;
2703 2723
2704 connector = intel_connector_alloc(); 2724 connector = intel_connector_alloc();
2705 if (!connector) 2725 if (!connector)
@@ -2711,6 +2731,34 @@ intel_ddi_init_hdmi_connector(struct intel_digital_port *intel_dig_port)
2711 return connector; 2731 return connector;
2712} 2732}
2713 2733
2734static bool intel_ddi_a_force_4_lanes(struct intel_digital_port *dport)
2735{
2736 struct drm_i915_private *dev_priv = to_i915(dport->base.base.dev);
2737
2738 if (dport->base.port != PORT_A)
2739 return false;
2740
2741 if (dport->saved_port_bits & DDI_A_4_LANES)
2742 return false;
2743
2744 /* Broxton/Geminilake: Bspec says that DDI_A_4_LANES is the only
2745 * supported configuration
2746 */
2747 if (IS_GEN9_LP(dev_priv))
2748 return true;
2749
2750 /* Cannonlake: Most of SKUs don't support DDI_E, and the only
2751 * one who does also have a full A/E split called
2752 * DDI_F what makes DDI_E useless. However for this
2753 * case let's trust VBT info.
2754 */
2755 if (IS_CANNONLAKE(dev_priv) &&
2756 !intel_bios_is_port_present(dev_priv, PORT_E))
2757 return true;
2758
2759 return false;
2760}
2761
2714void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) 2762void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
2715{ 2763{
2716 struct intel_digital_port *intel_dig_port; 2764 struct intel_digital_port *intel_dig_port;
@@ -2777,6 +2825,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
2777 drm_encoder_init(&dev_priv->drm, encoder, &intel_ddi_funcs, 2825 drm_encoder_init(&dev_priv->drm, encoder, &intel_ddi_funcs,
2778 DRM_MODE_ENCODER_TMDS, "DDI %c", port_name(port)); 2826 DRM_MODE_ENCODER_TMDS, "DDI %c", port_name(port));
2779 2827
2828 intel_encoder->compute_output_type = intel_ddi_compute_output_type;
2780 intel_encoder->compute_config = intel_ddi_compute_config; 2829 intel_encoder->compute_config = intel_ddi_compute_config;
2781 intel_encoder->enable = intel_enable_ddi; 2830 intel_encoder->enable = intel_enable_ddi;
2782 if (IS_GEN9_LP(dev_priv)) 2831 if (IS_GEN9_LP(dev_priv))
@@ -2789,7 +2838,6 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
2789 intel_encoder->suspend = intel_dp_encoder_suspend; 2838 intel_encoder->suspend = intel_dp_encoder_suspend;
2790 intel_encoder->get_power_domains = intel_ddi_get_power_domains; 2839 intel_encoder->get_power_domains = intel_ddi_get_power_domains;
2791 2840
2792 intel_dig_port->port = port;
2793 intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) & 2841 intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) &
2794 (DDI_BUF_PORT_REVERSAL | 2842 (DDI_BUF_PORT_REVERSAL |
2795 DDI_A_4_LANES); 2843 DDI_A_4_LANES);
@@ -2820,23 +2868,20 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
2820 } 2868 }
2821 2869
2822 /* 2870 /*
2823 * Bspec says that DDI_A_4_LANES is the only supported configuration 2871 * Some BIOS might fail to set this bit on port A if eDP
2824 * for Broxton. Yet some BIOS fail to set this bit on port A if eDP 2872 * wasn't lit up at boot. Force this bit set when needed
2825 * wasn't lit up at boot. Force this bit on in our internal 2873 * so we use the proper lane count for our calculations.
2826 * configuration so that we use the proper lane count for our
2827 * calculations.
2828 */ 2874 */
2829 if (IS_GEN9_LP(dev_priv) && port == PORT_A) { 2875 if (intel_ddi_a_force_4_lanes(intel_dig_port)) {
2830 if (!(intel_dig_port->saved_port_bits & DDI_A_4_LANES)) { 2876 DRM_DEBUG_KMS("Forcing DDI_A_4_LANES for port A\n");
2831 DRM_DEBUG_KMS("BXT BIOS forgot to set DDI_A_4_LANES for port A; fixing\n"); 2877 intel_dig_port->saved_port_bits |= DDI_A_4_LANES;
2832 intel_dig_port->saved_port_bits |= DDI_A_4_LANES; 2878 max_lanes = 4;
2833 max_lanes = 4;
2834 }
2835 } 2879 }
2836 2880
2881 intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
2837 intel_dig_port->max_lanes = max_lanes; 2882 intel_dig_port->max_lanes = max_lanes;
2838 2883
2839 intel_encoder->type = INTEL_OUTPUT_UNKNOWN; 2884 intel_encoder->type = INTEL_OUTPUT_DDI;
2840 intel_encoder->power_domain = intel_port_to_power_domain(port); 2885 intel_encoder->power_domain = intel_port_to_power_domain(port);
2841 intel_encoder->port = port; 2886 intel_encoder->port = port;
2842 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2); 2887 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);