소스 검색

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 <[email protected]>
Signed-off-by: Samantha Tran <[email protected]>
Adrian Salido 5 년 전
부모
커밋
3720455502
2개의 변경된 파일13개의 추가작업 그리고 3개의 파일을 삭제
  1. 12 3
      msm/sde/sde_plane.c
  2. 1 0
      msm/sde/sde_plane.h

+ 12 - 3
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);

+ 1 - 0
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)