aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorTodd Previte <tprevite@gmail.com>2014-01-20 12:19:39 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-01-24 11:22:54 -0500
commit06ea66b6bb445043dc25a9626254d5c130093199 (patch)
tree6b1f5fae491f0862b6596f2a25d0aa868623a34c /drivers/gpu
parentca6ad02523972b331f862161eff93e1a62f34d32 (diff)
drm/i915: Enable 5.4Ghz (HBR2) link rate for Displayport 1.2-capable devices
For HSW+ platforms, enable the 5.4Ghz (HBR2) link rate for devices that support it. The sink device must report that is supports Displayport 1.2 and the HBR2 bit rate in the DPCD in order to use HBR2. Signed-off-by: Todd Previte <tprevite@gmail.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c31
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h1
2 files changed, 26 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index b60bc384c29e..45ec1a85451b 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -98,13 +98,18 @@ static int
98intel_dp_max_link_bw(struct intel_dp *intel_dp) 98intel_dp_max_link_bw(struct intel_dp *intel_dp)
99{ 99{
100 int max_link_bw = intel_dp->dpcd[DP_MAX_LINK_RATE]; 100 int max_link_bw = intel_dp->dpcd[DP_MAX_LINK_RATE];
101 struct drm_device *dev = intel_dp->attached_connector->base.dev;
101 102
102 switch (max_link_bw) { 103 switch (max_link_bw) {
103 case DP_LINK_BW_1_62: 104 case DP_LINK_BW_1_62:
104 case DP_LINK_BW_2_7: 105 case DP_LINK_BW_2_7:
105 break; 106 break;
106 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 */
107 max_link_bw = DP_LINK_BW_2_7; 108 if ((IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8) &&
109 intel_dp->dpcd[DP_DPCD_REV] >= 0x12)
110 max_link_bw = DP_LINK_BW_5_4;
111 else
112 max_link_bw = DP_LINK_BW_2_7;
108 break; 113 break;
109 default: 114 default:
110 WARN(1, "invalid max DP link bw val %x, using 1.62Gbps\n", 115 WARN(1, "invalid max DP link bw val %x, using 1.62Gbps\n",
@@ -807,9 +812,10 @@ intel_dp_compute_config(struct intel_encoder *encoder,
807 struct intel_connector *intel_connector = intel_dp->attached_connector; 812 struct intel_connector *intel_connector = intel_dp->attached_connector;
808 int lane_count, clock; 813 int lane_count, clock;
809 int max_lane_count = drm_dp_max_lane_count(intel_dp->dpcd); 814 int max_lane_count = drm_dp_max_lane_count(intel_dp->dpcd);
810 int max_clock = intel_dp_max_link_bw(intel_dp) == DP_LINK_BW_2_7 ? 1 : 0; 815 /* Conveniently, the link BW constants become indices with a shift...*/
816 int max_clock = intel_dp_max_link_bw(intel_dp) >> 3;
811 int bpp, mode_rate; 817 int bpp, mode_rate;
812 static int bws[2] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7 }; 818 static int bws[] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7, DP_LINK_BW_5_4 };
813 int link_avail, link_clock; 819 int link_avail, link_clock;
814 820
815 if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev) && port != PORT_A) 821 if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev) && port != PORT_A)
@@ -2644,10 +2650,15 @@ intel_dp_complete_link_train(struct intel_dp *intel_dp)
2644 bool channel_eq = false; 2650 bool channel_eq = false;
2645 int tries, cr_tries; 2651 int tries, cr_tries;
2646 uint32_t DP = intel_dp->DP; 2652 uint32_t DP = intel_dp->DP;
2653 uint32_t training_pattern = DP_TRAINING_PATTERN_2;
2654
2655 /* Training Pattern 3 for HBR2 ot 1.2 devices that support it*/
2656 if (intel_dp->link_bw == DP_LINK_BW_5_4 || intel_dp->use_tps3)
2657 training_pattern = DP_TRAINING_PATTERN_3;
2647 2658
2648 /* channel equalization */ 2659 /* channel equalization */
2649 if (!intel_dp_set_link_train(intel_dp, &DP, 2660 if (!intel_dp_set_link_train(intel_dp, &DP,
2650 DP_TRAINING_PATTERN_2 | 2661 training_pattern |
2651 DP_LINK_SCRAMBLING_DISABLE)) { 2662 DP_LINK_SCRAMBLING_DISABLE)) {
2652 DRM_ERROR("failed to start channel equalization\n"); 2663 DRM_ERROR("failed to start channel equalization\n");
2653 return; 2664 return;
@@ -2674,7 +2685,7 @@ intel_dp_complete_link_train(struct intel_dp *intel_dp)
2674 if (!drm_dp_clock_recovery_ok(link_status, intel_dp->lane_count)) { 2685 if (!drm_dp_clock_recovery_ok(link_status, intel_dp->lane_count)) {
2675 intel_dp_start_link_train(intel_dp); 2686 intel_dp_start_link_train(intel_dp);
2676 intel_dp_set_link_train(intel_dp, &DP, 2687 intel_dp_set_link_train(intel_dp, &DP,
2677 DP_TRAINING_PATTERN_2 | 2688 training_pattern |
2678 DP_LINK_SCRAMBLING_DISABLE); 2689 DP_LINK_SCRAMBLING_DISABLE);
2679 cr_tries++; 2690 cr_tries++;
2680 continue; 2691 continue;
@@ -2690,7 +2701,7 @@ intel_dp_complete_link_train(struct intel_dp *intel_dp)
2690 intel_dp_link_down(intel_dp); 2701 intel_dp_link_down(intel_dp);
2691 intel_dp_start_link_train(intel_dp); 2702 intel_dp_start_link_train(intel_dp);
2692 intel_dp_set_link_train(intel_dp, &DP, 2703 intel_dp_set_link_train(intel_dp, &DP,
2693 DP_TRAINING_PATTERN_2 | 2704 training_pattern |
2694 DP_LINK_SCRAMBLING_DISABLE); 2705 DP_LINK_SCRAMBLING_DISABLE);
2695 tries = 0; 2706 tries = 0;
2696 cr_tries++; 2707 cr_tries++;
@@ -2832,6 +2843,14 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
2832 } 2843 }
2833 } 2844 }
2834 2845
2846 /* Training Pattern 3 support */
2847 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x12 &&
2848 intel_dp->dpcd[DP_MAX_LANE_COUNT] & DP_TPS3_SUPPORTED) {
2849 intel_dp->use_tps3 = true;
2850 DRM_DEBUG_KMS("Displayport TPS3 supported");
2851 } else
2852 intel_dp->use_tps3 = false;
2853
2835 if (!(intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] & 2854 if (!(intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] &
2836 DP_DWN_STRM_PORT_PRESENT)) 2855 DP_DWN_STRM_PORT_PRESENT))
2837 return true; /* native DP sink */ 2856 return true; /* native DP sink */
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 713009bba913..8e0346ba29cb 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -491,6 +491,7 @@ struct intel_dp {
491 unsigned long last_power_on; 491 unsigned long last_power_on;
492 unsigned long last_backlight_off; 492 unsigned long last_backlight_off;
493 bool psr_setup_done; 493 bool psr_setup_done;
494 bool use_tps3;
494 struct intel_connector *attached_connector; 495 struct intel_connector *attached_connector;
495}; 496};
496 497