diff options
author | qctecmdr <qctecmdr@localhost> | 2022-01-19 07:43:35 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2022-01-19 07:43:35 -0800 |
commit | ebb58746239f7ec0fab19c1b98950e681ee97ba6 (patch) | |
tree | 3a8ad101eeeff0c9d60301b62c786991f9696a65 | |
parent | a5f50d3044ad61668cb762a99dc69b5ce89522f8 (diff) | |
parent | 36e3a87435a5788daf6d2ab590d51fca5ebb11fa (diff) | |
download | display-drivers-ebb58746239f7ec0fab19c1b98950e681ee97ba6.tar.gz |
Merge "disp: msm: sde: switch rsc state before CTL_PREPARE in dual display"
-rw-r--r-- | msm/sde/sde_crtc.c | 3 | ||||
-rw-r--r-- | msm/sde/sde_encoder.c | 42 | ||||
-rw-r--r-- | msm/sde/sde_encoder.h | 8 |
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 |