From 4c64aa726acb5fb542c143e91ad24264885f8b85 Mon Sep 17 00:00:00 2001 From: Yashwanth Date: Mon, 16 Nov 2020 13:53:54 +0530 Subject: [PATCH] disp: msm: sde: move qsync validation to encoder atomic check In connector atomic check, seamless vrr cannot be determined since mode doesn't get populated by that time. This change moves qsync validation from connector to encoder atomic check to verify & handle modeset concurrencies. Change-Id: Ia41bde4c05f98d8ba4cb39c18f2da1683cf9e5a3 Signed-off-by: Yashwanth --- msm/sde/sde_connector.c | 30 ------------------------------ msm/sde/sde_encoder.c | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 30 deletions(-) diff --git a/msm/sde/sde_connector.c b/msm/sde/sde_connector.c index 311b8bdbaa..c83b24e80e 100644 --- a/msm/sde/sde_connector.c +++ b/msm/sde/sde_connector.c @@ -2364,10 +2364,6 @@ static int sde_connector_atomic_check(struct drm_connector *connector, struct drm_atomic_state *state) { struct sde_connector *c_conn; - struct sde_connector_state *c_state; - bool qsync_dirty = false, has_modeset = false; - struct drm_connector_state *new_conn_state; - struct drm_crtc_state *new_crtc_state = NULL; if (!connector) { SDE_ERROR("invalid connector\n"); @@ -2375,32 +2371,6 @@ static int sde_connector_atomic_check(struct drm_connector *connector, } c_conn = to_sde_connector(connector); - new_conn_state = drm_atomic_get_new_connector_state(state, connector); - - if (!new_conn_state) { - SDE_ERROR("invalid connector state\n"); - return -EINVAL; - } - - c_state = to_sde_connector_state(new_conn_state); - if (new_conn_state->crtc) - new_crtc_state = drm_atomic_get_new_crtc_state(state, - new_conn_state->crtc); - - has_modeset = sde_crtc_atomic_check_has_modeset(new_conn_state->state, - new_conn_state->crtc); - qsync_dirty = msm_property_is_dirty(&c_conn->property_info, - &c_state->property_state, - CONNECTOR_PROP_QSYNC_MODE); - - SDE_DEBUG("has_modeset %d qsync_dirty %d\n", has_modeset, qsync_dirty); - if (has_modeset && qsync_dirty && new_crtc_state && - !msm_is_mode_seamless_vrr(&new_crtc_state->adjusted_mode)) { - SDE_ERROR("invalid qsync update during modeset\n"); - return -EINVAL; - } - new_conn_state = drm_atomic_get_new_connector_state(state, connector); - if (c_conn->ops.atomic_check) return c_conn->ops.atomic_check(connector, c_conn->display, state); diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 1c09553d84..846c556a8f 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -941,6 +941,7 @@ static int sde_encoder_virt_atomic_check( struct sde_crtc_state *sde_crtc_state = NULL; enum sde_rm_topology_name old_top; int ret = 0; + bool qsync_dirty = false, has_modeset = false; if (!drm_enc || !crtc_state || !conn_state) { SDE_ERROR("invalid arg(s), drm_enc %d, crtc/conn state %d/%d\n", @@ -997,6 +998,19 @@ static int sde_encoder_virt_atomic_check( } drm_mode_set_crtcinfo(adj_mode, 0); + + has_modeset = sde_crtc_atomic_check_has_modeset(conn_state->state, + conn_state->crtc); + qsync_dirty = msm_property_is_dirty(&sde_conn->property_info, + &sde_conn_state->property_state, + CONNECTOR_PROP_QSYNC_MODE); + + if (has_modeset && qsync_dirty && + !msm_is_mode_seamless_vrr(adj_mode)) { + SDE_ERROR("invalid qsync update during modeset\n"); + return -EINVAL; + } + SDE_EVT32(DRMID(drm_enc), adj_mode->flags, adj_mode->private_flags, old_top, adj_mode->vrefresh, adj_mode->hdisplay, adj_mode->vdisplay, adj_mode->htotal, adj_mode->vtotal);