diff options
author | Raviteja Tamatam <travitej@codeaurora.org> | 2020-11-18 14:06:27 +0530 |
---|---|---|
committer | Raviteja Tamatam <travitej@codeaurora.org> | 2020-11-19 17:49:45 +0530 |
commit | 04a22411da82f07ef11585d529dd072326dc0361 (patch) | |
tree | 61a5e4fa749df84fb33aba5af3dd277de3caa354 | |
parent | e1b3d2f8dde4a2c257fad718b6618811d71c7119 (diff) | |
download | display-drivers-04a22411da82f07ef11585d529dd072326dc0361.tar.gz |
disp: msm: sde: move qsync validation to encoder 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 and handle modeset concurrencies.
Change-Id: Ibd3a682b01e08f99d0a0eb1ca2ba51a7c8fe5e76
Signed-off-by: Raviteja Tamatam <travitej@codeaurora.org>
-rw-r--r-- | msm/sde/sde_connector.c | 21 | ||||
-rw-r--r-- | msm/sde/sde_encoder.c | 14 |
2 files changed, 14 insertions, 21 deletions
diff --git a/msm/sde/sde_connector.c b/msm/sde/sde_connector.c index 77615009..c8bb88bc 100644 --- a/msm/sde/sde_connector.c +++ b/msm/sde/sde_connector.c @@ -2124,9 +2124,6 @@ static int sde_connector_atomic_check(struct drm_connector *connector, struct drm_connector_state *new_conn_state) { struct sde_connector *c_conn; - struct sde_connector_state *c_state; - bool qsync_dirty = false, has_modeset = false; - struct drm_crtc_state *new_crtc_state = NULL; if (!connector) { SDE_ERROR("invalid connector\n"); @@ -2139,24 +2136,6 @@ static int sde_connector_atomic_check(struct drm_connector *connector, } c_conn = to_sde_connector(connector); - c_state = to_sde_connector_state(new_conn_state); - - if (new_conn_state->crtc) - new_crtc_state = drm_atomic_get_new_crtc_state( - new_conn_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; - } if (c_conn->ops.atomic_check) return c_conn->ops.atomic_check(connector, diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 32c983ba..1a34c0ba 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -1113,6 +1113,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", @@ -1167,6 +1168,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 during modeset\n"); + return -EINVAL; + } + SDE_EVT32(DRMID(drm_enc), adj_mode->flags, adj_mode->private_flags); return ret; |