aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2012-03-26 15:12:54 -0400
committerDave Airlie <airlied@redhat.com>2012-04-24 04:50:12 -0400
commiteccea7920cfb009c2fa40e9ecdce8c36f61cab66 (patch)
tree70a7a63caaa8f8c8373c40cd2ac0641750ba2a56 /drivers
parent9923777dff4543050fdf938cf6b19f6d4376b7c5 (diff)
drm/radeon/kms: improve bpc handling (v2)
Improve handling of bpc (bits per color) in radeon. In most cases we want 8 except for HDMI, DP, LVDS, and eDP. v2: handle DP better. Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Tested-by: Lennert Buytenhek <buytenh@wantstofly.org> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/radeon/atombios_crtc.c7
-rw-r--r--drivers/gpu/drm/radeon/atombios_dp.c7
-rw-r--r--drivers/gpu/drm/radeon/atombios_encoders.c4
-rw-r--r--drivers/gpu/drm/radeon/radeon_connectors.c56
-rw-r--r--drivers/gpu/drm/radeon/radeon_mode.h1
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 */
406static int convert_bpc_to_bpp(int bpc) 406static 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
88int 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
87static void 143static void
88radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_connector_status status) 144radeon_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);
476extern u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector); 476extern u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector);
477extern bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector); 477extern bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector);
478extern bool radeon_connector_is_dp12_capable(struct drm_connector *connector); 478extern bool radeon_connector_is_dp12_capable(struct drm_connector *connector);
479extern int radeon_get_monitor_bpc(struct drm_connector *connector);
479 480
480extern void radeon_connector_hotplug(struct drm_connector *connector); 481extern void radeon_connector_hotplug(struct drm_connector *connector);
481extern int radeon_dp_mode_valid_helper(struct drm_connector *connector, 482extern int radeon_dp_mode_valid_helper(struct drm_connector *connector,