drm/msm/sde: program pixel extension from scalar config from sde plane

Avoid implicit programming of pixel extension and scalar blocks
of an SSPP by programming them from sde plane.

Change-Id: Iac324e7d75f29ebf4b3d8bd2edc38b62c98d5193
Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
diff --git a/drivers/gpu/drm/msm/sde/sde_hw_sspp.c b/drivers/gpu/drm/msm/sde/sde_hw_sspp.c
index c7f6809..f8fa472 100644
--- a/drivers/gpu/drm/msm/sde/sde_hw_sspp.c
+++ b/drivers/gpu/drm/msm/sde/sde_hw_sspp.c
@@ -751,9 +751,7 @@
  */
 static void sde_hw_sspp_setup_rects(struct sde_hw_pipe *ctx,
 		struct sde_hw_pipe_cfg *cfg,
-		struct sde_hw_pixel_ext *pe_ext,
-		enum sde_sspp_multirect_index rect_index,
-		void *scale_cfg)
+		enum sde_sspp_multirect_index rect_index)
 {
 	struct sde_hw_blk_reg_map *c;
 	u32 src_size, src_xy, dst_size, dst_xy, ystride0, ystride1;
@@ -778,9 +776,6 @@
 		out_xy_off = SSPP_OUT_XY_REC1;
 	}
 
-	/* program pixel extension override */
-	if (pe_ext)
-		sde_hw_sspp_setup_pe_config(ctx, pe_ext);
 
 	/* src and dest rect programming */
 	src_xy = (cfg->src_rect.y << 16) | (cfg->src_rect.x);
@@ -811,7 +806,6 @@
 		/* program decimation */
 		decimation = ((1 << cfg->horz_decimation) - 1) << 8;
 		decimation |= ((1 << cfg->vert_decimation) - 1);
-		ctx->ops.setup_scaler(ctx, cfg, pe_ext, scale_cfg);
 	}
 
 	/* rectangle register programming */
@@ -1000,6 +994,7 @@
 		c->ops.setup_rects = sde_hw_sspp_setup_rects;
 		c->ops.setup_sourceaddress = sde_hw_sspp_setup_sourceaddress;
 		c->ops.setup_solidfill = sde_hw_sspp_setup_solidfill;
+		c->ops.setup_pe = sde_hw_sspp_setup_pe_config;
 	}
 
 	if (test_bit(SDE_SSPP_EXCL_RECT, &features))
@@ -1016,16 +1011,16 @@
 		test_bit(SDE_SSPP_CSC_10BIT, &features))
 		c->ops.setup_csc = sde_hw_sspp_setup_csc;
 
-	if (test_bit(SDE_SSPP_SCALER_QSEED2, &features))
+	if (test_bit(SDE_SSPP_SCALER_QSEED2, &features)) {
 		c->ops.setup_sharpening = sde_hw_sspp_setup_sharpening;
+		c->ops.setup_scaler = _sde_hw_sspp_setup_scaler;
+	}
 
 	if (sde_hw_sspp_multirect_enabled(c->cap))
 		c->ops.setup_multirect = sde_hw_sspp_setup_multirect;
 
 	if (test_bit(SDE_SSPP_SCALER_QSEED3, &features))
 		c->ops.setup_scaler = _sde_hw_sspp_setup_scaler3;
-	else
-		c->ops.setup_scaler = _sde_hw_sspp_setup_scaler;
 
 	if (test_bit(SDE_SSPP_HSIC, &features)) {
 		/* TODO: add version based assignment here as inline or macro */
diff --git a/drivers/gpu/drm/msm/sde/sde_hw_sspp.h b/drivers/gpu/drm/msm/sde/sde_hw_sspp.h
index d81f673..a224234 100644
--- a/drivers/gpu/drm/msm/sde/sde_hw_sspp.h
+++ b/drivers/gpu/drm/msm/sde/sde_hw_sspp.h
@@ -328,15 +328,19 @@
 	 * setup_rects - setup pipe ROI rectangles
 	 * @ctx: Pointer to pipe context
 	 * @cfg: Pointer to pipe config structure
-	 * @pe_ext: Pointer to pixel ext settings
 	 * @index: rectangle index in multirect
-	 * @scale_cfg: Pointer to scaler settings
 	 */
 	void (*setup_rects)(struct sde_hw_pipe *ctx,
 			struct sde_hw_pipe_cfg *cfg,
-			struct sde_hw_pixel_ext *pe_ext,
-			enum sde_sspp_multirect_index index,
-			void *scale_cfg);
+			enum sde_sspp_multirect_index index);
+
+	/**
+	 * setup_pe - setup pipe pixel extension
+	 * @ctx: Pointer to pipe context
+	 * @pe_ext: Pointer to pixel ext settings
+	 */
+	void (*setup_pe)(struct sde_hw_pipe *ctx,
+			struct sde_hw_pixel_ext *pe_ext);
 
 	/**
 	 * setup_excl_rect - setup pipe exclusion rectangle
diff --git a/drivers/gpu/drm/msm/sde/sde_plane.c b/drivers/gpu/drm/msm/sde/sde_plane.c
index 8ff08dc..e144a0d 100644
--- a/drivers/gpu/drm/msm/sde/sde_plane.c
+++ b/drivers/gpu/drm/msm/sde/sde_plane.c
@@ -1104,8 +1104,6 @@
 		psde->pipe_cfg.src_rect.w = psde->pipe_cfg.dst_rect.w;
 		psde->pipe_cfg.src_rect.h = psde->pipe_cfg.dst_rect.h;
 
-		_sde_plane_setup_scaler(psde, fmt, 0);
-
 		if (psde->pipe_hw->ops.setup_format)
 			psde->pipe_hw->ops.setup_format(psde->pipe_hw,
 					fmt, SDE_SSPP_SOLID_FILL,
@@ -1113,9 +1111,13 @@
 
 		if (psde->pipe_hw->ops.setup_rects)
 			psde->pipe_hw->ops.setup_rects(psde->pipe_hw,
-					&psde->pipe_cfg, &psde->pixel_ext,
-					pstate->multirect_index,
-					psde->scaler3_cfg);
+					&psde->pipe_cfg,
+					pstate->multirect_index);
+
+		_sde_plane_setup_scaler(psde, fmt, 0);
+		if (psde->pipe_hw->ops.setup_pe)
+			psde->pipe_hw->ops.setup_pe(psde->pipe_hw,
+					&psde->pixel_ext);
 	}
 
 	return 0;
@@ -1238,14 +1240,21 @@
 			/* skip remaining processing on color fill */
 			pstate->dirty = 0x0;
 		} else if (psde->pipe_hw->ops.setup_rects) {
-			_sde_plane_setup_scaler(psde, fmt, pstate);
-
 			psde->pipe_hw->ops.setup_rects(psde->pipe_hw,
-					&psde->pipe_cfg, &psde->pixel_ext,
-					pstate->multirect_index,
-					psde->scaler3_cfg);
+					&psde->pipe_cfg,
+					pstate->multirect_index);
 		}
 
+		_sde_plane_setup_scaler(psde, fmt, pstate);
+		if (psde->pipe_hw->ops.setup_pe)
+			psde->pipe_hw->ops.setup_pe(psde->pipe_hw,
+					&psde->pixel_ext);
+
+		if (psde->pipe_hw->ops.setup_scaler)
+			psde->pipe_hw->ops.setup_scaler(psde->pipe_hw,
+					&psde->pipe_cfg, &psde->pixel_ext,
+					psde->scaler3_cfg);
+
 		/* update excl rect */
 		if (psde->pipe_hw->ops.setup_excl_rect)
 			psde->pipe_hw->ops.setup_excl_rect(psde->pipe_hw,