diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3004-drm-amd-display-Fix-rehook-MST-display-not-light-bac.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3004-drm-amd-display-Fix-rehook-MST-display-not-light-bac.patch | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3004-drm-amd-display-Fix-rehook-MST-display-not-light-bac.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3004-drm-amd-display-Fix-rehook-MST-display-not-light-bac.patch new file mode 100644 index 00000000..2583516f --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3004-drm-amd-display-Fix-rehook-MST-display-not-light-bac.patch @@ -0,0 +1,196 @@ +From f09a4163236abe62bfc33d333bafe2b71f7f95d7 Mon Sep 17 00:00:00 2001 +From: "Jerry (Fangzhi) Zuo" <Jerry.Zuo@amd.com> +Date: Fri, 1 Dec 2017 13:26:05 -0500 +Subject: [PATCH 3004/4131] drm/amd/display: Fix rehook MST display not light + back on + +Original applied dm_restore_drm_connector_state() has got removed. +Set link status to BAD before hotplug() event could trigger +another modeset from userspace. + +The fix "Fix MST daisy chain SST not light up" commit makes so it is trying +to create a stream prior to dc_sink. That makes dc_sink is not present in +create_stream_for_sink(). + +Signed-off-by: Jerry (Fangzhi) Zuo <Jerry.Zuo@amd.com> +Reviewed-by: Roman Li <Roman.Li@amd.com> +Acked-by: Harry Wentland <harry.wentland@amd.com> + + Conflicts: + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c + +Change-Id: Ie1e555c43590b3ca65b37db53d83dea5bf698308 +--- + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 13 +++--- + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 2 + + .../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 51 ++++++++++++++++++++++ + .../amd/display/amdgpu_dm/amdgpu_dm_mst_types.h | 1 + + 4 files changed, 62 insertions(+), 5 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 0db20ef..e966377 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -2518,7 +2518,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, + const struct dm_connector_state *dm_state) + { + struct drm_display_mode *preferred_mode = NULL; +- const struct drm_connector *drm_connector; ++ struct drm_connector *drm_connector; + struct dc_stream_state *stream = NULL; + struct drm_display_mode mode = *drm_mode; + bool native_mode_found = false; +@@ -2537,11 +2537,13 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, + + if (!aconnector->dc_sink) { + /* +- * Exclude MST from creating fake_sink +- * TODO: need to enable MST into fake_sink feature ++ * Create dc_sink when necessary to MST ++ * Don't apply fake_sink to MST + */ +- if (aconnector->mst_port) +- goto stream_create_fail; ++ if (aconnector->mst_port) { ++ dm_dp_mst_dc_sink_create(drm_connector); ++ goto mst_dc_sink_create_done; ++ } + + if (create_fake_sink(aconnector)) + goto stream_create_fail; +@@ -2592,6 +2594,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, + stream_create_fail: + dm_state_null: + drm_connector_null: ++mst_dc_sink_create_done: + return stream; + } + +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +index 450379d..3c9154f 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +@@ -189,6 +189,8 @@ struct amdgpu_dm_connector { + struct mutex hpd_lock; + + bool fake_enable; ++ ++ bool mst_connected; + }; + + #define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base) +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +index 399be00..41ca3b1 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +@@ -187,6 +187,42 @@ static int dm_connector_update_modes(struct drm_connector *connector, + return ret; + } + ++void dm_dp_mst_dc_sink_create(struct drm_connector *connector) ++{ ++ struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); ++ struct edid *edid; ++ struct dc_sink *dc_sink; ++ struct dc_sink_init_data init_params = { ++ .link = aconnector->dc_link, ++ .sink_signal = SIGNAL_TYPE_DISPLAY_PORT_MST }; ++ ++ edid = drm_dp_mst_get_edid(connector, &aconnector->mst_port->mst_mgr, aconnector->port); ++ ++ if (!edid) { ++ drm_mode_connector_update_edid_property( ++ &aconnector->base, ++ NULL); ++ return; ++ } ++ ++ aconnector->edid = edid; ++ ++ dc_sink = dc_link_add_remote_sink( ++ aconnector->dc_link, ++ (uint8_t *)aconnector->edid, ++ (aconnector->edid->extensions + 1) * EDID_LENGTH, ++ &init_params); ++ ++ dc_sink->priv = aconnector; ++ aconnector->dc_sink = dc_sink; ++ ++ amdgpu_dm_add_sink_to_freesync_module( ++ connector, aconnector->edid); ++ ++ drm_mode_connector_update_edid_property( ++ &aconnector->base, aconnector->edid); ++} ++ + static int dm_dp_mst_get_modes(struct drm_connector *connector) + { + struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); +@@ -313,6 +349,7 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr, + drm_mode_connector_set_path_property(connector, pathprop); + + drm_connector_list_iter_end(&conn_iter); ++ aconnector->mst_connected = true; + return &aconnector->base; + } + } +@@ -365,6 +402,8 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr, + */ + amdgpu_dm_connector_funcs_reset(connector); + ++ aconnector->mst_connected = true; ++ + DRM_INFO("DM_MST: added connector: %p [id: %d] [master: %p]\n", + aconnector, connector->base.id, aconnector->mst_port); + +@@ -396,6 +435,8 @@ static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, + drm_mode_connector_update_edid_property( + &aconnector->base, + NULL); ++ ++ aconnector->mst_connected = false; + } + + static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr) +@@ -406,10 +447,18 @@ static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr) + drm_kms_helper_hotplug_event(dev); + } + ++static void dm_dp_mst_link_status_reset(struct drm_connector *connector) ++{ ++ mutex_lock(&connector->dev->mode_config.mutex); ++ drm_mode_connector_set_link_status_property(connector, DRM_MODE_LINK_STATUS_BAD); ++ mutex_unlock(&connector->dev->mode_config.mutex); ++} ++ + static void dm_dp_mst_register_connector(struct drm_connector *connector) + { + struct drm_device *dev = connector->dev; + struct amdgpu_device *adev = dev->dev_private; ++ struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); + + if (adev->mode_info.rfbdev) + drm_fb_helper_add_one_connector(&adev->mode_info.rfbdev->helper, connector); +@@ -418,6 +467,8 @@ static void dm_dp_mst_register_connector(struct drm_connector *connector) + + drm_connector_register(connector); + ++ if (aconnector->mst_connected) ++ dm_dp_mst_link_status_reset(connector); + } + + static const struct drm_dp_mst_topology_cbs dm_mst_cbs = { +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h +index 2da851b..8cf51da 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h +@@ -31,5 +31,6 @@ struct amdgpu_dm_connector; + + void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm, + struct amdgpu_dm_connector *aconnector); ++void dm_dp_mst_dc_sink_create(struct drm_connector *connector); + + #endif +-- +2.7.4 + |