Explorar o código

drm: msm: sde: cache plane csc in sde plane state

Pipe csc configuration is being cached in the sde plane which can cause
race conditions between hardware programming and caching.
All drm properties should be cached in sde plane state to avoid race
conditions. Change moves caching to sde plane state.

Change-Id: I22470a82b2fc2812f8c526ababc2b517db13a3ce
Signed-off-by: Gopikrishnaiah Anand <[email protected]>
Gopikrishnaiah Anand %!s(int64=2) %!d(string=hai) anos
pai
achega
7780b7a8c2
Modificáronse 2 ficheiros con 31 adicións e 28 borrados
  1. 24 24
      msm/sde/sde_plane.c
  2. 7 4
      msm/sde/sde_plane.h

+ 24 - 24
msm/sde/sde_plane.c

@@ -1102,7 +1102,7 @@ static void _sde_plane_setup_pixel_ext(struct sde_plane *psde,
 	}
 	}
 }
 }
 
 
-static inline void _sde_plane_setup_csc(struct sde_plane *psde)
+static inline void _sde_plane_setup_csc(struct sde_plane *psde, struct sde_plane_state *pstate)
 {
 {
 	static const struct sde_csc_cfg sde_csc_YUV2RGB_601L = {
 	static const struct sde_csc_cfg sde_csc_YUV2RGB_601L = {
 		{
 		{
@@ -1133,23 +1133,23 @@ static inline void _sde_plane_setup_csc(struct sde_plane *psde)
 		{ 0x00, 0x3ff, 0x00, 0x3ff, 0x00, 0x3ff,},
 		{ 0x00, 0x3ff, 0x00, 0x3ff, 0x00, 0x3ff,},
 	};
 	};
 
 
-	if (!psde) {
+	if (!psde || !pstate) {
 		SDE_ERROR("invalid plane\n");
 		SDE_ERROR("invalid plane\n");
 		return;
 		return;
 	}
 	}
 
 
 	/* revert to kernel default if override not available */
 	/* revert to kernel default if override not available */
-	if (psde->csc_usr_ptr)
-		psde->csc_ptr = psde->csc_usr_ptr;
+	if (pstate->csc_usr_ptr)
+		pstate->csc_ptr = pstate->csc_usr_ptr;
 	else if (BIT(SDE_SSPP_CSC_10BIT) & psde->features)
 	else if (BIT(SDE_SSPP_CSC_10BIT) & psde->features)
-		psde->csc_ptr = (struct sde_csc_cfg *)&sde_csc10_YUV2RGB_601L;
+		pstate->csc_ptr = (struct sde_csc_cfg *)&sde_csc10_YUV2RGB_601L;
 	else
 	else
-		psde->csc_ptr = (struct sde_csc_cfg *)&sde_csc_YUV2RGB_601L;
+		pstate->csc_ptr = (struct sde_csc_cfg *)&sde_csc_YUV2RGB_601L;
 
 
 	SDE_DEBUG_PLANE(psde, "using 0x%X 0x%X 0x%X...\n",
 	SDE_DEBUG_PLANE(psde, "using 0x%X 0x%X 0x%X...\n",
-			psde->csc_ptr->csc_mv[0],
-			psde->csc_ptr->csc_mv[1],
-			psde->csc_ptr->csc_mv[2]);
+			pstate->csc_ptr->csc_mv[0],
+			pstate->csc_ptr->csc_mv[1],
+			pstate->csc_ptr->csc_mv[2]);
 }
 }
 
 
 static void sde_color_process_plane_setup(struct drm_plane *plane)
 static void sde_color_process_plane_setup(struct drm_plane *plane)
@@ -2842,8 +2842,8 @@ void sde_plane_flush(struct drm_plane *plane)
 	else if (psde->color_fill & SDE_PLANE_COLOR_FILL_FLAG)
 	else if (psde->color_fill & SDE_PLANE_COLOR_FILL_FLAG)
 		/* force 100% alpha */
 		/* force 100% alpha */
 		_sde_plane_color_fill(psde, psde->color_fill, 0xFF);
 		_sde_plane_color_fill(psde, psde->color_fill, 0xFF);
-	else if (psde->pipe_hw && psde->csc_ptr && psde->pipe_hw->ops.setup_csc)
-		psde->pipe_hw->ops.setup_csc(psde->pipe_hw, psde->csc_ptr);
+	else if (psde->pipe_hw && pstate->csc_ptr && psde->pipe_hw->ops.setup_csc)
+		psde->pipe_hw->ops.setup_csc(psde->pipe_hw, pstate->csc_ptr);
 
 
 	/* flag h/w flush complete */
 	/* flag h/w flush complete */
 	if (plane->state)
 	if (plane->state)
@@ -3266,9 +3266,9 @@ static void _sde_plane_update_format_and_rects(struct sde_plane *psde,
 
 
 	/* update csc */
 	/* update csc */
 	if (SDE_FORMAT_IS_YUV(fmt))
 	if (SDE_FORMAT_IS_YUV(fmt))
-		_sde_plane_setup_csc(psde);
+		_sde_plane_setup_csc(psde, pstate);
 	else
 	else
-		psde->csc_ptr = 0;
+		pstate->csc_ptr = 0;
 
 
 	if (psde->pipe_hw->ops.setup_inverse_pma) {
 	if (psde->pipe_hw->ops.setup_inverse_pma) {
 		uint32_t pma_mode = 0;
 		uint32_t pma_mode = 0;
@@ -3282,7 +3282,7 @@ static void _sde_plane_update_format_and_rects(struct sde_plane *psde,
 
 
 	if (psde->pipe_hw->ops.setup_dgm_csc)
 	if (psde->pipe_hw->ops.setup_dgm_csc)
 		psde->pipe_hw->ops.setup_dgm_csc(psde->pipe_hw,
 		psde->pipe_hw->ops.setup_dgm_csc(psde->pipe_hw,
-			pstate->multirect_index, psde->csc_usr_ptr);
+			pstate->multirect_index, pstate->csc_usr_ptr);
 
 
 	if (psde->pipe_hw->ops.set_ubwc_stats_roi) {
 	if (psde->pipe_hw->ops.set_ubwc_stats_roi) {
 		if (SDE_FORMAT_IS_UBWC(fmt) && !SDE_FORMAT_IS_YUV(fmt))
 		if (SDE_FORMAT_IS_UBWC(fmt) && !SDE_FORMAT_IS_YUV(fmt))
@@ -4122,17 +4122,17 @@ static void _sde_plane_install_properties(struct drm_plane *plane,
 }
 }
 
 
 static inline void _sde_plane_set_csc_v1(struct sde_plane *psde,
 static inline void _sde_plane_set_csc_v1(struct sde_plane *psde,
-		void __user *usr_ptr)
+		void __user *usr_ptr, struct sde_plane_state *pstate)
 {
 {
 	struct sde_drm_csc_v1 csc_v1;
 	struct sde_drm_csc_v1 csc_v1;
 	int i;
 	int i;
 
 
-	if (!psde) {
+	if (!psde || !pstate) {
 		SDE_ERROR("invalid plane\n");
 		SDE_ERROR("invalid plane\n");
 		return;
 		return;
 	}
 	}
 
 
-	psde->csc_usr_ptr = NULL;
+	pstate->csc_usr_ptr = NULL;
 	if (!usr_ptr) {
 	if (!usr_ptr) {
 		SDE_DEBUG_PLANE(psde, "csc data removed\n");
 		SDE_DEBUG_PLANE(psde, "csc data removed\n");
 		return;
 		return;
@@ -4145,16 +4145,16 @@ static inline void _sde_plane_set_csc_v1(struct sde_plane *psde,
 
 
 	/* populate from user space */
 	/* populate from user space */
 	for (i = 0; i < SDE_CSC_MATRIX_COEFF_SIZE; ++i)
 	for (i = 0; i < SDE_CSC_MATRIX_COEFF_SIZE; ++i)
-		psde->csc_cfg.csc_mv[i] = csc_v1.ctm_coeff[i] >> 16;
+		pstate->csc_cfg.csc_mv[i] = csc_v1.ctm_coeff[i] >> 16;
 	for (i = 0; i < SDE_CSC_BIAS_SIZE; ++i) {
 	for (i = 0; i < SDE_CSC_BIAS_SIZE; ++i) {
-		psde->csc_cfg.csc_pre_bv[i] = csc_v1.pre_bias[i];
-		psde->csc_cfg.csc_post_bv[i] = csc_v1.post_bias[i];
+		pstate->csc_cfg.csc_pre_bv[i] = csc_v1.pre_bias[i];
+		pstate->csc_cfg.csc_post_bv[i] = csc_v1.post_bias[i];
 	}
 	}
 	for (i = 0; i < SDE_CSC_CLAMP_SIZE; ++i) {
 	for (i = 0; i < SDE_CSC_CLAMP_SIZE; ++i) {
-		psde->csc_cfg.csc_pre_lv[i] = csc_v1.pre_clamp[i];
-		psde->csc_cfg.csc_post_lv[i] = csc_v1.post_clamp[i];
+		pstate->csc_cfg.csc_pre_lv[i] = csc_v1.pre_clamp[i];
+		pstate->csc_cfg.csc_post_lv[i] = csc_v1.post_clamp[i];
 	}
 	}
-	psde->csc_usr_ptr = &psde->csc_cfg;
+	pstate->csc_usr_ptr = &pstate->csc_cfg;
 }
 }
 
 
 static inline void _sde_plane_set_scaler_v1(struct sde_plane *psde,
 static inline void _sde_plane_set_scaler_v1(struct sde_plane *psde,
@@ -4391,7 +4391,7 @@ static int sde_plane_atomic_set_property(struct drm_plane *plane,
 				break;
 				break;
 			case PLANE_PROP_CSC_V1:
 			case PLANE_PROP_CSC_V1:
 			case PLANE_PROP_CSC_DMA_V1:
 			case PLANE_PROP_CSC_DMA_V1:
-				_sde_plane_set_csc_v1(psde, (void __user *)val);
+				_sde_plane_set_csc_v1(psde, (void __user *)val, pstate);
 				break;
 				break;
 			case PLANE_PROP_SCALER_V1:
 			case PLANE_PROP_SCALER_V1:
 				_sde_plane_set_scaler_v1(psde, pstate,
 				_sde_plane_set_scaler_v1(psde, pstate,

+ 7 - 4
msm/sde/sde_plane.h

@@ -82,10 +82,6 @@ struct sde_plane {
 	bool revalidate;
 	bool revalidate;
 	bool xin_halt_forced_clk;
 	bool xin_halt_forced_clk;
 
 
-	struct sde_csc_cfg csc_cfg;
-	struct sde_csc_cfg *csc_usr_ptr;
-	struct sde_csc_cfg *csc_ptr;
-
 	uint32_t cached_lut_flag;
 	uint32_t cached_lut_flag;
 	struct sde_hw_scaler3_cfg scaler3_cfg;
 	struct sde_hw_scaler3_cfg scaler3_cfg;
 	struct sde_hw_pixel_ext pixel_ext;
 	struct sde_hw_pixel_ext pixel_ext;
@@ -171,6 +167,9 @@ enum sde_plane_sclcheck_state {
  * @ubwc_stats_roi: cached roi for ubwc stats
  * @ubwc_stats_roi: cached roi for ubwc stats
  * @line_insertion_cfg: line insertion configuration
  * @line_insertion_cfg: line insertion configuration
  * @lineinsertion_feature:	panel line insertion feature
  * @lineinsertion_feature:	panel line insertion feature
+ * @csc_cfg: csc configuration for pipe
+ * @csc_usr_ptr: valid user override configuration for csc
+ * @csc_ptr: default csc configuration
  */
  */
 struct sde_plane_state {
 struct sde_plane_state {
 	struct drm_plane_state base;
 	struct drm_plane_state base;
@@ -209,6 +208,10 @@ struct sde_plane_state {
 	struct sde_drm_ubwc_stats_roi ubwc_stats_roi;
 	struct sde_drm_ubwc_stats_roi ubwc_stats_roi;
 	struct sde_hw_pipe_line_insertion_cfg line_insertion_cfg;
 	struct sde_hw_pipe_line_insertion_cfg line_insertion_cfg;
 	bool lineinsertion_feature;
 	bool lineinsertion_feature;
+
+	struct sde_csc_cfg csc_cfg;
+	struct sde_csc_cfg *csc_usr_ptr;
+	struct sde_csc_cfg *csc_ptr;
 };
 };
 
 
 /**
 /**