summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorqctecmdr <qctecmdr@localhost>2022-01-19 07:43:35 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2022-01-19 07:43:35 -0800
commitebb58746239f7ec0fab19c1b98950e681ee97ba6 (patch)
tree3a8ad101eeeff0c9d60301b62c786991f9696a65
parenta5f50d3044ad61668cb762a99dc69b5ce89522f8 (diff)
parent36e3a87435a5788daf6d2ab590d51fca5ebb11fa (diff)
downloaddisplay-drivers-ebb58746239f7ec0fab19c1b98950e681ee97ba6.tar.gz
Merge "disp: msm: sde: switch rsc state before CTL_PREPARE in dual display"
-rw-r--r--msm/sde/sde_crtc.c3
-rw-r--r--msm/sde/sde_encoder.c42
-rw-r--r--msm/sde/sde_encoder.h8
3 files changed, 50 insertions, 3 deletions
diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c
index 46bb184a..c3b82852 100644
--- a/msm/sde/sde_crtc.c
+++ b/msm/sde/sde_crtc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014-2022 The Linux Foundation. All rights reserved.
* Copyright (C) 2013 Red Hat
* Author: Rob Clark <robdclark@gmail.com>
*
@@ -3194,6 +3194,7 @@ static void sde_crtc_atomic_begin(struct drm_crtc *crtc,
if (encoder->crtc != crtc)
continue;
+ sde_encoder_trigger_rsc_state_change(encoder);
/* encoder will trigger pending mask now */
sde_encoder_trigger_kickoff_pending(encoder);
}
diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c
index 691bbc22..733bad19 100644
--- a/msm/sde/sde_encoder.c
+++ b/msm/sde/sde_encoder.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014-2022, The Linux Foundation. All rights reserved.
* Copyright (C) 2013 Red Hat
* Author: Rob Clark <robdclark@gmail.com>
*
@@ -4398,6 +4398,46 @@ bool sde_encoder_check_curr_mode(struct drm_encoder *drm_enc, u32 mode)
return (disp_info->curr_panel_mode == mode);
}
+void sde_encoder_trigger_rsc_state_change(struct drm_encoder *drm_enc)
+{
+ struct sde_encoder_virt *sde_enc = NULL;
+ int ret = 0;
+
+ sde_enc = to_sde_encoder_virt(drm_enc);
+
+ if (!sde_enc)
+ return;
+
+ mutex_lock(&sde_enc->rc_lock);
+ /*
+ * In dual display case when secondary comes out of
+ * idle make sure RSC solver mode is disabled before
+ * setting CTL_PREPARE.
+ */
+ if (!sde_enc->cur_master ||
+ !sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE) ||
+ sde_enc->disp_info.display_type == SDE_CONNECTOR_PRIMARY ||
+ sde_enc->rc_state != SDE_ENC_RC_STATE_IDLE)
+ goto end;
+
+ /* enable all the clks and resources */
+ ret = _sde_encoder_resource_control_helper(drm_enc, true);
+ if (ret) {
+ SDE_ERROR_ENC(sde_enc, "rc in state %d\n", sde_enc->rc_state);
+ SDE_EVT32(DRMID(drm_enc), sde_enc->rc_state, SDE_EVTLOG_ERROR);
+ goto end;
+ }
+
+ _sde_encoder_update_rsc_client(drm_enc, true);
+
+ SDE_EVT32(DRMID(drm_enc), sde_enc->rc_state, SDE_ENC_RC_STATE_ON);
+ sde_enc->rc_state = SDE_ENC_RC_STATE_ON;
+
+end:
+ mutex_unlock(&sde_enc->rc_lock);
+}
+
+
void sde_encoder_trigger_kickoff_pending(struct drm_encoder *drm_enc)
{
struct sde_encoder_virt *sde_enc;
diff --git a/msm/sde/sde_encoder.h b/msm/sde/sde_encoder.h
index 48442767..0306459c 100644
--- a/msm/sde/sde_encoder.h
+++ b/msm/sde/sde_encoder.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015-2022, The Linux Foundation. All rights reserved.
* Copyright (C) 2013 Red Hat
* Author: Rob Clark <robdclark@gmail.com>
*
@@ -97,6 +97,12 @@ void sde_encoder_get_hw_resources(struct drm_encoder *encoder,
struct drm_connector_state *conn_state);
/**
+ * sde_encoder_trigger_rsc_state_change - rsc state change.
+ * @encoder: encoder pointer
+ */
+void sde_encoder_trigger_rsc_state_change(struct drm_encoder *drm_enc);
+
+/**
* sde_encoder_register_vblank_callback - provide callback to encoder that
* will be called on the next vblank.
* @encoder: encoder pointer