[PATCH 2/2] drm/amd/display: Drop reusing drm connector for MST

Wentland, Harry Harry.Wentland at amd.com
Wed Oct 31 18:26:48 UTC 2018


On 2018-10-30 6:09 p.m., Jerry (Fangzhi) Zuo wrote:
> [why]
> It is not safe to keep existing connector while entire topology
> has been removed. Could lead potential impact to uapi.
> Entirely unregister all the connectors on the topology,
> and use a new set of connectors when the topology is plugged back
> on.
> 
> [How]
> Remove the drm connector entirely each time when the
> corresponding MST topology is gone.
> When hotunplug a connector (e.g., DP2)
> 1. Remove connector from userspace.
> 2. Drop it's reference.
> When hotplug back on:
> 1. Detect new topology, and create new connectors.
> 2. Notify userspace with sysfs hotplug event.
> 3. Reprobe new connectors, and reassign CRTC from old (e.g., DP2)
> to new (e.g., DP3) connector.
> 
> Signed-off-by: Jerry (Fangzhi) Zuo <Jerry.Zuo at amd.com>

Series is
Reviewed-by: Harry Wentland <harry.wentland at amd.com>

Harry

> ---
>  drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h  |  2 --
>  .../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c    | 40 ++++------------------
>  2 files changed, 7 insertions(+), 35 deletions(-)
> 
> 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 101e122945a4..23f2d05cf07e 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
> @@ -208,8 +208,6 @@ 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 744d97cc0d39..621afe39de13 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
> @@ -320,25 +320,6 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
>  	struct amdgpu_device *adev = dev->dev_private;
>  	struct amdgpu_dm_connector *aconnector;
>  	struct drm_connector *connector;
> -	struct drm_connector_list_iter conn_iter;
> -
> -	drm_connector_list_iter_begin(dev, &conn_iter);
> -	drm_for_each_connector_iter(connector, &conn_iter) {
> -		aconnector = to_amdgpu_dm_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_connector_set_path_property(connector, pathprop);
> -
> -			drm_connector_list_iter_end(&conn_iter);
> -			aconnector->mst_connected = true;
> -			return &aconnector->base;
> -		}
> -	}
> -	drm_connector_list_iter_end(&conn_iter);
>  
>  	aconnector = kzalloc(sizeof(*aconnector), GFP_KERNEL);
>  	if (!aconnector)
> @@ -387,8 +368,6 @@ 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);
>  
> @@ -400,6 +379,9 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
>  static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
>  					struct drm_connector *connector)
>  {
> +	struct amdgpu_dm_connector *master = container_of(mgr, struct amdgpu_dm_connector, mst_mgr);
> +	struct drm_device *dev = master->base.dev;
> +	struct amdgpu_device *adev = dev->dev_private;
>  	struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
>  
>  	DRM_INFO("DM_MST: Disabling connector: %p [id: %d] [master: %p]\n",
> @@ -413,7 +395,10 @@ static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
>  		aconnector->dc_sink = NULL;
>  	}
>  
> -	aconnector->mst_connected = false;
> +	drm_connector_unregister(connector);
> +	if (adev->mode_info.rfbdev)
> +		drm_fb_helper_remove_one_connector(&adev->mode_info.rfbdev->helper, connector);
> +	drm_connector_unreference(connector);
>  }
>  
>  static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
> @@ -424,18 +409,10 @@ 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_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);
> @@ -443,9 +420,6 @@ static void dm_dp_mst_register_connector(struct drm_connector *connector)
>  		DRM_ERROR("adev->mode_info.rfbdev is NULL\n");
>  
>  	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 = {
> 


More information about the amd-gfx mailing list