diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index 39cbacd8cd07..1e5f0a95c685 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c @@ -381,11 +381,24 @@ mode_fixup(struct drm_atomic_state *state) for_each_new_connector_in_state(state, connector, conn_state, i) { const struct drm_encoder_helper_funcs *funcs; + const struct drm_connector_helper_funcs *conn_funcs; struct drm_encoder *encoder; + conn_funcs = connector->helper_private; + WARN_ON(!!conn_state->best_encoder != !!conn_state->crtc); - if (!conn_state->crtc || !conn_state->best_encoder) + if (!conn_state->crtc || !conn_state->best_encoder) { + if (conn_funcs && conn_funcs->atomic_check) { + ret = conn_funcs->atomic_check(connector, conn_state); + + if (ret) { + DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] check failed\n", + connector->base.id, connector->name); + return ret; + } + } + continue; crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc); @@ -404,7 +417,15 @@ mode_fixup(struct drm_atomic_state *state) return -EINVAL; } - if (funcs && funcs->atomic_check) { + if (conn_funcs && conn_funcs->atomic_check) { + ret = conn_funcs->atomic_check(connector, conn_state); + + if (ret) { + DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] check failed\n", + connector->base.id, connector->name); + return ret; + } + } else if (funcs && funcs->atomic_check) { ret = funcs->atomic_check(encoder, crtc_state, conn_state); if (ret) {