aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3004-drm-amd-display-Fix-rehook-MST-display-not-light-bac.patch
diff options
context:
space:
mode:
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.patch196
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
+