From 3720455502a6a4e5f629c263507337842846874c Mon Sep 17 00:00:00 2001 From: Adrian Salido Date: Tue, 11 Feb 2020 15:29:50 -0800 Subject: [PATCH] drm/msm: minimize qos remap updates Updating qos remap updates requires reading registers to update values, this adds additional CPU processing when in reality this update is only needed once. Bug: 142504774 Change-Id: Iec8d4dfd858b0602db7d2275b6b716dbcffe0d2f (cherry picked from commit dbd1cfbc21db4b9bd4f1a4fc234cedc314fa1265) Signed-off-by: Adrian Salido Signed-off-by: Samantha Tran --- msm/sde/sde_plane.c | 15 ++++++++++++--- msm/sde/sde_plane.h | 1 + 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/msm/sde/sde_plane.c b/msm/sde/sde_plane.c index abad3c2151..c367f98c93 100644 --- a/msm/sde/sde_plane.c +++ b/msm/sde/sde_plane.c @@ -3104,7 +3104,9 @@ static void _sde_plane_update_properties(struct drm_plane *plane, psde->pipe_hw->ops.setup_sharpening) _sde_plane_update_sharpening(psde); - _sde_plane_set_qos_lut(plane, crtc, fb); + if (pstate->dirty & (SDE_PLANE_DIRTY_QOS | SDE_PLANE_DIRTY_RECTS | + SDE_PLANE_DIRTY_FORMAT)) + _sde_plane_set_qos_lut(plane, crtc, fb); if (plane->type != DRM_PLANE_TYPE_CURSOR) { _sde_plane_set_qos_ctrl(plane, true, SDE_PLANE_QOS_PANIC_CTRL); @@ -3113,7 +3115,8 @@ static void _sde_plane_update_properties(struct drm_plane *plane, _sde_plane_set_ts_prefill(plane, pstate); } - _sde_plane_set_qos_remap(plane); + if (pstate->dirty & SDE_PLANE_DIRTY_QOS) + _sde_plane_set_qos_remap(plane); /* clear dirty */ pstate->dirty = 0x0; @@ -3130,6 +3133,7 @@ static int sde_plane_sspp_atomic_update(struct drm_plane *plane, struct drm_framebuffer *fb; int idx; int dirty_prop_flag; + bool is_rt; if (!plane) { SDE_ERROR("invalid plane\n"); @@ -3206,12 +3210,17 @@ static int sde_plane_sspp_atomic_update(struct drm_plane *plane, _sde_plane_set_scanout(plane, pstate, &psde->pipe_cfg, fb); + is_rt = sde_crtc_is_rt_client(crtc, crtc->state); + if (is_rt != psde->is_rt_pipe) { + psde->is_rt_pipe = is_rt; + pstate->dirty |= SDE_PLANE_DIRTY_QOS; + } + /* early out if nothing dirty */ if (!pstate->dirty) return 0; pstate->pending = true; - psde->is_rt_pipe = sde_crtc_is_rt_client(crtc, crtc->state); _sde_plane_set_qos_ctrl(plane, false, SDE_PLANE_QOS_PANIC_CTRL); _sde_plane_update_properties(plane, crtc, fb); diff --git a/msm/sde/sde_plane.h b/msm/sde/sde_plane.h index 316bd75f47..d055396421 100644 --- a/msm/sde/sde_plane.h +++ b/msm/sde/sde_plane.h @@ -36,6 +36,7 @@ #define SDE_PLANE_DIRTY_VIG_IGC 0x40 #define SDE_PLANE_DIRTY_DMA_IGC 0x80 #define SDE_PLANE_DIRTY_DMA_GC 0x100 +#define SDE_PLANE_DIRTY_QOS 0x200 #define SDE_PLANE_DIRTY_CP (SDE_PLANE_DIRTY_VIG_GAMUT |\ SDE_PLANE_DIRTY_VIG_IGC | SDE_PLANE_DIRTY_DMA_IGC |\ SDE_PLANE_DIRTY_DMA_GC)