> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-boun...@lists.freedesktop.org] On Behalf
> Of Harry Wentland
> Sent: Wednesday, December 13, 2017 5:35 PM
> To: amd-gfx@lists.freedesktop.org
> Cc: Zuo, Jerry <jerry....@amd.com>
> Subject: [PATCH 09/30] drm/amd/display: Fix rehook MST display not light
> back on
> 
> From: "Jerry (Fangzhi) Zuo" <jerry....@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....@amd.com>
> Reviewed-by: Roman Li <roman...@amd.com>
> Acked-by: Harry Wentland <harry.wentl...@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@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to