summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaviteja Tamatam <travitej@codeaurora.org>2020-11-18 14:06:27 +0530
committerRaviteja Tamatam <travitej@codeaurora.org>2020-11-19 17:49:45 +0530
commit04a22411da82f07ef11585d529dd072326dc0361 (patch)
tree61a5e4fa749df84fb33aba5af3dd277de3caa354
parente1b3d2f8dde4a2c257fad718b6618811d71c7119 (diff)
downloaddisplay-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.c21
-rw-r--r--msm/sde/sde_encoder.c14
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;