diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ddi.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_ddi.c | 323 |
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 | ||
495 | enum 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 | |||
513 | static const struct ddi_buf_trans * | 495 | static const struct ddi_buf_trans * |
514 | bdw_get_buf_trans_edp(struct drm_i915_private *dev_priv, int *n_entries) | 496 | bdw_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 | */ |
814 | static void intel_prepare_dp_ddi_buffers(struct intel_encoder *encoder) | 796 | static 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 | ||
1451 | static int bxt_calc_pll_link(struct drm_i915_private *dev_priv, | 1426 | static 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 | ||
1476 | static void bxt_ddi_clock_get(struct intel_encoder *encoder, | 1448 | static 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 | ||
1488 | void intel_ddi_clock_get(struct intel_encoder *encoder, | 1456 | static 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 | ||
1536 | void intel_ddi_set_vc_payload_alloc(const struct intel_crtc_state *crtc_state, | 1505 | void 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, | |||
2161 | static void intel_ddi_clk_disable(struct intel_encoder *encoder) | 2128 | static 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, | |||
2262 | static void intel_disable_ddi_buf(struct intel_encoder *encoder) | 2242 | static 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 | ||
2529 | void 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 | |||
2545 | void intel_ddi_get_config(struct intel_encoder *encoder, | 2536 | void 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 | |||
2650 | static enum intel_output_type | ||
2651 | intel_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 | ||
2646 | static bool intel_ddi_compute_config(struct intel_encoder *encoder, | 2668 | static 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 * | |||
2680 | intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port) | 2700 | intel_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 * | |||
2699 | intel_ddi_init_hdmi_connector(struct intel_digital_port *intel_dig_port) | 2719 | intel_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 | ||
2734 | static 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 | |||
2714 | void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) | 2762 | void 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); |