diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 76 |
1 files changed, 62 insertions, 14 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index a0dad1a2f819..2a00cb828d20 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -105,7 +105,8 @@ intel_dp_max_link_bw(struct intel_dp *intel_dp) | |||
105 | case DP_LINK_BW_2_7: | 105 | case DP_LINK_BW_2_7: |
106 | break; | 106 | break; |
107 | case DP_LINK_BW_5_4: /* 1.2 capable displays may advertise higher bw */ | 107 | case DP_LINK_BW_5_4: /* 1.2 capable displays may advertise higher bw */ |
108 | if ((IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8) && | 108 | if (((IS_HASWELL(dev) && !IS_HSW_ULX(dev)) || |
109 | INTEL_INFO(dev)->gen >= 8) && | ||
109 | intel_dp->dpcd[DP_DPCD_REV] >= 0x12) | 110 | intel_dp->dpcd[DP_DPCD_REV] >= 0x12) |
110 | max_link_bw = DP_LINK_BW_5_4; | 111 | max_link_bw = DP_LINK_BW_5_4; |
111 | else | 112 | else |
@@ -120,6 +121,22 @@ intel_dp_max_link_bw(struct intel_dp *intel_dp) | |||
120 | return max_link_bw; | 121 | return max_link_bw; |
121 | } | 122 | } |
122 | 123 | ||
124 | static u8 intel_dp_max_lane_count(struct intel_dp *intel_dp) | ||
125 | { | ||
126 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | ||
127 | struct drm_device *dev = intel_dig_port->base.base.dev; | ||
128 | u8 source_max, sink_max; | ||
129 | |||
130 | source_max = 4; | ||
131 | if (HAS_DDI(dev) && intel_dig_port->port == PORT_A && | ||
132 | (intel_dig_port->saved_port_bits & DDI_A_4_LANES) == 0) | ||
133 | source_max = 2; | ||
134 | |||
135 | sink_max = drm_dp_max_lane_count(intel_dp->dpcd); | ||
136 | |||
137 | return min(source_max, sink_max); | ||
138 | } | ||
139 | |||
123 | /* | 140 | /* |
124 | * The units on the numbers in the next two are... bizarre. Examples will | 141 | * The units on the numbers in the next two are... bizarre. Examples will |
125 | * make it clearer; this one parallels an example in the eDP spec. | 142 | * make it clearer; this one parallels an example in the eDP spec. |
@@ -170,7 +187,7 @@ intel_dp_mode_valid(struct drm_connector *connector, | |||
170 | } | 187 | } |
171 | 188 | ||
172 | max_link_clock = drm_dp_bw_code_to_link_rate(intel_dp_max_link_bw(intel_dp)); | 189 | max_link_clock = drm_dp_bw_code_to_link_rate(intel_dp_max_link_bw(intel_dp)); |
173 | max_lanes = drm_dp_max_lane_count(intel_dp->dpcd); | 190 | max_lanes = intel_dp_max_lane_count(intel_dp); |
174 | 191 | ||
175 | max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes); | 192 | max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes); |
176 | mode_rate = intel_dp_link_required(target_clock, 18); | 193 | mode_rate = intel_dp_link_required(target_clock, 18); |
@@ -575,7 +592,8 @@ out: | |||
575 | return ret; | 592 | return ret; |
576 | } | 593 | } |
577 | 594 | ||
578 | #define HEADER_SIZE 4 | 595 | #define BARE_ADDRESS_SIZE 3 |
596 | #define HEADER_SIZE (BARE_ADDRESS_SIZE + 1) | ||
579 | static ssize_t | 597 | static ssize_t |
580 | intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg) | 598 | intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg) |
581 | { | 599 | { |
@@ -592,7 +610,7 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg) | |||
592 | switch (msg->request & ~DP_AUX_I2C_MOT) { | 610 | switch (msg->request & ~DP_AUX_I2C_MOT) { |
593 | case DP_AUX_NATIVE_WRITE: | 611 | case DP_AUX_NATIVE_WRITE: |
594 | case DP_AUX_I2C_WRITE: | 612 | case DP_AUX_I2C_WRITE: |
595 | txsize = HEADER_SIZE + msg->size; | 613 | txsize = msg->size ? HEADER_SIZE + msg->size : BARE_ADDRESS_SIZE; |
596 | rxsize = 1; | 614 | rxsize = 1; |
597 | 615 | ||
598 | if (WARN_ON(txsize > 20)) | 616 | if (WARN_ON(txsize > 20)) |
@@ -611,7 +629,7 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg) | |||
611 | 629 | ||
612 | case DP_AUX_NATIVE_READ: | 630 | case DP_AUX_NATIVE_READ: |
613 | case DP_AUX_I2C_READ: | 631 | case DP_AUX_I2C_READ: |
614 | txsize = HEADER_SIZE; | 632 | txsize = msg->size ? HEADER_SIZE : BARE_ADDRESS_SIZE; |
615 | rxsize = msg->size + 1; | 633 | rxsize = msg->size + 1; |
616 | 634 | ||
617 | if (WARN_ON(rxsize > 20)) | 635 | if (WARN_ON(rxsize > 20)) |
@@ -749,8 +767,10 @@ intel_dp_compute_config(struct intel_encoder *encoder, | |||
749 | struct intel_crtc *intel_crtc = encoder->new_crtc; | 767 | struct intel_crtc *intel_crtc = encoder->new_crtc; |
750 | struct intel_connector *intel_connector = intel_dp->attached_connector; | 768 | struct intel_connector *intel_connector = intel_dp->attached_connector; |
751 | int lane_count, clock; | 769 | int lane_count, clock; |
752 | int max_lane_count = drm_dp_max_lane_count(intel_dp->dpcd); | 770 | int min_lane_count = 1; |
771 | int max_lane_count = intel_dp_max_lane_count(intel_dp); | ||
753 | /* Conveniently, the link BW constants become indices with a shift...*/ | 772 | /* Conveniently, the link BW constants become indices with a shift...*/ |
773 | int min_clock = 0; | ||
754 | int max_clock = intel_dp_max_link_bw(intel_dp) >> 3; | 774 | int max_clock = intel_dp_max_link_bw(intel_dp) >> 3; |
755 | int bpp, mode_rate; | 775 | int bpp, mode_rate; |
756 | static int bws[] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7, DP_LINK_BW_5_4 }; | 776 | static int bws[] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7, DP_LINK_BW_5_4 }; |
@@ -783,19 +803,38 @@ intel_dp_compute_config(struct intel_encoder *encoder, | |||
783 | /* Walk through all bpp values. Luckily they're all nicely spaced with 2 | 803 | /* Walk through all bpp values. Luckily they're all nicely spaced with 2 |
784 | * bpc in between. */ | 804 | * bpc in between. */ |
785 | bpp = pipe_config->pipe_bpp; | 805 | bpp = pipe_config->pipe_bpp; |
786 | if (is_edp(intel_dp) && dev_priv->vbt.edp_bpp && | 806 | if (is_edp(intel_dp)) { |
787 | dev_priv->vbt.edp_bpp < bpp) { | 807 | if (dev_priv->vbt.edp_bpp && dev_priv->vbt.edp_bpp < bpp) { |
788 | DRM_DEBUG_KMS("clamping bpp for eDP panel to BIOS-provided %i\n", | 808 | DRM_DEBUG_KMS("clamping bpp for eDP panel to BIOS-provided %i\n", |
789 | dev_priv->vbt.edp_bpp); | 809 | dev_priv->vbt.edp_bpp); |
790 | bpp = dev_priv->vbt.edp_bpp; | 810 | bpp = dev_priv->vbt.edp_bpp; |
811 | } | ||
812 | |||
813 | if (IS_BROADWELL(dev)) { | ||
814 | /* Yes, it's an ugly hack. */ | ||
815 | min_lane_count = max_lane_count; | ||
816 | DRM_DEBUG_KMS("forcing lane count to max (%u) on BDW\n", | ||
817 | min_lane_count); | ||
818 | } else if (dev_priv->vbt.edp_lanes) { | ||
819 | min_lane_count = min(dev_priv->vbt.edp_lanes, | ||
820 | max_lane_count); | ||
821 | DRM_DEBUG_KMS("using min %u lanes per VBT\n", | ||
822 | min_lane_count); | ||
823 | } | ||
824 | |||
825 | if (dev_priv->vbt.edp_rate) { | ||
826 | min_clock = min(dev_priv->vbt.edp_rate >> 3, max_clock); | ||
827 | DRM_DEBUG_KMS("using min %02x link bw per VBT\n", | ||
828 | bws[min_clock]); | ||
829 | } | ||
791 | } | 830 | } |
792 | 831 | ||
793 | for (; bpp >= 6*3; bpp -= 2*3) { | 832 | for (; bpp >= 6*3; bpp -= 2*3) { |
794 | mode_rate = intel_dp_link_required(adjusted_mode->crtc_clock, | 833 | mode_rate = intel_dp_link_required(adjusted_mode->crtc_clock, |
795 | bpp); | 834 | bpp); |
796 | 835 | ||
797 | for (lane_count = 1; lane_count <= max_lane_count; lane_count <<= 1) { | 836 | for (lane_count = min_lane_count; lane_count <= max_lane_count; lane_count <<= 1) { |
798 | for (clock = 0; clock <= max_clock; clock++) { | 837 | for (clock = min_clock; clock <= max_clock; clock++) { |
799 | link_clock = drm_dp_bw_code_to_link_rate(bws[clock]); | 838 | link_clock = drm_dp_bw_code_to_link_rate(bws[clock]); |
800 | link_avail = intel_dp_max_data_rate(link_clock, | 839 | link_avail = intel_dp_max_data_rate(link_clock, |
801 | lane_count); | 840 | lane_count); |
@@ -3618,7 +3657,8 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, | |||
3618 | { | 3657 | { |
3619 | struct drm_connector *connector = &intel_connector->base; | 3658 | struct drm_connector *connector = &intel_connector->base; |
3620 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 3659 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
3621 | struct drm_device *dev = intel_dig_port->base.base.dev; | 3660 | struct intel_encoder *intel_encoder = &intel_dig_port->base; |
3661 | struct drm_device *dev = intel_encoder->base.dev; | ||
3622 | struct drm_i915_private *dev_priv = dev->dev_private; | 3662 | struct drm_i915_private *dev_priv = dev->dev_private; |
3623 | struct drm_display_mode *fixed_mode = NULL; | 3663 | struct drm_display_mode *fixed_mode = NULL; |
3624 | bool has_dpcd; | 3664 | bool has_dpcd; |
@@ -3628,6 +3668,14 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, | |||
3628 | if (!is_edp(intel_dp)) | 3668 | if (!is_edp(intel_dp)) |
3629 | return true; | 3669 | return true; |
3630 | 3670 | ||
3671 | /* The VDD bit needs a power domain reference, so if the bit is already | ||
3672 | * enabled when we boot, grab this reference. */ | ||
3673 | if (edp_have_panel_vdd(intel_dp)) { | ||
3674 | enum intel_display_power_domain power_domain; | ||
3675 | power_domain = intel_display_port_power_domain(intel_encoder); | ||
3676 | intel_display_power_get(dev_priv, power_domain); | ||
3677 | } | ||
3678 | |||
3631 | /* Cache DPCD and EDID for edp. */ | 3679 | /* Cache DPCD and EDID for edp. */ |
3632 | intel_edp_panel_vdd_on(intel_dp); | 3680 | intel_edp_panel_vdd_on(intel_dp); |
3633 | has_dpcd = intel_dp_get_dpcd(intel_dp); | 3681 | has_dpcd = intel_dp_get_dpcd(intel_dp); |