summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaghavendra Ambadas <quic_c_rambad@quicinc.com>2021-08-13 20:18:01 +0530
committerRaghavendra Ambadas <quic_c_rambad@quicinc.com>2022-01-04 13:33:12 +0530
commit36e3a87435a5788daf6d2ab590d51fca5ebb11fa (patch)
treed0fdfbed256ca651d8fa02684a25ff2550cafb06
parent1ff0a561f09a033223408f459f8f8e0bf94141bf (diff)
downloaddisplay-drivers-36e3a87435a5788daf6d2ab590d51fca5ebb11fa.tar.gz
disp: msm: sde: switch rsc state before CTL_PREPARE in dual display
In dual display usecase when both displays comes out of idle following scenario will cause wr_ptr timeout. 1. Both displays goes to idle and RSCC enters Mode-2. 2. Primary display exit idle upon DRM commit N RSC enters Solver State. 3. Secondary display exits idle upon DRM commit M and waits on input fence after CTL_1_PREPARE is set. RSC is still in CMD state. 4. Primary Commit N frame transfer got successful and commit N+1 is queued in primary display when RSC in solver state which leads to timeout in primary. This is because RSCC will not generate a wakeup in sync with primary timelines leading to timeout. This is because RSCC still sees idle low thinking frame transfer is taking long time. This change will switch the rsc state to AMC mode before CTL_PREPARE is set which resolves such issue. Change-Id: Ic32e48b4febbbcc54d94876194d38fe6ef3d0981 Signed-off-by: Mahadevan <mahap@codeaurora.org> Signed-off-by: Raghavendra Ambadas <quic_c_rambad@quicinc.com>
-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