diff options
Diffstat (limited to 'drivers/gpu/drm/radeon')
-rw-r--r-- | drivers/gpu/drm/radeon/atombios_crtc.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/atombios_dp.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/atombios_encoders.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 56 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_mode.h | 1 |
5 files changed, 63 insertions, 12 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index b5ff1f7b6f7e..2fab38f5a08e 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
@@ -588,8 +588,7 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, | |||
588 | if (encoder->crtc == crtc) { | 588 | if (encoder->crtc == crtc) { |
589 | radeon_encoder = to_radeon_encoder(encoder); | 589 | radeon_encoder = to_radeon_encoder(encoder); |
590 | connector = radeon_get_connector_for_encoder(encoder); | 590 | connector = radeon_get_connector_for_encoder(encoder); |
591 | /* if (connector && connector->display_info.bpc) | 591 | bpc = radeon_get_monitor_bpc(connector); |
592 | bpc = connector->display_info.bpc; */ | ||
593 | encoder_mode = atombios_get_encoder_mode(encoder); | 592 | encoder_mode = atombios_get_encoder_mode(encoder); |
594 | is_duallink = radeon_dig_monitor_is_duallink(encoder, mode->clock); | 593 | is_duallink = radeon_dig_monitor_is_duallink(encoder, mode->clock); |
595 | if ((radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT | ATOM_DEVICE_DFP_SUPPORT)) || | 594 | if ((radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT | ATOM_DEVICE_DFP_SUPPORT)) || |
@@ -965,9 +964,7 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode | |||
965 | struct radeon_connector_atom_dig *dig_connector = | 964 | struct radeon_connector_atom_dig *dig_connector = |
966 | radeon_connector->con_priv; | 965 | radeon_connector->con_priv; |
967 | int dp_clock; | 966 | int dp_clock; |
968 | 967 | bpc = radeon_get_monitor_bpc(connector); | |
969 | /* if (connector->display_info.bpc) | ||
970 | bpc = connector->display_info.bpc; */ | ||
971 | 968 | ||
972 | switch (encoder_mode) { | 969 | switch (encoder_mode) { |
973 | case ATOM_ENCODER_MODE_DP_MST: | 970 | case ATOM_ENCODER_MODE_DP_MST: |
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index c57d85664e77..cadbb107c803 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c | |||
@@ -405,13 +405,10 @@ static void dp_get_adjust_train(u8 link_status[DP_LINK_STATUS_SIZE], | |||
405 | /* get bpc from the EDID */ | 405 | /* get bpc from the EDID */ |
406 | static int convert_bpc_to_bpp(int bpc) | 406 | static int convert_bpc_to_bpp(int bpc) |
407 | { | 407 | { |
408 | #if 0 | ||
409 | if (bpc == 0) | 408 | if (bpc == 0) |
410 | return 24; | 409 | return 24; |
411 | else | 410 | else |
412 | return bpc * 3; | 411 | return bpc * 3; |
413 | #endif | ||
414 | return 24; | ||
415 | } | 412 | } |
416 | 413 | ||
417 | /* get the max pix clock supported by the link rate and lane num */ | 414 | /* get the max pix clock supported by the link rate and lane num */ |
@@ -463,7 +460,7 @@ static int radeon_dp_get_dp_lane_number(struct drm_connector *connector, | |||
463 | u8 dpcd[DP_DPCD_SIZE], | 460 | u8 dpcd[DP_DPCD_SIZE], |
464 | int pix_clock) | 461 | int pix_clock) |
465 | { | 462 | { |
466 | int bpp = convert_bpc_to_bpp(connector->display_info.bpc); | 463 | int bpp = convert_bpc_to_bpp(radeon_get_monitor_bpc(connector)); |
467 | int max_link_rate = dp_get_max_link_rate(dpcd); | 464 | int max_link_rate = dp_get_max_link_rate(dpcd); |
468 | int max_lane_num = dp_get_max_lane_number(dpcd); | 465 | int max_lane_num = dp_get_max_lane_number(dpcd); |
469 | int lane_num; | 466 | int lane_num; |
@@ -482,7 +479,7 @@ static int radeon_dp_get_dp_link_clock(struct drm_connector *connector, | |||
482 | u8 dpcd[DP_DPCD_SIZE], | 479 | u8 dpcd[DP_DPCD_SIZE], |
483 | int pix_clock) | 480 | int pix_clock) |
484 | { | 481 | { |
485 | int bpp = convert_bpc_to_bpp(connector->display_info.bpc); | 482 | int bpp = convert_bpc_to_bpp(radeon_get_monitor_bpc(connector)); |
486 | int lane_num, max_pix_clock; | 483 | int lane_num, max_pix_clock; |
487 | 484 | ||
488 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) == | 485 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) == |
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index e607c4d7dd98..06b209b2e229 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
@@ -541,7 +541,7 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mo | |||
541 | dp_clock = dig_connector->dp_clock; | 541 | dp_clock = dig_connector->dp_clock; |
542 | dp_lane_count = dig_connector->dp_lane_count; | 542 | dp_lane_count = dig_connector->dp_lane_count; |
543 | hpd_id = radeon_connector->hpd.hpd; | 543 | hpd_id = radeon_connector->hpd.hpd; |
544 | /* bpc = connector->display_info.bpc; */ | 544 | bpc = radeon_get_monitor_bpc(connector); |
545 | } | 545 | } |
546 | 546 | ||
547 | /* no dig encoder assigned */ | 547 | /* no dig encoder assigned */ |
@@ -1159,7 +1159,7 @@ atombios_external_encoder_setup(struct drm_encoder *encoder, | |||
1159 | dp_lane_count = dig_connector->dp_lane_count; | 1159 | dp_lane_count = dig_connector->dp_lane_count; |
1160 | connector_object_id = | 1160 | connector_object_id = |
1161 | (radeon_connector->connector_object_id & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; | 1161 | (radeon_connector->connector_object_id & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; |
1162 | /* bpc = connector->display_info.bpc; */ | 1162 | bpc = radeon_get_monitor_bpc(connector); |
1163 | } | 1163 | } |
1164 | 1164 | ||
1165 | memset(&args, 0, sizeof(args)); | 1165 | memset(&args, 0, sizeof(args)); |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index bd05156edbdb..71fa389e10fe 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
@@ -84,6 +84,62 @@ static void radeon_property_change_mode(struct drm_encoder *encoder) | |||
84 | crtc->x, crtc->y, crtc->fb); | 84 | crtc->x, crtc->y, crtc->fb); |
85 | } | 85 | } |
86 | } | 86 | } |
87 | |||
88 | int radeon_get_monitor_bpc(struct drm_connector *connector) | ||
89 | { | ||
90 | struct drm_device *dev = connector->dev; | ||
91 | struct radeon_device *rdev = dev->dev_private; | ||
92 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | ||
93 | struct radeon_connector_atom_dig *dig_connector; | ||
94 | int bpc = 8; | ||
95 | |||
96 | switch (connector->connector_type) { | ||
97 | case DRM_MODE_CONNECTOR_DVII: | ||
98 | case DRM_MODE_CONNECTOR_HDMIB: | ||
99 | if (radeon_connector->use_digital) { | ||
100 | if (drm_detect_hdmi_monitor(radeon_connector->edid)) { | ||
101 | if (connector->display_info.bpc) | ||
102 | bpc = connector->display_info.bpc; | ||
103 | } | ||
104 | } | ||
105 | break; | ||
106 | case DRM_MODE_CONNECTOR_DVID: | ||
107 | case DRM_MODE_CONNECTOR_HDMIA: | ||
108 | if (drm_detect_hdmi_monitor(radeon_connector->edid)) { | ||
109 | if (connector->display_info.bpc) | ||
110 | bpc = connector->display_info.bpc; | ||
111 | } | ||
112 | break; | ||
113 | case DRM_MODE_CONNECTOR_DisplayPort: | ||
114 | dig_connector = radeon_connector->con_priv; | ||
115 | if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || | ||
116 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) || | ||
117 | drm_detect_hdmi_monitor(radeon_connector->edid)) { | ||
118 | if (connector->display_info.bpc) | ||
119 | bpc = connector->display_info.bpc; | ||
120 | } | ||
121 | break; | ||
122 | case DRM_MODE_CONNECTOR_eDP: | ||
123 | case DRM_MODE_CONNECTOR_LVDS: | ||
124 | if (connector->display_info.bpc) | ||
125 | bpc = connector->display_info.bpc; | ||
126 | else if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { | ||
127 | struct drm_connector_helper_funcs *connector_funcs = | ||
128 | connector->helper_private; | ||
129 | struct drm_encoder *encoder = connector_funcs->best_encoder(connector); | ||
130 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | ||
131 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | ||
132 | |||
133 | if (dig->lcd_misc & ATOM_PANEL_MISC_V13_6BIT_PER_COLOR) | ||
134 | bpc = 6; | ||
135 | else if (dig->lcd_misc & ATOM_PANEL_MISC_V13_8BIT_PER_COLOR) | ||
136 | bpc = 8; | ||
137 | } | ||
138 | break; | ||
139 | } | ||
140 | return bpc; | ||
141 | } | ||
142 | |||
87 | static void | 143 | static void |
88 | radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_connector_status status) | 144 | radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_connector_status status) |
89 | { | 145 | { |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index f7eb5d8b9fd3..b2cca6a2395c 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
@@ -476,6 +476,7 @@ extern u16 radeon_encoder_get_dp_bridge_encoder_id(struct drm_encoder *encoder); | |||
476 | extern u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector); | 476 | extern u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector); |
477 | extern bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector); | 477 | extern bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector); |
478 | extern bool radeon_connector_is_dp12_capable(struct drm_connector *connector); | 478 | extern bool radeon_connector_is_dp12_capable(struct drm_connector *connector); |
479 | extern int radeon_get_monitor_bpc(struct drm_connector *connector); | ||
479 | 480 | ||
480 | extern void radeon_connector_hotplug(struct drm_connector *connector); | 481 | extern void radeon_connector_hotplug(struct drm_connector *connector); |
481 | extern int radeon_dp_mode_valid_helper(struct drm_connector *connector, | 482 | extern int radeon_dp_mode_valid_helper(struct drm_connector *connector, |