[PATCH 09/30] drm/amd/display: Fix rehook MST display not light back on

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces at lists.freedesktop.org] On Behalf
> Of Harry Wentland
> Sent: Wednesday, December 13, 2017 5:35 PM
> To: amd-gfx at lists.freedesktop.org
> Cc: Zuo, Jerry <Jerry.Zuo at amd.com>
> Subject: [PATCH 09/30] drm/amd/display: Fix rehook MST display not light
> back on
> 
> From: "Jerry (Fangzhi) Zuo" <Jerry.Zuo at amd.com>
> 
> 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().

Could you please make a more clear message what is broken and what is the fix ?

Thanks,
Andrey

> 
> Signed-off-by: Jerry (Fangzhi) Zuo <Jerry.Zuo at amd.com>
> Reviewed-by: Roman Li <Roman.Li at amd.com>
> Acked-by: Harry Wentland <harry.wentland at amd.com>
> ---
>  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 5163cf6fb73c..3f982aa56b01 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -2356,7 +2356,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;
> @@ -2375,11 +2375,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;
> @@ -2430,6 +2432,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 450379d684cb..3c9154f2d058 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 707928b88448..f3d87f418d2e 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
> @@ -180,6 +180,42 @@ static int dm_connector_update_modes(struct
> drm_connector *connector,
>  	return drm_add_edid_modes(connector, edid);  }
> 
> +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);
> @@ -306,6 +342,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;
>  		}
>  	}
> @@ -358,6 +395,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);
> 
> @@ -389,6 +428,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)
> @@ -399,10 +440,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); @@ -411,6 +460,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 2da851b40042..8cf51da26657 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.14.1
> 
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux