On Wed, 2019-09-18 at 16:26 -0400, mikita.lipski@amd.com wrote:
From: Mikita Lipski mikita.lipski@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 lyude@redhat.com Signed-off-by: Mikita Lipski mikita.lipski@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)