On Wed, 2019-09-18 at 16:26 -0400, mikita.lip...@amd.com wrote:
> From: Mikita Lipski <mikita.lip...@amd.com>
> 
> [why]
> Complying with new MST atomic check requirements.
> The driver needs to call this function on every
> atomic check to reset the VCPI slots if new state
> disables
> [how]
> - Verify that it is a MST connection
> - Verify that old crtc state exists
> - Verify the new crtc state disables sink
> - Release VCPI slots on the port
> 
> Cc: Lyude Paul <ly...@redhat.com>
> Signed-off-by: Mikita Lipski <mikita.lip...@amd.com>
> ---
>  .../display/amdgpu_dm/amdgpu_dm_mst_types.c   | 34 +++++++++++++++++++
>  1 file changed, 34 insertions(+)
> 
> 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 16218a202b59..4e1bbf5bbe77 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
> @@ -252,10 +252,44 @@ static struct drm_encoder *dm_mst_best_encoder(struct
> drm_connector *connector)
>       return &amdgpu_dm_connector->mst_encoder->base;
>  }
>  
> +static int dm_dp_mst_atomic_check(struct drm_connector *connector,
> +                             struct drm_connector_state *new_conn_state)
> +{
> +     struct drm_atomic_state *state = new_conn_state->state;
> +     struct drm_connector_state *old_conn_state =
> +                     drm_atomic_get_old_connector_state(state, connector);
> +     struct amdgpu_dm_connector *aconnector =
> to_amdgpu_dm_connector(connector);
> +     struct drm_crtc_state *new_crtc_state;
> +     struct drm_dp_mst_topology_mgr *mst_mgr;
> +     struct drm_dp_mst_port *mst_port;
> +
> +     if (!aconnector || !aconnector->port)
> +             return 0;
Same as the last patch, I don't think you should need either of these checks.

Otherwise, assuming this gets squashed into the previous patch this looks fine
to me

> +
> +     mst_port = aconnector->port;
> +     mst_mgr = &aconnector->mst_port->mst_mgr;
> +
> +     if (!old_conn_state->crtc)
> +             return 0;
> +
> +     if (new_conn_state->crtc) {
> +             new_crtc_state = drm_atomic_get_old_crtc_state(state,
> new_conn_state->crtc);
> +             if (!new_crtc_state ||
> +                 !drm_atomic_crtc_needs_modeset(new_crtc_state) ||
> +                 new_crtc_state->enable)
> +                     return 0;
> +             }
> +
> +     return drm_dp_atomic_release_vcpi_slots(state,
> +                                             mst_mgr,
> +                                             mst_port);
> +}
> +
>  static const struct drm_connector_helper_funcs
> dm_dp_mst_connector_helper_funcs = {
>       .get_modes = dm_dp_mst_get_modes,
>       .mode_valid = amdgpu_dm_connector_mode_valid,
>       .best_encoder = dm_mst_best_encoder,
> +     .atomic_check = dm_dp_mst_atomic_check,
>  };
>  
>  static void amdgpu_dm_encoder_destroy(struct drm_encoder *encoder)
-- 
Cheers,
        Lyude Paul

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to