aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlex Deucher <alexdeucher@gmail.com>2011-05-20 04:34:21 -0400
committerDave Airlie <airlied@redhat.com>2011-05-20 06:02:26 -0400
commitd7fa8bb385d71c0c0c563a063a0f574adc532585 (patch)
treeea657206f4729a8ecb57837ec0b41f0f4a49f051 /drivers
parent4e633939fe39a98824a0c590a6c1e30559071100 (diff)
drm/radeon/kms: add some dp encoder/connector helper funcs
Used for dp1.2 support and for dp bridges. Signed-off-by: Alex Deucher <alexdeucher@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/radeon/radeon_connectors.c71
-rw-r--r--drivers/gpu/drm/radeon/radeon_encoders.c23
-rw-r--r--drivers/gpu/drm/radeon/radeon_mode.h5
3 files changed, 99 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
index a7bdcc7553ad..9f3c6509d9d0 100644
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
@@ -1068,6 +1068,77 @@ static int radeon_dp_get_modes(struct drm_connector *connector)
1068 return ret; 1068 return ret;
1069} 1069}
1070 1070
1071bool radeon_connector_encoder_is_dp_bridge(struct drm_connector *connector)
1072{
1073 struct drm_mode_object *obj;
1074 struct drm_encoder *encoder;
1075 struct radeon_encoder *radeon_encoder;
1076 int i;
1077 bool found = false;
1078
1079 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
1080 if (connector->encoder_ids[i] == 0)
1081 break;
1082
1083 obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
1084 if (!obj)
1085 continue;
1086
1087 encoder = obj_to_encoder(obj);
1088 radeon_encoder = to_radeon_encoder(encoder);
1089
1090 switch (radeon_encoder->encoder_id) {
1091 case ENCODER_OBJECT_ID_TRAVIS:
1092 case ENCODER_OBJECT_ID_NUTMEG:
1093 found = true;
1094 break;
1095 default:
1096 break;
1097 }
1098 }
1099
1100 return found;
1101}
1102
1103bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector)
1104{
1105 struct drm_mode_object *obj;
1106 struct drm_encoder *encoder;
1107 struct radeon_encoder *radeon_encoder;
1108 int i;
1109 bool found = false;
1110
1111 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
1112 if (connector->encoder_ids[i] == 0)
1113 break;
1114
1115 obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
1116 if (!obj)
1117 continue;
1118
1119 encoder = obj_to_encoder(obj);
1120 radeon_encoder = to_radeon_encoder(encoder);
1121 if (radeon_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2)
1122 found = true;
1123 }
1124
1125 return found;
1126}
1127
1128bool radeon_connector_is_dp12_capable(struct drm_connector *connector)
1129{
1130 struct drm_device *dev = connector->dev;
1131 struct radeon_device *rdev = dev->dev_private;
1132
1133 if (ASIC_IS_DCE5(rdev) &&
1134 (rdev->clock.dp_extclk >= 53900) &&
1135 radeon_connector_encoder_is_hbr2(connector)) {
1136 return true;
1137 }
1138
1139 return false;
1140}
1141
1071static enum drm_connector_status 1142static enum drm_connector_status
1072radeon_dp_detect(struct drm_connector *connector, bool force) 1143radeon_dp_detect(struct drm_connector *connector, bool force)
1073{ 1144{
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c
index fd0087faf758..1c064e78f21a 100644
--- a/drivers/gpu/drm/radeon/radeon_encoders.c
+++ b/drivers/gpu/drm/radeon/radeon_encoders.c
@@ -250,6 +250,25 @@ struct drm_encoder *radeon_atom_get_external_encoder(struct drm_encoder *encoder
250 return NULL; 250 return NULL;
251} 251}
252 252
253bool radeon_encoder_is_dp_bridge(struct drm_encoder *encoder)
254{
255 struct drm_encoder *other_encoder = radeon_atom_get_external_encoder(encoder);
256
257 if (other_encoder) {
258 struct radeon_encoder *radeon_encoder = to_radeon_encoder(other_encoder);
259
260 switch (radeon_encoder->encoder_id) {
261 case ENCODER_OBJECT_ID_TRAVIS:
262 case ENCODER_OBJECT_ID_NUTMEG:
263 return true;
264 default:
265 return false;
266 }
267 }
268
269 return false;
270}
271
253void radeon_panel_mode_fixup(struct drm_encoder *encoder, 272void radeon_panel_mode_fixup(struct drm_encoder *encoder,
254 struct drm_display_mode *adjusted_mode) 273 struct drm_display_mode *adjusted_mode)
255{ 274{
@@ -621,6 +640,10 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
621 struct radeon_connector *radeon_connector; 640 struct radeon_connector *radeon_connector;
622 struct radeon_connector_atom_dig *dig_connector; 641 struct radeon_connector_atom_dig *dig_connector;
623 642
643 /* dp bridges are always DP */
644 if (radeon_encoder_is_dp_bridge(encoder))
645 return ATOM_ENCODER_MODE_DP;
646
624 connector = radeon_get_connector_for_encoder(encoder); 647 connector = radeon_get_connector_for_encoder(encoder);
625 if (!connector) { 648 if (!connector) {
626 switch (radeon_encoder->encoder_id) { 649 switch (radeon_encoder->encoder_id) {
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
index e4d32373c630..7a3cfa09d45f 100644
--- a/drivers/gpu/drm/radeon/radeon_mode.h
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
@@ -464,6 +464,11 @@ radeon_atombios_get_tv_info(struct radeon_device *rdev);
464extern struct drm_connector * 464extern struct drm_connector *
465radeon_get_connector_for_encoder(struct drm_encoder *encoder); 465radeon_get_connector_for_encoder(struct drm_encoder *encoder);
466 466
467extern bool radeon_encoder_is_dp_bridge(struct drm_encoder *encoder);
468extern bool radeon_connector_encoder_is_dp_bridge(struct drm_connector *connector);
469extern bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector);
470extern bool radeon_connector_is_dp12_capable(struct drm_connector *connector);
471
467extern void radeon_connector_hotplug(struct drm_connector *connector); 472extern void radeon_connector_hotplug(struct drm_connector *connector);
468extern bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector); 473extern bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector);
469extern int radeon_dp_mode_valid_helper(struct radeon_connector *radeon_connector, 474extern int radeon_dp_mode_valid_helper(struct radeon_connector *radeon_connector,