Prechádzať zdrojové kódy

disp: msm: sde: fix encoder parsing in atomic_check phase

During atomic_check phase the encoder_mask is taken
from old crtc->state leading to wrong validation.
Fix it by taking the encoder_mask from new crtc state.

Change-Id: Ifcfc4bee887168d8208ffdafb1cf5ea4c4473796
Signed-off-by: Veera Sundaram Sankaran <[email protected]>
Veera Sundaram Sankaran 6 rokov pred
rodič
commit
89511222a6
1 zmenil súbory, kde vykonal 12 pridanie a 20 odobranie
  1. 12 20
      msm/sde/sde_crtc.c

+ 12 - 20
msm/sde/sde_crtc.c

@@ -110,16 +110,6 @@ static inline struct sde_kms *_sde_crtc_get_kms(struct drm_crtc *crtc)
 	return to_sde_kms(priv->kms);
 }
 
-static inline struct drm_encoder *_sde_crtc_get_encoder(struct drm_crtc *crtc)
-{
-	struct drm_encoder *enc;
-
-	drm_for_each_encoder_mask(enc, crtc->dev, crtc->state->encoder_mask)
-		return enc;
-
-	return NULL;
-}
-
 /**
  * sde_crtc_calc_fps() - Calculates fps value.
  * @sde_crtc   : CRTC structure
@@ -3314,12 +3304,16 @@ static void sde_crtc_destroy_state(struct drm_crtc *crtc,
 
 	sde_crtc = to_sde_crtc(crtc);
 	cstate = to_sde_crtc_state(state);
-	enc = _sde_crtc_get_encoder(crtc);
 	sde_kms = _sde_crtc_get_kms(crtc);
 
+	if (!sde_kms) {
+		SDE_ERROR("invalid sde_kms\n");
+		return;
+	}
+
 	SDE_DEBUG("crtc%d\n", crtc->base.id);
 
-	if (sde_kms && enc)
+	drm_for_each_encoder_mask(enc, crtc->dev, state->encoder_mask)
 		sde_rm_release(&sde_kms->rm, enc, true);
 
 	__drm_atomic_helper_crtc_destroy_state(state);
@@ -4322,18 +4316,18 @@ static int _sde_crtc_check_secure_blend_config(struct drm_crtc *crtc,
 }
 
 static int _sde_crtc_check_secure_single_encoder(struct drm_crtc *crtc,
-	int fb_sec_dir)
+	struct drm_crtc_state *state, int fb_sec_dir)
 {
 	struct drm_encoder *encoder;
 	int encoder_cnt = 0;
 
 	if (fb_sec_dir) {
 		drm_for_each_encoder_mask(encoder, crtc->dev,
-			crtc->state->encoder_mask)
+				state->encoder_mask)
 			encoder_cnt++;
 
 		if (encoder_cnt > MAX_ALLOWED_ENCODER_CNT_PER_SECURE_CRTC) {
-			SDE_ERROR("crtc%d, invalid virtual encoder crtc%d\n",
+			SDE_ERROR("crtc:%d invalid number of encoders:%d\n",
 				DRMID(crtc), encoder_cnt);
 			return -EINVAL;
 		}
@@ -4349,11 +4343,9 @@ static int _sde_crtc_check_secure_state_smmu_translation(struct drm_crtc *crtc,
 	struct drm_encoder *encoder;
 	int is_video_mode = false;
 
-	drm_for_each_encoder_mask(encoder, crtc->dev,
-			crtc->state->encoder_mask) {
+	drm_for_each_encoder_mask(encoder, crtc->dev, state->encoder_mask)
 		is_video_mode |= sde_encoder_check_curr_mode(encoder,
-			MSM_DISPLAY_VIDEO_MODE);
-	}
+						MSM_DISPLAY_VIDEO_MODE);
 
 	/*
 	 * In video mode check for null commit before transition
@@ -4421,7 +4413,7 @@ static int _sde_crtc_check_secure_state(struct drm_crtc *crtc,
 	 * secure_crtc is not allowed in a shared toppolgy
 	 * across different encoders.
 	 */
-	rc = _sde_crtc_check_secure_single_encoder(crtc, fb_sec_dir);
+	rc = _sde_crtc_check_secure_single_encoder(crtc, state, fb_sec_dir);
 	if (rc)
 		return rc;