From 7a7302602be80b3033dbd4218be3b8fc8d6b2db0 Mon Sep 17 00:00:00 2001 From: Mykola Lysenko Date: Wed, 9 Dec 2015 20:18:00 +0800 Subject: [PATCH 0598/1110] 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 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 16c82a2..733d8aa 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 @@ -274,6 +274,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); @@ -296,8 +298,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 9f467eb..ea7a623 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; } @@ -2174,6 +2175,7 @@ int amdgpu_dm_atomic_commit( /* this is the update mode case */ dc_target_release(acrtc->target); acrtc->target = NULL; + up(&aconnector->mst_sem); } /* @@ -2187,10 +2189,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; } @@ -2209,6 +2213,7 @@ int amdgpu_dm_atomic_commit( acrtc->enabled = false; acrtc->base.enabled = false; aconnector->base.encoder = NULL; + up(&aconnector->mst_sem); } break; } /* switch() */ -- 2.7.4