aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0670-drm-amd-dal-Reuse-MST-connectors-to-resolve-headless.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0670-drm-amd-dal-Reuse-MST-connectors-to-resolve-headless.patch')
-rw-r--r--common/recipes-kernel/linux/files/0670-drm-amd-dal-Reuse-MST-connectors-to-resolve-headless.patch103
1 files changed, 103 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0670-drm-amd-dal-Reuse-MST-connectors-to-resolve-headless.patch b/common/recipes-kernel/linux/files/0670-drm-amd-dal-Reuse-MST-connectors-to-resolve-headless.patch
new file mode 100644
index 00000000..25edd9e4
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0670-drm-amd-dal-Reuse-MST-connectors-to-resolve-headless.patch
@@ -0,0 +1,103 @@
+From 482cbc6b1bcc9f633ec2cde2ef7f968c10d96500 Mon Sep 17 00:00:00 2001
+From: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com>
+Date: Tue, 5 Jan 2016 19:59:00 -0500
+Subject: [PATCH 0670/1110] drm/amd/dal: Reuse MST connectors to resolve
+ headless issues
+
+Signed-off-by: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com>
+Acked-by: Jordan Lazare <Jordan.Lazare@amd.com>
+---
+ .../drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c | 57 +++++++++++++---------
+ 1 file changed, 34 insertions(+), 23 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c
+index e7b675e..1d1cd48 100644
+--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c
++++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c
+@@ -270,6 +270,24 @@ static struct drm_connector *dm_dp_add_mst_connector(struct drm_dp_mst_topology_
+ struct amdgpu_connector *aconnector;
+ struct drm_connector *connector;
+
++ drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
++ drm_for_each_connector(connector, dev) {
++ aconnector = to_amdgpu_connector(connector);
++ if (aconnector->mst_port == master
++ && !aconnector->port) {
++ DRM_INFO("DM_MST: reusing connector: %p [id: %d] [master: %p]\n",
++ aconnector, connector->base.id, aconnector->mst_port);
++
++ aconnector->port = port;
++ drm_mode_connector_set_path_property(connector, pathprop);
++
++ drm_modeset_unlock(&dev->mode_config.connection_mutex);
++ return &aconnector->base;
++ }
++ }
++ drm_modeset_unlock(&dev->mode_config.connection_mutex);
++
++
+ aconnector = kzalloc(sizeof(*aconnector), GFP_KERNEL);
+ if (!aconnector)
+ return NULL;
+@@ -329,31 +347,13 @@ static void dm_dp_destroy_mst_connector(
+ struct drm_dp_mst_topology_mgr *mgr,
+ struct drm_connector *connector)
+ {
+- struct amdgpu_connector *master =
+- container_of(mgr, struct amdgpu_connector, mst_mgr);
+ struct amdgpu_connector *aconnector = to_amdgpu_connector(connector);
+- struct drm_device *dev = master->base.dev;
+- struct amdgpu_device *adev = dev->dev_private;
+-
+- DRM_INFO("DM_MST: destroying connector: %p [id: %d] [master: %p]\n",
+- aconnector, connector->base.id, aconnector->mst_port);
+
+- drm_connector_unregister(connector);
+- /* need to nuke the connector */
+- drm_modeset_lock_all(dev);
+- /* dpms off */
+- drm_fb_helper_remove_one_connector(
+- &adev->mode_info.rfbdev->helper,
+- connector);
+-
+- drm_connector_cleanup(connector);
+- drm_modeset_unlock_all(dev);
++ DRM_INFO("DM_MST: Disabling connector: %p [id: %d] [master: %p]\n",
++ aconnector, connector->base.id, aconnector->mst_port);
+
+- if (aconnector->dc_sink)
+- dc_link_remove_sink(aconnector->dc_link, aconnector->dc_sink);
+-
+- kfree(aconnector);
+- DRM_DEBUG_KMS("\n");
++ aconnector->port = NULL;
++ aconnector->edid = NULL;
+ }
+
+ static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
+@@ -369,10 +369,21 @@ static void dm_dp_mst_register_connector(struct drm_connector *connector)
+ {
+ struct drm_device *dev = connector->dev;
+ struct amdgpu_device *adev = dev->dev_private;
++ int i;
+
+ drm_modeset_lock_all(dev);
+- if (adev->mode_info.rfbdev)
++ if (adev->mode_info.rfbdev) {
++ /*Do not add if already registered in past*/
++ for (i = 0; i < adev->mode_info.rfbdev->helper.connector_count; i++) {
++ if (adev->mode_info.rfbdev->helper.connector_info[i]->connector
++ == connector) {
++ drm_modeset_unlock_all(dev);
++ return;
++ }
++ }
++
+ drm_fb_helper_add_one_connector(&adev->mode_info.rfbdev->helper, connector);
++ }
+ else
+ DRM_ERROR("adev->mode_info.rfbdev is NULL\n");
+
+--
+2.7.4
+