summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaviteja Tamatam <travitej@codeaurora.org>2020-11-18 13:50:16 +0530
committerRaviteja Tamatam <travitej@codeaurora.org>2020-11-19 17:42:57 +0530
commite1b3d2f8dde4a2c257fad718b6618811d71c7119 (patch)
treea14b24e3616318309b3b71405a5b59ec31e5f5ff
parent213d04499e661bed3b36a5294271706088a4964f (diff)
downloaddisplay-drivers-e1b3d2f8dde4a2c257fad718b6618811d71c7119.tar.gz
disp: msm: sde: support qsync and vrr in same commit
This change adds support to program both qsync and variable refresh rate in the same atomic commit. During dfps usecase, if qsync is enabled, avr ctrl gets programmed during prepare phase as well as after configuring timing engine. This change also handles such scenarios to prevent double programming of avr ctrl. Change-Id: Ia1a7ff135a8a70aca11836fc39ca349ff6d743d2 Signed-off-by: Raviteja Tamatam <travitej@codeaurora.org>
-rw-r--r--msm/sde/sde_connector.c8
-rw-r--r--msm/sde/sde_encoder_phys_vid.c12
2 files changed, 17 insertions, 3 deletions
diff --git a/msm/sde/sde_connector.c b/msm/sde/sde_connector.c
index 28247f33..77615009 100644
--- a/msm/sde/sde_connector.c
+++ b/msm/sde/sde_connector.c
@@ -2126,6 +2126,7 @@ static int sde_connector_atomic_check(struct drm_connector *connector,
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");
@@ -2140,6 +2141,10 @@ 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,
@@ -2147,7 +2152,8 @@ static int sde_connector_atomic_check(struct drm_connector *connector,
CONNECTOR_PROP_QSYNC_MODE);
SDE_DEBUG("has_modeset %d qsync_dirty %d\n", has_modeset, qsync_dirty);
- if (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;
}
diff --git a/msm/sde/sde_encoder_phys_vid.c b/msm/sde/sde_encoder_phys_vid.c
index 54faa7cb..a10939ec 100644
--- a/msm/sde/sde_encoder_phys_vid.c
+++ b/msm/sde/sde_encoder_phys_vid.c
@@ -1125,13 +1125,21 @@ static void sde_encoder_phys_vid_handle_post_kickoff(
static void sde_encoder_phys_vid_prepare_for_commit(
struct sde_encoder_phys *phys_enc)
{
+ struct drm_crtc *crtc;
- if (!phys_enc) {
+ if (!phys_enc || !phys_enc->parent) {
SDE_ERROR("invalid encoder parameters\n");
return;
}
- if (sde_connector_is_qsync_updated(phys_enc->connector))
+ crtc = phys_enc->parent->crtc;
+ if (!crtc || !crtc->state) {
+ SDE_ERROR("invalid crtc or crtc state\n");
+ return;
+ }
+
+ if (!msm_is_mode_seamless_vrr(&crtc->state->adjusted_mode) &&
+ sde_connector_is_qsync_updated(phys_enc->connector))
_sde_encoder_phys_vid_avr_ctrl(phys_enc);
}