diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2011-05-20 04:34:21 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-05-20 06:02:26 -0400 |
commit | d7fa8bb385d71c0c0c563a063a0f574adc532585 (patch) | |
tree | ea657206f4729a8ecb57837ec0b41f0f4a49f051 /drivers/gpu | |
parent | 4e633939fe39a98824a0c590a6c1e30559071100 (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/gpu')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 71 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_encoders.c | 23 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_mode.h | 5 |
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 | ||
1071 | bool 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 | |||
1103 | bool 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 | |||
1128 | bool 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 | |||
1071 | static enum drm_connector_status | 1142 | static enum drm_connector_status |
1072 | radeon_dp_detect(struct drm_connector *connector, bool force) | 1143 | radeon_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 | ||
253 | bool 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 | |||
253 | void radeon_panel_mode_fixup(struct drm_encoder *encoder, | 272 | void 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); | |||
464 | extern struct drm_connector * | 464 | extern struct drm_connector * |
465 | radeon_get_connector_for_encoder(struct drm_encoder *encoder); | 465 | radeon_get_connector_for_encoder(struct drm_encoder *encoder); |
466 | 466 | ||
467 | extern bool radeon_encoder_is_dp_bridge(struct drm_encoder *encoder); | ||
468 | extern bool radeon_connector_encoder_is_dp_bridge(struct drm_connector *connector); | ||
469 | extern bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector); | ||
470 | extern bool radeon_connector_is_dp12_capable(struct drm_connector *connector); | ||
471 | |||
467 | extern void radeon_connector_hotplug(struct drm_connector *connector); | 472 | extern void radeon_connector_hotplug(struct drm_connector *connector); |
468 | extern bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector); | 473 | extern bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector); |
469 | extern int radeon_dp_mode_valid_helper(struct radeon_connector *radeon_connector, | 474 | extern int radeon_dp_mode_valid_helper(struct radeon_connector *radeon_connector, |