drm/radeon/dp: fix lane/clock setup for dp 1.2 capable devices
authorAlex Deucher <alexander.deucher@amd.com>
Tue, 27 May 2014 17:48:05 +0000 (13:48 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 9 Jul 2014 18:18:25 +0000 (11:18 -0700)
commit 3b6d9fd23e015b5397c438fd3cd74147d2c805b6 upstream.

Only DCE5+ asics support DP 1.2.

Noticed by ArtForz on IRC.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/radeon/atombios_dp.c

index 4ad7643..5727dbd 100644 (file)
@@ -386,6 +386,19 @@ static int dp_get_max_dp_pix_clock(int link_rate,
 
 /***** radeon specific DP functions *****/
 
+static int radeon_dp_get_max_link_rate(struct drm_connector *connector,
+                                      u8 dpcd[DP_DPCD_SIZE])
+{
+       int max_link_rate;
+
+       if (radeon_connector_is_dp12_capable(connector))
+               max_link_rate = min(drm_dp_max_link_rate(dpcd), 540000);
+       else
+               max_link_rate = min(drm_dp_max_link_rate(dpcd), 270000);
+
+       return max_link_rate;
+}
+
 /* First get the min lane# when low rate is used according to pixel clock
  * (prefer low rate), second check max lane# supported by DP panel,
  * if the max lane# < low rate lane# then use max lane# instead.
@@ -395,7 +408,7 @@ static int radeon_dp_get_dp_lane_number(struct drm_connector *connector,
                                        int pix_clock)
 {
        int bpp = convert_bpc_to_bpp(radeon_get_monitor_bpc(connector));
-       int max_link_rate = drm_dp_max_link_rate(dpcd);
+       int max_link_rate = radeon_dp_get_max_link_rate(connector, dpcd);
        int max_lane_num = drm_dp_max_lane_count(dpcd);
        int lane_num;
        int max_dp_pix_clock;
@@ -433,7 +446,7 @@ static int radeon_dp_get_dp_link_clock(struct drm_connector *connector,
                        return 540000;
        }
 
-       return drm_dp_max_link_rate(dpcd);
+       return radeon_dp_get_max_link_rate(connector, dpcd);
 }
 
 static u8 radeon_dp_encoder_service(struct radeon_device *rdev,