From 1b1618ed361f198a72afa95290d9b93695ecf754 Mon Sep 17 00:00:00 2001 From: Veera Sundaram Sankaran Date: Wed, 12 Oct 2022 14:54:41 -0700 Subject: [PATCH] disp: msm: sde: avoid setting plane qos_dirty during cwb modeset The encoder modeset updates all the plane's qos_dirty flag attached to the crtc to make sure the qos params are updated during seamless mode-switch cases like fps or resolution switch. But this is not required for cwb encoder modeset as it does not have any effect on the planes attached to the main display. Add check to avoid this reprogramming. Change-Id: I1ab7a71971b7200a50e6643407327734b1c9cbc5 Signed-off-by: Veera Sundaram Sankaran --- msm/sde/sde_crtc.c | 4 ++++ msm/sde/sde_encoder.c | 10 +++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c index a9d7b76fb3..35645ea2d2 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -6870,6 +6870,7 @@ void sde_crtc_set_qos_dirty(struct drm_crtc *crtc) struct drm_plane *plane; struct drm_plane_state *state; struct sde_plane_state *pstate; + u32 plane_mask = 0; drm_atomic_crtc_for_each_plane(plane, crtc) { state = plane->state; @@ -6879,7 +6880,10 @@ void sde_crtc_set_qos_dirty(struct drm_crtc *crtc) pstate = to_sde_plane_state(state); pstate->dirty |= SDE_PLANE_DIRTY_QOS; + plane_mask |= drm_plane_mask(plane); } + SDE_EVT32(DRMID(crtc), plane_mask); + sde_crtc_update_line_time(crtc); } diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index dcea4cd00a..1f9216e151 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -2643,7 +2643,13 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc, sde_enc->crtc = drm_enc->crtc; sde_crtc = to_sde_crtc(drm_enc->crtc); - sde_crtc_set_qos_dirty(drm_enc->crtc); + + crtc_state = sde_crtc->base.state; + sde_crtc_state = to_sde_crtc_state(crtc_state); + + if (!((sde_enc->disp_info.intf_type == DRM_MODE_CONNECTOR_VIRTUAL) && + ((sde_crtc_state->cached_cwb_enc_mask & drm_encoder_mask(drm_enc))))) + sde_crtc_set_qos_dirty(drm_enc->crtc); /* get and store the mode_info */ conn = sde_encoder_get_connector(sde_kms->dev, drm_enc); @@ -2672,8 +2678,6 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc, if (ret) return; - crtc_state = sde_crtc->base.state; - sde_crtc_state = to_sde_crtc_state(crtc_state); if ((sde_enc->disp_info.intf_type == DRM_MODE_CONNECTOR_VIRTUAL) && ((sde_crtc_state->cached_cwb_enc_mask & drm_encoder_mask(drm_enc)))) { SDE_EVT32(DRMID(drm_enc), sde_crtc_state->cwb_enc_mask,