Browse Source

disp: msm: sde: avoid resetting blend stage in every commit

Move blendstage initialization to the atomic begin path in the
case where mixers are not setup. Additionally, clear all
blendstages during crtc disable to clean up registers.
This will avoid resetting each of the blend stages in every
commit and then writing only to the layer being used.

Change-Id: Idf7cb3e17de37034c2060f2563bc082fceb5cae9
Signed-off-by: Samantha Tran <[email protected]>
Samantha Tran 5 years ago
parent
commit
5880783aa3
1 changed files with 19 additions and 4 deletions
  1. 19 4
      msm/sde/sde_crtc.c

+ 19 - 4
msm/sde/sde_crtc.c

@@ -1546,14 +1546,11 @@ static void _sde_crtc_blend_setup(struct drm_crtc *crtc,
 	}
 
 	for (i = 0; i < sde_crtc->num_mixers; i++) {
-		if (!mixer[i].hw_lm || !mixer[i].hw_ctl) {
+		if (!mixer[i].hw_lm) {
 			SDE_ERROR("invalid lm or ctl assigned to mixer\n");
 			return;
 		}
 		mixer[i].mixer_op_mode = 0;
-		if (mixer[i].hw_ctl->ops.clear_all_blendstages)
-			mixer[i].hw_ctl->ops.clear_all_blendstages(
-					mixer[i].hw_ctl);
 
 		/* clear dim_layer settings */
 		lm = mixer[i].hw_lm;
@@ -3078,6 +3075,22 @@ static void _sde_crtc_setup_lm_bounds(struct drm_crtc *crtc,
 	drm_mode_debug_printmodeline(adj_mode);
 }
 
+static void _sde_crtc_clear_all_blend_stages(struct sde_crtc *sde_crtc)
+{
+	struct sde_crtc_mixer mixer;
+
+	/*
+	 * Use mixer[0] to get hw_ctl which will use ops to clear
+	 * all blendstages. Clear all blendstages will iterate through
+	 * all mixers.
+	 */
+	if (sde_crtc->num_mixers) {
+		mixer = sde_crtc->mixers[0];
+		if (mixer.hw_ctl && mixer.hw_ctl->ops.clear_all_blendstages)
+			mixer.hw_ctl->ops.clear_all_blendstages(mixer.hw_ctl);
+	}
+}
+
 static void sde_crtc_atomic_begin(struct drm_crtc *crtc,
 		struct drm_crtc_state *old_state)
 {
@@ -3119,6 +3132,7 @@ static void sde_crtc_atomic_begin(struct drm_crtc *crtc,
 		_sde_crtc_setup_mixers(crtc);
 		_sde_crtc_setup_is_ppsplit(crtc->state);
 		_sde_crtc_setup_lm_bounds(crtc, crtc->state);
+		_sde_crtc_clear_all_blend_stages(sde_crtc);
 	}
 
 	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
@@ -3999,6 +4013,7 @@ static void sde_crtc_disable(struct drm_crtc *crtc)
 					ktime_get());
 	}
 
+	_sde_crtc_clear_all_blend_stages(sde_crtc);
 	memset(sde_crtc->mixers, 0, sizeof(sde_crtc->mixers));
 	sde_crtc->num_mixers = 0;
 	sde_crtc->mixers_swapped = false;