summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c9
-rw-r--r--drivers/gpu/drm/amd/display/dc/link/link_factory.c29
2 files changed, 35 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index e19ac0429299..55e875806ee7 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -8483,6 +8483,12 @@ static int to_drm_connector_type(enum signal_type st, uint32_t connector_id)
return DRM_MODE_CONNECTOR_VGA;
case SIGNAL_TYPE_DISPLAY_PORT:
case SIGNAL_TYPE_DISPLAY_PORT_MST:
+ /* External DP bridges have a different connector type. */
+ if (connector_id == CONNECTOR_ID_VGA)
+ return DRM_MODE_CONNECTOR_VGA;
+ else if (connector_id == CONNECTOR_ID_LVDS)
+ return DRM_MODE_CONNECTOR_LVDS;
+
return DRM_MODE_CONNECTOR_DisplayPort;
case SIGNAL_TYPE_DVI_DUAL_LINK:
case SIGNAL_TYPE_DVI_SINGLE_LINK:
@@ -9155,8 +9161,7 @@ static int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm,
connector_type == DRM_MODE_CONNECTOR_HDMIB)
amdgpu_dm_initialize_hdmi_connector(aconnector);
- if (connector_type == DRM_MODE_CONNECTOR_DisplayPort
- || connector_type == DRM_MODE_CONNECTOR_eDP)
+ if (dc_is_dp_signal(link->connector_signal))
amdgpu_dm_initialize_dp_connector(dm, aconnector, link->link_index);
out_free:
diff --git a/drivers/gpu/drm/amd/display/dc/link/link_factory.c b/drivers/gpu/drm/amd/display/dc/link/link_factory.c
index 21815ad01a29..7e7682d7dfc8 100644
--- a/drivers/gpu/drm/amd/display/dc/link/link_factory.c
+++ b/drivers/gpu/drm/amd/display/dc/link/link_factory.c
@@ -367,6 +367,18 @@ static enum transmitter translate_encoder_to_transmitter(
}
}
+static bool encoder_is_external_dp(
+ struct graphics_object_id encoder)
+{
+ switch (encoder.id) {
+ case ENCODER_ID_EXTERNAL_NUTMEG:
+ case ENCODER_ID_EXTERNAL_TRAVIS:
+ return true;
+ default:
+ return false;
+ }
+}
+
static void link_destruct(struct dc_link *link)
{
int i;
@@ -514,6 +526,13 @@ static bool construct_phy(struct dc_link *link,
* so that we avoid initializing DDC and HPD, etc.
*/
bp_funcs->get_src_obj(bios, link->link_id, 0, &link_encoder);
+
+ if (encoder_is_external_dp(link_encoder)) {
+ /* External DP bridge encoders: find the actual link encoder and use that. */
+ link->ext_enc_id = link_encoder;
+ bp_funcs->get_src_obj(bios, link->ext_enc_id, 0, &link_encoder);
+ }
+
transmitter_from_encoder = translate_encoder_to_transmitter(link_encoder);
link_analog_engine = find_analog_engine(link, &enc_init_data.analog_encoder);
@@ -691,6 +710,13 @@ static bool construct_phy(struct dc_link *link,
goto create_fail;
}
+ /* For external DP bridge encoders:
+ * Set the connector signal to DisplayPort so that they can work with
+ * the pre-existing code paths for DP without a lot of code churn.
+ */
+ if (link->ext_enc_id.id != ENCODER_ID_UNKNOWN)
+ link->connector_signal = SIGNAL_TYPE_DISPLAY_PORT;
+
LINK_INFO("Connector[%d] description: signal: %s\n",
init_params->connector_index,
signal_type_to_string(link->connector_signal));
@@ -735,7 +761,8 @@ static bool construct_phy(struct dc_link *link,
link->device_tag.dev_id))
continue;
if (link->device_tag.dev_id.device_type == DEVICE_TYPE_CRT &&
- link->connector_signal != SIGNAL_TYPE_RGB)
+ link->connector_signal != SIGNAL_TYPE_RGB &&
+ link->ext_enc_id.id == ENCODER_ID_UNKNOWN)
continue;
if (link->device_tag.dev_id.device_type == DEVICE_TYPE_LCD &&
link->connector_signal == SIGNAL_TYPE_RGB)