From a7614ee6949acd0b63ff83d7bb3882e306b85622 Mon Sep 17 00:00:00 2001 From: Mykola Lysenko Date: Wed, 9 Dec 2015 20:18:00 +0800 Subject: [PATCH 1163/1565] drm/amd/dal: do not remove MST connector until reset mode Before MST connector removal we need to make sure reset mode happened from user space, and all state is clear Change-Id: I5630ab576bb515fb9dc7ceea6a478b755e8d2271 Signed-off-by: Harry Wentland Acked-by: Harry Wentland --- drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c | 7 +++++++ drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c | 5 +++++ 2 files changed, 12 insertions(+) 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 b02a2bd..8f41bc8 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 @@ -273,6 +273,8 @@ static struct drm_connector *dm_dp_add_mst_connector(struct drm_dp_mst_topology_ aconnector->mst_port = master; aconnector->dc_link = master->dc_link; + sema_init(&aconnector->mst_sem, 1); + /* Initialize connector state before adding the connectror to drm and framebuffer lists */ amdgpu_dm_connector_funcs_reset(connector); @@ -295,8 +297,13 @@ static void dm_dp_destroy_mst_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; + + /* wait until reset mode occur */ + down(&aconnector->mst_sem); + drm_connector_unregister(connector); /* need to nuke the connector */ mutex_lock(&dev->mode_config.mutex); diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c index 8753b28..a179a5f 100644 --- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c +++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c @@ -1856,6 +1856,7 @@ int amdgpu_dm_connector_init( dm->backlight_link = link; } #endif + sema_init(&aconnector->mst_sem, 1); return 0; } @@ -2173,6 +2174,7 @@ int amdgpu_dm_atomic_commit( /* this is the update mode case */ dc_target_release(acrtc->target); acrtc->target = NULL; + up(&aconnector->mst_sem); } /* @@ -2186,10 +2188,12 @@ int amdgpu_dm_atomic_commit( acrtc->target = new_target; acrtc->enabled = true; acrtc->base.enabled = true; + connector_funcs = aconnector->base.helper_private; aconnector->base.encoder = connector_funcs->best_encoder( &aconnector->base); + down(&aconnector->mst_sem); break; } @@ -2208,6 +2212,7 @@ int amdgpu_dm_atomic_commit( acrtc->enabled = false; acrtc->base.enabled = false; aconnector->base.encoder = NULL; + up(&aconnector->mst_sem); } break; } /* switch() */ -- 1.9.1