[PATCH 18/20] drm/i915: Prepare atomic plane check for bigjoiner planes

Maarten Lankhorst maarten.lankhorst at linux.intel.com
Fri Aug 16 09:41:10 UTC 2019


A lot of delta, the main difference is that the master_plane_state is
not the same plane_state as being written to.

We read all properties like color key, crtc, fb, rotation from the
master_plane_state and coordinate properties.

The coordinate properties are different between the 2 bigjoiner planes,
as one gets the left and the other gets the right side.

Fortunately the drm core already has a src and dst rect, so we write
those for each plane separately.

In case of cursor, we don't use the clipped coordinates, but the raw
source coordinates from the master_plane_state instead.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_atomic.c   |   7 +-
 .../gpu/drm/i915/display/intel_atomic_plane.c |  84 ++++++-
 .../gpu/drm/i915/display/intel_atomic_plane.h |   8 +-
 drivers/gpu/drm/i915/display/intel_display.c  | 209 ++++++++++--------
 drivers/gpu/drm/i915/display/intel_display.h  |   5 +-
 .../drm/i915/display/intel_display_types.h    |   1 +
 drivers/gpu/drm/i915/display/intel_sprite.c   |  71 +++---
 drivers/gpu/drm/i915/display/intel_sprite.h   |   6 +-
 8 files changed, 251 insertions(+), 140 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_atomic.c b/drivers/gpu/drm/i915/display/intel_atomic.c
index e694b7157bbf..246d1f0815fa 100644
--- a/drivers/gpu/drm/i915/display/intel_atomic.c
+++ b/drivers/gpu/drm/i915/display/intel_atomic.c
@@ -297,9 +297,10 @@ static void intel_atomic_setup_scaler(struct intel_crtc_scaler_state *scaler_sta
 		return;
 
 	/* set scaler mode */
-	if (plane_state && plane_state->base.fb &&
-	    plane_state->base.fb->format->is_yuv &&
-	    plane_state->base.fb->format->num_planes > 1) {
+	if (plane_state && (plane_state->linked_plane ||
+	     (!plane_state->bigjoiner_slave && plane_state->base.fb &&
+	      plane_state->base.fb->format->is_yuv &&
+	      plane_state->base.fb->format->num_planes > 1))) {
 		struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
 		if (IS_GEN(dev_priv, 9) &&
 		    !IS_GEMINILAKE(dev_priv)) {
diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.c b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
index 5e995fc7a1be..0f5e896b9b9b 100644
--- a/drivers/gpu/drm/i915/display/intel_atomic_plane.c
+++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
@@ -115,10 +115,11 @@ intel_plane_destroy_state(struct drm_plane *plane,
 	drm_atomic_helper_plane_destroy_state(plane, state);
 }
 
-unsigned int intel_plane_data_rate(const struct intel_crtc_state *crtc_state,
-				   const struct intel_plane_state *plane_state)
+static unsigned int intel_plane_data_rate(const struct intel_crtc_state *crtc_state,
+					  const struct intel_plane_state *master_plane_state,
+					  const struct intel_plane_state *plane_state)
 {
-	const struct drm_framebuffer *fb = plane_state->base.fb;
+	const struct drm_framebuffer *fb = master_plane_state->base.fb;
 	unsigned int cpp;
 
 	if (!plane_state->base.visible)
@@ -143,7 +144,11 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_
 					const struct intel_plane_state *old_plane_state,
 					struct intel_plane_state *new_plane_state)
 {
+	const struct intel_plane_state *new_master_plane_state = new_plane_state;
+	const struct intel_plane_state *old_master_plane_state = old_plane_state;
 	struct intel_plane *plane = to_intel_plane(new_plane_state->base.plane);
+	struct intel_atomic_state *state =
+		to_intel_atomic_state(new_plane_state->base.state);
 	int ret;
 
 	new_crtc_state->active_planes &= ~BIT(plane->id);
@@ -152,10 +157,16 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_
 	new_crtc_state->data_rate[plane->id] = 0;
 	new_plane_state->base.visible = false;
 
-	if (!new_plane_state->base.crtc && !old_plane_state->base.crtc)
+	if (old_plane_state->bigjoiner_slave)
+		old_master_plane_state = intel_atomic_get_old_plane_state(state, old_plane_state->bigjoiner_plane);
+
+	if (new_plane_state->bigjoiner_slave)
+		new_master_plane_state = intel_atomic_get_new_plane_state(state, new_plane_state->bigjoiner_plane);
+
+	if (!new_master_plane_state->base.crtc && !old_master_plane_state->base.crtc)
 		return 0;
 
-	ret = plane->check_plane(new_crtc_state, new_plane_state);
+	ret = plane->check_plane(new_crtc_state, new_master_plane_state, new_plane_state);
 	if (ret)
 		return ret;
 
@@ -164,21 +175,22 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_
 		new_crtc_state->active_planes |= BIT(plane->id);
 
 	if (new_plane_state->base.visible &&
-	    drm_format_info_is_yuv_semiplanar(new_plane_state->base.fb->format))
+	    drm_format_info_is_yuv_semiplanar(new_master_plane_state->base.fb->format))
 		new_crtc_state->nv12_planes |= BIT(plane->id);
 
 	if (new_plane_state->base.visible &&
-	    new_plane_state->base.fb->format->format == DRM_FORMAT_C8)
+	    new_master_plane_state->base.fb->format->format == DRM_FORMAT_C8)
 		new_crtc_state->c8_planes |= BIT(plane->id);
 
 	if (new_plane_state->base.visible || old_plane_state->base.visible)
 		new_crtc_state->update_planes |= BIT(plane->id);
 
 	new_crtc_state->data_rate[plane->id] =
-		intel_plane_data_rate(new_crtc_state, new_plane_state);
+		intel_plane_data_rate(new_crtc_state, new_master_plane_state, new_plane_state);
 
 	return intel_plane_atomic_calc_changes(old_crtc_state, new_crtc_state,
-					       old_plane_state, new_plane_state);
+					       old_plane_state, new_master_plane_state,
+					       new_plane_state);
 }
 
 struct intel_crtc *
@@ -440,6 +452,60 @@ void i9xx_update_planes_on_crtc(struct intel_atomic_state *state,
 	}
 }
 
+
+int intel_atomic_plane_check_scaling(struct intel_crtc_state *crtc_state,
+				     const struct intel_plane_state *master_plane_state,
+				     struct intel_plane_state *plane_state,
+				     int min_scale, int max_scale)
+{
+	struct drm_framebuffer *fb = master_plane_state->base.fb;
+	struct drm_rect *src = &plane_state->base.src;
+	struct drm_rect *dst = &plane_state->base.dst;
+	unsigned int rotation = master_plane_state->base.rotation;
+	struct drm_rect clip = {};
+	int hscale, vscale;
+
+	*src = drm_plane_state_src(&master_plane_state->base);
+	*dst = drm_plane_state_dest(&master_plane_state->base);
+
+	if (!fb) {
+		plane_state->base.visible = false;
+		return 0;
+	}
+
+	drm_rect_rotate(src, fb->width << 16, fb->height << 16, rotation);
+
+	/* Check scaling */
+	hscale = drm_rect_calc_hscale(src, dst, min_scale, max_scale);
+	vscale = drm_rect_calc_vscale(src, dst, min_scale, max_scale);
+	if (hscale < 0 || vscale < 0) {
+		DRM_DEBUG_KMS("Invalid scaling of plane\n");
+		drm_rect_debug_print("src: ", src, true);
+		drm_rect_debug_print("dst: ", dst, false);
+		return -ERANGE;
+	}
+
+	if (crtc_state->hw.enable) {
+		clip.x2 = crtc_state->pipe_src_w;
+		clip.y2 = crtc_state->pipe_src_h;
+	}
+
+	/* right side of the image is on the slave crtc, adjust dst to match */
+	if (crtc_state->bigjoiner_slave)
+		drm_rect_translate(dst, -crtc_state->pipe_src_w, 0);
+
+	/*
+	 * FIXME: This might need further adjustment for seamless scaling
+	 * with phase information, for the 2p2 and 2p1 scenarios.
+	 */
+
+	plane_state->base.visible = drm_rect_clip_scaled(src, dst, &clip);
+
+	drm_rect_rotate_inv(src, fb->width << 16, fb->height << 16, rotation);
+
+	return 0;
+}
+
 const struct drm_plane_helper_funcs intel_plane_helper_funcs = {
 	.prepare_fb = intel_prepare_plane_fb,
 	.cleanup_fb = intel_cleanup_plane_fb,
diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.h b/drivers/gpu/drm/i915/display/intel_atomic_plane.h
index 1cffda2b50b5..c98ccf8114c3 100644
--- a/drivers/gpu/drm/i915/display/intel_atomic_plane.h
+++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.h
@@ -18,8 +18,6 @@ struct intel_plane_state;
 
 extern const struct drm_plane_helper_funcs intel_plane_helper_funcs;
 
-unsigned int intel_plane_data_rate(const struct intel_crtc_state *crtc_state,
-				   const struct intel_plane_state *plane_state);
 void intel_update_plane(struct intel_plane *plane,
 			const struct intel_crtc_state *crtc_state,
 			const struct intel_plane_state *plane_state);
@@ -43,10 +41,16 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_
 int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_state,
 				    struct intel_crtc_state *crtc_state,
 				    const struct intel_plane_state *old_plane_state,
+				    const struct intel_plane_state *master_plane_state,
 				    struct intel_plane_state *plane_state);
 struct intel_crtc *
 intel_plane_get_crtc_from_states(struct intel_atomic_state *state,
 				 const struct intel_plane_state *old_plane_state,
 				 const struct intel_plane_state *new_plane_state);
 
+int intel_atomic_plane_check_scaling(struct intel_crtc_state *crtc_state,
+				     const struct intel_plane_state *master_plane_state,
+				     struct intel_plane_state *plane_state,
+				     int min_scale, int max_scale);
+
 #endif /* __INTEL_ATOMIC_PLANE_H__ */
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index e80dbd4a4f96..21275d91c0eb 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -2303,12 +2303,13 @@ static u32 intel_adjust_aligned_offset(int *x, int *y,
  * the x/y offsets.
  */
 static u32 intel_plane_adjust_aligned_offset(int *x, int *y,
+					     const struct intel_plane_state *master_plane_state,
 					     const struct intel_plane_state *state,
 					     int color_plane,
 					     u32 old_offset, u32 new_offset)
 {
-	return intel_adjust_aligned_offset(x, y, state->base.fb, color_plane,
-					   state->base.rotation,
+	return intel_adjust_aligned_offset(x, y, master_plane_state->base.fb, color_plane,
+					   master_plane_state->base.rotation,
 					   state->color_plane[color_plane].stride,
 					   old_offset, new_offset);
 }
@@ -2379,14 +2380,15 @@ static u32 intel_compute_aligned_offset(struct drm_i915_private *dev_priv,
 }
 
 static u32 intel_plane_compute_aligned_offset(int *x, int *y,
-					      const struct intel_plane_state *state,
+					      const struct intel_plane_state *master_plane_state,
+					      const struct intel_plane_state *plane_state,
 					      int color_plane)
 {
-	struct intel_plane *intel_plane = to_intel_plane(state->base.plane);
+	struct intel_plane *intel_plane = to_intel_plane(plane_state->base.plane);
 	struct drm_i915_private *dev_priv = to_i915(intel_plane->base.dev);
-	const struct drm_framebuffer *fb = state->base.fb;
-	unsigned int rotation = state->base.rotation;
-	int pitch = state->color_plane[color_plane].stride;
+	const struct drm_framebuffer *fb = master_plane_state->base.fb;
+	unsigned int rotation = master_plane_state->base.rotation;
+	int pitch = plane_state->color_plane[color_plane].stride;
 	u32 alignment;
 
 	if (intel_plane->id == PLANE_CURSOR)
@@ -2608,11 +2610,12 @@ bool intel_plane_can_remap(const struct intel_plane_state *plane_state)
 	return true;
 }
 
-static bool intel_plane_needs_remap(const struct intel_plane_state *plane_state)
+static bool intel_plane_needs_remap(const struct intel_plane_state *master_plane_state,
+				    const struct intel_plane_state *plane_state)
 {
 	struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
-	const struct drm_framebuffer *fb = plane_state->base.fb;
-	unsigned int rotation = plane_state->base.rotation;
+	const struct drm_framebuffer *fb = master_plane_state->base.fb;
+	unsigned int rotation = master_plane_state->base.rotation;
 	u32 stride, max_stride;
 
 	/*
@@ -2622,7 +2625,7 @@ static bool intel_plane_needs_remap(const struct intel_plane_state *plane_state)
 	if (!plane_state->base.visible)
 		return false;
 
-	if (!intel_plane_can_remap(plane_state))
+	if (!intel_plane_can_remap(master_plane_state))
 		return false;
 
 	/*
@@ -2802,14 +2805,15 @@ intel_fill_fb_info(struct drm_i915_private *dev_priv,
 }
 
 static void
-intel_plane_remap_gtt(struct intel_plane_state *plane_state)
+intel_plane_remap_gtt(const struct intel_plane_state *master_plane_state,
+		      struct intel_plane_state *plane_state)
 {
 	struct drm_i915_private *dev_priv =
 		to_i915(plane_state->base.plane->dev);
-	struct drm_framebuffer *fb = plane_state->base.fb;
+	struct drm_framebuffer *fb = master_plane_state->base.fb;
 	struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
 	struct intel_rotation_info *info = &plane_state->view.rotated;
-	unsigned int rotation = plane_state->base.rotation;
+	unsigned int rotation = master_plane_state->base.rotation;
 	int i, num_planes = fb->format->num_planes;
 	unsigned int tile_size = intel_tile_size(dev_priv);
 	unsigned int src_x, src_y;
@@ -2915,11 +2919,12 @@ intel_plane_remap_gtt(struct intel_plane_state *plane_state)
 }
 
 static int
-intel_plane_compute_gtt(struct intel_plane_state *plane_state)
+intel_plane_compute_gtt(const struct intel_plane_state *master_plane_state,
+			struct intel_plane_state *plane_state)
 {
 	const struct intel_framebuffer *fb =
-		to_intel_framebuffer(plane_state->base.fb);
-	unsigned int rotation = plane_state->base.rotation;
+		to_intel_framebuffer(master_plane_state->base.fb);
+	unsigned int rotation = master_plane_state->base.rotation;
 	int i, num_planes;
 
 	if (!fb)
@@ -2927,8 +2932,8 @@ intel_plane_compute_gtt(struct intel_plane_state *plane_state)
 
 	num_planes = fb->base.format->num_planes;
 
-	if (intel_plane_needs_remap(plane_state)) {
-		intel_plane_remap_gtt(plane_state);
+	if (intel_plane_needs_remap(master_plane_state, plane_state)) {
+		intel_plane_remap_gtt(master_plane_state, plane_state);
 
 		/*
 		 * Sometimes even remapping can't overcome
@@ -2936,7 +2941,7 @@ intel_plane_compute_gtt(struct intel_plane_state *plane_state)
 		 * big plane sizes and suitably misaligned
 		 * offsets.
 		 */
-		return intel_plane_check_stride(plane_state);
+		return intel_plane_check_stride(master_plane_state, plane_state);
 	}
 
 	intel_fill_fb_ggtt_view(&plane_state->view, &fb->base, rotation);
@@ -2960,7 +2965,7 @@ intel_plane_compute_gtt(struct intel_plane_state *plane_state)
 				fb->base.width << 16, fb->base.height << 16,
 				DRM_MODE_ROTATE_270);
 
-	return intel_plane_check_stride(plane_state);
+	return intel_plane_check_stride(master_plane_state, plane_state);
 }
 
 static int i9xx_format_to_fourcc(int format)
@@ -3350,10 +3355,11 @@ static int icl_max_plane_width(const struct drm_framebuffer *fb,
 	return 5120;
 }
 
-static bool skl_check_main_ccs_coordinates(struct intel_plane_state *plane_state,
+static bool skl_check_main_ccs_coordinates(const struct intel_plane_state *master_plane_state,
+					   struct intel_plane_state *plane_state,
 					   int main_x, int main_y, u32 main_offset)
 {
-	const struct drm_framebuffer *fb = plane_state->base.fb;
+	const struct drm_framebuffer *fb = master_plane_state->base.fb;
 	int hsub = fb->format->hsub;
 	int vsub = fb->format->vsub;
 	int aux_x = plane_state->color_plane[1].x;
@@ -3372,7 +3378,7 @@ static bool skl_check_main_ccs_coordinates(struct intel_plane_state *plane_state
 
 		x = aux_x / hsub;
 		y = aux_y / vsub;
-		aux_offset = intel_plane_adjust_aligned_offset(&x, &y, plane_state, 1,
+		aux_offset = intel_plane_adjust_aligned_offset(&x, &y, master_plane_state, plane_state, 1,
 							       aux_offset, aux_offset - alignment);
 		aux_x = x * hsub + aux_x % hsub;
 		aux_y = y * vsub + aux_y % vsub;
@@ -3388,11 +3394,12 @@ static bool skl_check_main_ccs_coordinates(struct intel_plane_state *plane_state
 	return true;
 }
 
-static int skl_check_main_surface(struct intel_plane_state *plane_state)
+static int skl_check_main_surface(const struct intel_plane_state *master_plane_state,
+				  struct intel_plane_state *plane_state)
 {
 	struct drm_i915_private *dev_priv = to_i915(plane_state->base.plane->dev);
-	const struct drm_framebuffer *fb = plane_state->base.fb;
-	unsigned int rotation = plane_state->base.rotation;
+	const struct drm_framebuffer *fb = master_plane_state->base.fb;
+	unsigned int rotation = master_plane_state->base.rotation;
 	int x = plane_state->base.src.x1 >> 16;
 	int y = plane_state->base.src.y1 >> 16;
 	int w = drm_rect_width(&plane_state->base.src) >> 16;
@@ -3415,7 +3422,7 @@ static int skl_check_main_surface(struct intel_plane_state *plane_state)
 	}
 
 	intel_add_fb_offsets(&x, &y, plane_state, 0);
-	offset = intel_plane_compute_aligned_offset(&x, &y, plane_state, 0);
+	offset = intel_plane_compute_aligned_offset(&x, &y, master_plane_state, plane_state, 0);
 	alignment = intel_surf_alignment(fb, 0);
 
 	/*
@@ -3424,7 +3431,7 @@ static int skl_check_main_surface(struct intel_plane_state *plane_state)
 	 * sure that is what we will get.
 	 */
 	if (offset > aux_offset)
-		offset = intel_plane_adjust_aligned_offset(&x, &y, plane_state, 0,
+		offset = intel_plane_adjust_aligned_offset(&x, &y, master_plane_state, plane_state, 0,
 							   offset, aux_offset & ~(alignment - 1));
 
 	/*
@@ -3442,7 +3449,7 @@ static int skl_check_main_surface(struct intel_plane_state *plane_state)
 				return -EINVAL;
 			}
 
-			offset = intel_plane_adjust_aligned_offset(&x, &y, plane_state, 0,
+			offset = intel_plane_adjust_aligned_offset(&x, &y, master_plane_state, plane_state, 0,
 								   offset, offset - alignment);
 		}
 	}
@@ -3452,11 +3459,11 @@ static int skl_check_main_surface(struct intel_plane_state *plane_state)
 	 * they match with the main surface x/y offsets.
 	 */
 	if (is_ccs_modifier(fb->modifier)) {
-		while (!skl_check_main_ccs_coordinates(plane_state, x, y, offset)) {
+		while (!skl_check_main_ccs_coordinates(master_plane_state, plane_state, x, y, offset)) {
 			if (offset == 0)
 				break;
 
-			offset = intel_plane_adjust_aligned_offset(&x, &y, plane_state, 0,
+			offset = intel_plane_adjust_aligned_offset(&x, &y, master_plane_state, plane_state, 0,
 								   offset, offset - alignment);
 		}
 
@@ -3481,7 +3488,8 @@ static int skl_check_main_surface(struct intel_plane_state *plane_state)
 	return 0;
 }
 
-static int skl_check_nv12_aux_surface(struct intel_plane_state *plane_state)
+static int skl_check_nv12_aux_surface(const struct intel_plane_state *master_plane_state,
+				      struct intel_plane_state *plane_state)
 {
 	const struct drm_framebuffer *fb = plane_state->base.fb;
 	unsigned int rotation = plane_state->base.rotation;
@@ -3494,7 +3502,7 @@ static int skl_check_nv12_aux_surface(struct intel_plane_state *plane_state)
 	u32 offset;
 
 	intel_add_fb_offsets(&x, &y, plane_state, 1);
-	offset = intel_plane_compute_aligned_offset(&x, &y, plane_state, 1);
+	offset = intel_plane_compute_aligned_offset(&x, &y, master_plane_state, plane_state, 1);
 
 	/* FIXME not quite sure how/if these apply to the chroma plane */
 	if (w > max_width || h > max_height) {
@@ -3510,7 +3518,8 @@ static int skl_check_nv12_aux_surface(struct intel_plane_state *plane_state)
 	return 0;
 }
 
-static int skl_check_ccs_aux_surface(struct intel_plane_state *plane_state)
+static int skl_check_ccs_aux_surface(const struct intel_plane_state *master_plane_state,
+				     struct intel_plane_state *plane_state)
 {
 	const struct drm_framebuffer *fb = plane_state->base.fb;
 	int src_x = plane_state->base.src.x1 >> 16;
@@ -3522,7 +3531,7 @@ static int skl_check_ccs_aux_surface(struct intel_plane_state *plane_state)
 	u32 offset;
 
 	intel_add_fb_offsets(&x, &y, plane_state, 1);
-	offset = intel_plane_compute_aligned_offset(&x, &y, plane_state, 1);
+	offset = intel_plane_compute_aligned_offset(&x, &y, master_plane_state, plane_state, 1);
 
 	plane_state->color_plane[1].offset = offset;
 	plane_state->color_plane[1].x = x * hsub + src_x % hsub;
@@ -3531,12 +3540,13 @@ static int skl_check_ccs_aux_surface(struct intel_plane_state *plane_state)
 	return 0;
 }
 
-int skl_check_plane_surface(struct intel_plane_state *plane_state)
+int skl_check_plane_surface(const struct intel_plane_state *master_plane_state,
+			    struct intel_plane_state *plane_state)
 {
-	const struct drm_framebuffer *fb = plane_state->base.fb;
+	const struct drm_framebuffer *fb = master_plane_state->base.fb;
 	int ret;
 
-	ret = intel_plane_compute_gtt(plane_state);
+	ret = intel_plane_compute_gtt(master_plane_state, plane_state);
 	if (ret)
 		return ret;
 
@@ -3548,11 +3558,11 @@ int skl_check_plane_surface(struct intel_plane_state *plane_state)
 	 * the main surface setup depends on it.
 	 */
 	if (drm_format_info_is_yuv_semiplanar(fb->format)) {
-		ret = skl_check_nv12_aux_surface(plane_state);
+		ret = skl_check_nv12_aux_surface(master_plane_state, plane_state);
 		if (ret)
 			return ret;
 	} else if (is_ccs_modifier(fb->modifier)) {
-		ret = skl_check_ccs_aux_surface(plane_state);
+		ret = skl_check_ccs_aux_surface(master_plane_state, plane_state);
 		if (ret)
 			return ret;
 	} else {
@@ -3561,11 +3571,7 @@ int skl_check_plane_surface(struct intel_plane_state *plane_state)
 		plane_state->color_plane[1].y = 0;
 	}
 
-	ret = skl_check_main_surface(plane_state);
-	if (ret)
-		return ret;
-
-	return 0;
+	return skl_check_main_surface(master_plane_state, plane_state);
 }
 
 unsigned int
@@ -3676,7 +3682,7 @@ int i9xx_check_plane_surface(struct intel_plane_state *plane_state)
 	u32 offset;
 	int ret;
 
-	ret = intel_plane_compute_gtt(plane_state);
+	ret = intel_plane_compute_gtt(plane_state, plane_state);
 	if (ret)
 		return ret;
 
@@ -3690,6 +3696,7 @@ int i9xx_check_plane_surface(struct intel_plane_state *plane_state)
 
 	if (INTEL_GEN(dev_priv) >= 4)
 		offset = intel_plane_compute_aligned_offset(&src_x, &src_y,
+							    plane_state,
 							    plane_state, 0);
 	else
 		offset = 0;
@@ -3741,6 +3748,7 @@ static bool i9xx_plane_has_windowing(struct intel_plane *plane)
 
 static int
 i9xx_plane_check(struct intel_crtc_state *crtc_state,
+		 const struct intel_plane_state *master_plane_state,
 		 struct intel_plane_state *plane_state)
 {
 	struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
@@ -3766,7 +3774,7 @@ i9xx_plane_check(struct intel_crtc_state *crtc_state,
 	if (!plane_state->base.visible)
 		return 0;
 
-	ret = intel_plane_check_src_coordinates(plane_state);
+	ret = intel_plane_check_src_coordinates(master_plane_state, plane_state);
 	if (ret)
 		return ret;
 
@@ -5531,12 +5539,13 @@ int skl_update_scaler_crtc(struct intel_crtc_state *state)
  *    error - requested scaling cannot be supported or other error condition
  */
 static int skl_update_scaler_plane(struct intel_crtc_state *crtc_state,
+				   const struct intel_plane_state *master_plane_state,
 				   struct intel_plane_state *plane_state)
 {
 	struct intel_plane *intel_plane =
 		to_intel_plane(plane_state->base.plane);
 	struct drm_i915_private *dev_priv = to_i915(intel_plane->base.dev);
-	struct drm_framebuffer *fb = plane_state->base.fb;
+	struct drm_framebuffer *fb = master_plane_state->base.fb;
 	int ret;
 	bool force_detach = !fb || !plane_state->base.visible;
 	bool need_scaler = false;
@@ -5559,7 +5568,7 @@ static int skl_update_scaler_plane(struct intel_crtc_state *crtc_state,
 		return ret;
 
 	/* check colorkey */
-	if (plane_state->ckey.flags) {
+	if (master_plane_state->ckey.flags) {
 		DRM_DEBUG_KMS("[PLANE:%d:%s] scaling with color key not allowed",
 			      intel_plane->base.base.id,
 			      intel_plane->base.name);
@@ -10601,11 +10610,12 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
 	return active;
 }
 
-static u32 intel_cursor_base(const struct intel_plane_state *plane_state)
+static u32 intel_cursor_base(const struct intel_plane_state *master_plane_state,
+			     const struct intel_plane_state *plane_state)
 {
 	struct drm_i915_private *dev_priv =
 		to_i915(plane_state->base.plane->dev);
-	const struct drm_framebuffer *fb = plane_state->base.fb;
+	const struct drm_framebuffer *fb = master_plane_state->base.fb;
 	const struct drm_i915_gem_object *obj = intel_fb_obj(fb);
 	u32 base;
 
@@ -10618,19 +10628,24 @@ static u32 intel_cursor_base(const struct intel_plane_state *plane_state)
 
 	/* ILK+ do this automagically */
 	if (HAS_GMCH(dev_priv) &&
-	    plane_state->base.rotation & DRM_MODE_ROTATE_180)
-		base += (plane_state->base.crtc_h *
-			 plane_state->base.crtc_w - 1) * fb->format->cpp[0];
+	    master_plane_state->base.rotation & DRM_MODE_ROTATE_180)
+		base += (master_plane_state->base.crtc_h *
+			 master_plane_state->base.crtc_w - 1) * fb->format->cpp[0];
 
 	return base;
 }
 
-static u32 intel_cursor_position(const struct intel_plane_state *plane_state)
+static u32 intel_cursor_position(const struct intel_crtc_state *crtc_state,
+				 const struct intel_plane_state *master_plane_state,
+				 const struct intel_plane_state *plane_state)
 {
-	int x = plane_state->base.crtc_x;
-	int y = plane_state->base.crtc_y;
+	int x = master_plane_state->base.crtc_x;
+	int y = master_plane_state->base.crtc_y;
 	u32 pos = 0;
 
+	if (plane_state->bigjoiner_slave)
+		x -= crtc_state->pipe_src_w;
+
 	if (x < 0) {
 		pos |= CURSOR_POS_SIGN << CURSOR_X_SHIFT;
 		x = -x;
@@ -10657,13 +10672,14 @@ static bool intel_cursor_size_ok(const struct intel_plane_state *plane_state)
 		height > 0 && height <= config->cursor_height;
 }
 
-static int intel_cursor_check_surface(struct intel_plane_state *plane_state)
+static int intel_cursor_check_surface(const struct intel_plane_state *master_plane_state,
+				      struct intel_plane_state *plane_state)
 {
 	int src_x, src_y;
 	u32 offset;
 	int ret;
 
-	ret = intel_plane_compute_gtt(plane_state);
+	ret = intel_plane_compute_gtt(master_plane_state, plane_state);
 	if (ret)
 		return ret;
 
@@ -10675,6 +10691,7 @@ static int intel_cursor_check_surface(struct intel_plane_state *plane_state)
 
 	intel_add_fb_offsets(&src_x, &src_y, plane_state, 0);
 	offset = intel_plane_compute_aligned_offset(&src_x, &src_y,
+						    master_plane_state,
 						    plane_state, 0);
 
 	if (src_x != 0 || src_y != 0) {
@@ -10688,6 +10705,7 @@ static int intel_cursor_check_surface(struct intel_plane_state *plane_state)
 }
 
 static int intel_check_cursor(struct intel_crtc_state *crtc_state,
+			      const struct intel_plane_state *master_plane_state,
 			      struct intel_plane_state *plane_state)
 {
 	const struct drm_framebuffer *fb = plane_state->base.fb;
@@ -10698,22 +10716,21 @@ static int intel_check_cursor(struct intel_crtc_state *crtc_state,
 		return -EINVAL;
 	}
 
-	ret = drm_atomic_helper_check_plane_state(&plane_state->base,
-						  &crtc_state->uapi,
-						  DRM_PLANE_HELPER_NO_SCALING,
-						  DRM_PLANE_HELPER_NO_SCALING,
-						  true, true);
+	ret = intel_atomic_plane_check_scaling(crtc_state, master_plane_state,
+					       plane_state,
+					       DRM_PLANE_HELPER_NO_SCALING,
+					       DRM_PLANE_HELPER_NO_SCALING);
 	if (ret)
 		return ret;
 
-	ret = intel_cursor_check_surface(plane_state);
+	ret = intel_cursor_check_surface(master_plane_state, plane_state);
 	if (ret)
 		return ret;
 
 	if (!plane_state->base.visible)
 		return 0;
 
-	ret = intel_plane_check_src_coordinates(plane_state);
+	ret = intel_plane_check_src_coordinates(master_plane_state, plane_state);
 	if (ret)
 		return ret;
 
@@ -10758,12 +10775,13 @@ static bool i845_cursor_size_ok(const struct intel_plane_state *plane_state)
 }
 
 static int i845_check_cursor(struct intel_crtc_state *crtc_state,
+			     const struct intel_plane_state *master_plane_state,
 			     struct intel_plane_state *plane_state)
 {
-	const struct drm_framebuffer *fb = plane_state->base.fb;
+	const struct drm_framebuffer *fb = master_plane_state->base.fb;
 	int ret;
 
-	ret = intel_check_cursor(crtc_state, plane_state);
+	ret = intel_check_cursor(crtc_state, master_plane_state, plane_state);
 	if (ret)
 		return ret;
 
@@ -10816,8 +10834,8 @@ static void i845_update_cursor(struct intel_plane *plane,
 
 		size = (height << 12) | width;
 
-		base = intel_cursor_base(plane_state);
-		pos = intel_cursor_position(plane_state);
+		base = intel_cursor_base(plane_state, plane_state);
+		pos = intel_cursor_position(crtc_state, plane_state, plane_state);
 	}
 
 	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
@@ -10971,15 +10989,16 @@ static bool i9xx_cursor_size_ok(const struct intel_plane_state *plane_state)
 }
 
 static int i9xx_check_cursor(struct intel_crtc_state *crtc_state,
+			     const struct intel_plane_state *master_plane_state,
 			     struct intel_plane_state *plane_state)
 {
 	struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
 	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
-	const struct drm_framebuffer *fb = plane_state->base.fb;
+	const struct drm_framebuffer *fb = master_plane_state->base.fb;
 	enum pipe pipe = plane->pipe;
 	int ret;
 
-	ret = intel_check_cursor(crtc_state, plane_state);
+	ret = intel_check_cursor(crtc_state, master_plane_state, plane_state);
 	if (ret)
 		return ret;
 
@@ -10988,17 +11007,17 @@ static int i9xx_check_cursor(struct intel_crtc_state *crtc_state,
 		return 0;
 
 	/* Check for which cursor types we support */
-	if (!i9xx_cursor_size_ok(plane_state)) {
+	if (!i9xx_cursor_size_ok(master_plane_state)) {
 		DRM_DEBUG("Cursor dimension %dx%d not supported\n",
-			  plane_state->base.crtc_w,
-			  plane_state->base.crtc_h);
+			  master_plane_state->base.crtc_w,
+			  master_plane_state->base.crtc_h);
 		return -EINVAL;
 	}
 
 	WARN_ON(plane_state->base.visible &&
-		plane_state->color_plane[0].stride != fb->pitches[0]);
+		master_plane_state->color_plane[0].stride != fb->pitches[0]);
 
-	if (fb->pitches[0] != plane_state->base.crtc_w * fb->format->cpp[0]) {
+	if (fb->pitches[0] != master_plane_state->base.crtc_w * fb->format->cpp[0]) {
 		DRM_DEBUG_KMS("Invalid cursor stride (%u) (cursor width %d)\n",
 			      fb->pitches[0], plane_state->base.crtc_w);
 		return -EINVAL;
@@ -11015,19 +11034,20 @@ static int i9xx_check_cursor(struct intel_crtc_state *crtc_state,
 	 * Refuse the put the cursor into that compromised position.
 	 */
 	if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_C &&
-	    plane_state->base.visible && plane_state->base.crtc_x < 0) {
+	    plane_state->base.visible && master_plane_state->base.crtc_x < 0) {
 		DRM_DEBUG_KMS("CHV cursor C not allowed to straddle the left screen edge\n");
 		return -EINVAL;
 	}
 
-	plane_state->ctl = i9xx_cursor_ctl(crtc_state, plane_state);
+	plane_state->ctl = i9xx_cursor_ctl(crtc_state, master_plane_state);
 
 	return 0;
 }
 
-static void i9xx_update_cursor(struct intel_plane *plane,
-			       const struct intel_crtc_state *crtc_state,
-			       const struct intel_plane_state *plane_state)
+static void i9xx_update_cursor_slave(struct intel_plane *plane,
+				     const struct intel_crtc_state *crtc_state,
+				     const struct intel_plane_state *master_plane_state,
+				     const struct intel_plane_state *plane_state)
 {
 	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
 	enum pipe pipe = plane->pipe;
@@ -11038,11 +11058,11 @@ static void i9xx_update_cursor(struct intel_plane *plane,
 		cntl = plane_state->ctl |
 			i9xx_cursor_ctl_crtc(crtc_state);
 
-		if (plane_state->base.crtc_h != plane_state->base.crtc_w)
-			fbc_ctl = CUR_FBC_CTL_EN | (plane_state->base.crtc_h - 1);
+		if (master_plane_state->base.crtc_h != master_plane_state->base.crtc_w)
+			fbc_ctl = CUR_FBC_CTL_EN | (master_plane_state->base.crtc_h - 1);
 
-		base = intel_cursor_base(plane_state);
-		pos = intel_cursor_position(plane_state);
+		base = intel_cursor_base(master_plane_state, plane_state);
+		pos = intel_cursor_position(crtc_state, master_plane_state, plane_state);
 	}
 
 	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
@@ -11090,10 +11110,17 @@ static void i9xx_update_cursor(struct intel_plane *plane,
 	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
+static void i9xx_update_cursor(struct intel_plane *plane,
+			       const struct intel_crtc_state *crtc_state,
+			       const struct intel_plane_state *plane_state)
+{
+	i9xx_update_cursor_slave(plane, crtc_state, plane_state, plane_state);
+}
+
 static void i9xx_disable_cursor(struct intel_plane *plane,
 				const struct intel_crtc_state *crtc_state)
 {
-	i9xx_update_cursor(plane, crtc_state, NULL);
+	i9xx_update_cursor_slave(plane, crtc_state, NULL, NULL);
 }
 
 static bool i9xx_cursor_get_hw_state(struct intel_plane *plane,
@@ -11601,6 +11628,7 @@ static bool needs_scaling(const struct intel_plane_state *state)
 int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_state,
 				    struct intel_crtc_state *crtc_state,
 				    const struct intel_plane_state *old_plane_state,
+				    const struct intel_plane_state *master_plane_state,
 				    struct intel_plane_state *plane_state)
 {
 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
@@ -11613,7 +11641,7 @@ int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_stat
 	int ret;
 
 	if (INTEL_GEN(dev_priv) >= 9 && plane->id != PLANE_CURSOR) {
-		ret = skl_update_scaler_plane(crtc_state, plane_state);
+		ret = skl_update_scaler_plane(crtc_state, master_plane_state, plane_state);
 		if (ret)
 			return ret;
 	}
@@ -15185,7 +15213,7 @@ intel_legacy_cursor_update(struct drm_plane *plane,
 	 * wait for it to complete in the slowpath
 	 */
 	if (!crtc_state->hw.active || needs_modeset(crtc_state) ||
-	    crtc_state->update_pipe)
+	    crtc_state->update_pipe || crtc_state->bigjoiner)
 		goto slow;
 
 	old_plane_state = plane->state;
@@ -15453,6 +15481,7 @@ intel_cursor_plane_create(struct drm_i915_private *dev_priv,
 	} else {
 		cursor->max_stride = i9xx_cursor_max_stride;
 		cursor->update_plane = i9xx_update_cursor;
+		cursor->update_slave = i9xx_update_cursor_slave;
 		cursor->disable_plane = i9xx_disable_cursor;
 		cursor->get_hw_state = i9xx_cursor_get_hw_state;
 		cursor->check_plane = i9xx_check_cursor;
diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h
index 4d5a0f52b384..badaef5a20f5 100644
--- a/drivers/gpu/drm/i915/display/intel_display.h
+++ b/drivers/gpu/drm/i915/display/intel_display.h
@@ -532,8 +532,9 @@ u32 skl_plane_ctl(const struct intel_crtc_state *crtc_state,
 u32 skl_plane_ctl_crtc(const struct intel_crtc_state *crtc_state);
 u32 skl_plane_stride(const struct intel_plane_state *master_plane_state,
 		     const struct intel_plane_state *plane_state,
-		     int plane);
-int skl_check_plane_surface(struct intel_plane_state *plane_state);
+		     int color_plane);
+int skl_check_plane_surface(const struct intel_plane_state *master_plane_state,
+			    struct intel_plane_state *plane_state);
 int i9xx_check_plane_surface(struct intel_plane_state *plane_state);
 int skl_format_to_fourcc(int format, bool rgb_order, bool alpha);
 unsigned int i9xx_plane_max_stride(struct intel_plane *plane,
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 55e739578338..ba15f3867a6d 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1109,6 +1109,7 @@ struct intel_plane {
 			      const struct intel_crtc_state *crtc_state);
 	bool (*get_hw_state)(struct intel_plane *plane, enum pipe *pipe);
 	int (*check_plane)(struct intel_crtc_state *crtc_state,
+			   const struct intel_plane_state *master_plane_state,
 			   struct intel_plane_state *plane_state);
 };
 
diff --git a/drivers/gpu/drm/i915/display/intel_sprite.c b/drivers/gpu/drm/i915/display/intel_sprite.c
index 1d605af3a5a7..660894488928 100644
--- a/drivers/gpu/drm/i915/display/intel_sprite.c
+++ b/drivers/gpu/drm/i915/display/intel_sprite.c
@@ -250,11 +250,12 @@ void intel_pipe_update_end(struct intel_crtc_state *new_crtc_state,
 #endif
 }
 
-int intel_plane_check_stride(const struct intel_plane_state *plane_state)
+int intel_plane_check_stride(const struct intel_plane_state *master_plane_state,
+			     const struct intel_plane_state *plane_state)
 {
 	struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
-	const struct drm_framebuffer *fb = plane_state->base.fb;
-	unsigned int rotation = plane_state->base.rotation;
+	const struct drm_framebuffer *fb = master_plane_state->base.fb;
+	unsigned int rotation = master_plane_state->base.rotation;
 	u32 stride, max_stride;
 
 	/*
@@ -263,7 +264,7 @@ int intel_plane_check_stride(const struct intel_plane_state *plane_state)
 	 * with a false positive when the remapping didn't
 	 * kick in due the plane being invisible.
 	 */
-	if (intel_plane_can_remap(plane_state) &&
+	if (intel_plane_can_remap(master_plane_state) &&
 	    !plane_state->base.visible)
 		return 0;
 
@@ -282,12 +283,13 @@ int intel_plane_check_stride(const struct intel_plane_state *plane_state)
 	return 0;
 }
 
-int intel_plane_check_src_coordinates(struct intel_plane_state *plane_state)
+int intel_plane_check_src_coordinates(const struct intel_plane_state *master_plane_state,
+				      struct intel_plane_state *plane_state)
 {
-	const struct drm_framebuffer *fb = plane_state->base.fb;
+	const struct drm_framebuffer *fb = master_plane_state->base.fb;
 	struct drm_rect *src = &plane_state->base.src;
 	u32 src_x, src_y, src_w, src_h, hsub, vsub;
-	bool rotated = drm_rotation_90_or_270(plane_state->base.rotation);
+	bool rotated = drm_rotation_90_or_270(master_plane_state->base.rotation);
 
 	/*
 	 * Hardware doesn't handle subpixel coordinates.
@@ -1572,6 +1574,7 @@ g4x_sprite_check_scaling(struct intel_crtc_state *crtc_state,
 
 static int
 g4x_sprite_check(struct intel_crtc_state *crtc_state,
+		 const struct intel_plane_state *master_plane_state,
 		 struct intel_plane_state *plane_state)
 {
 	struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
@@ -1590,10 +1593,9 @@ g4x_sprite_check(struct intel_crtc_state *crtc_state,
 		}
 	}
 
-	ret = drm_atomic_helper_check_plane_state(&plane_state->base,
-						  &crtc_state->uapi,
-						  min_scale, max_scale,
-						  true, true);
+	ret = intel_atomic_plane_check_scaling(crtc_state,
+					       master_plane_state, plane_state,
+					       min_scale, max_scale);
 	if (ret)
 		return ret;
 
@@ -1604,7 +1606,7 @@ g4x_sprite_check(struct intel_crtc_state *crtc_state,
 	if (!plane_state->base.visible)
 		return 0;
 
-	ret = intel_plane_check_src_coordinates(plane_state);
+	ret = intel_plane_check_src_coordinates(master_plane_state, plane_state);
 	if (ret)
 		return ret;
 
@@ -1639,6 +1641,7 @@ int chv_plane_check_rotation(const struct intel_plane_state *plane_state)
 
 static int
 vlv_sprite_check(struct intel_crtc_state *crtc_state,
+		 const struct intel_plane_state *master_plane_state,
 		 struct intel_plane_state *plane_state)
 {
 	int ret;
@@ -1647,11 +1650,10 @@ vlv_sprite_check(struct intel_crtc_state *crtc_state,
 	if (ret)
 		return ret;
 
-	ret = drm_atomic_helper_check_plane_state(&plane_state->base,
-						  &crtc_state->uapi,
-						  DRM_PLANE_HELPER_NO_SCALING,
-						  DRM_PLANE_HELPER_NO_SCALING,
-						  true, true);
+	ret = intel_atomic_plane_check_scaling(crtc_state,
+					       master_plane_state, plane_state,
+					       DRM_PLANE_HELPER_NO_SCALING,
+					       DRM_PLANE_HELPER_NO_SCALING);
 	if (ret)
 		return ret;
 
@@ -1662,7 +1664,7 @@ vlv_sprite_check(struct intel_crtc_state *crtc_state,
 	if (!plane_state->base.visible)
 		return 0;
 
-	ret = intel_plane_check_src_coordinates(plane_state);
+	ret = intel_plane_check_src_coordinates(master_plane_state, plane_state);
 	if (ret)
 		return ret;
 
@@ -1775,10 +1777,11 @@ static int skl_plane_check_dst_coordinates(const struct intel_crtc_state *crtc_s
 	return 0;
 }
 
-static int skl_plane_check_nv12_rotation(const struct intel_plane_state *plane_state)
+static int skl_plane_check_nv12_rotation(const struct intel_plane_state *master_plane_state,
+					 const struct intel_plane_state *plane_state)
 {
-	const struct drm_framebuffer *fb = plane_state->base.fb;
-	unsigned int rotation = plane_state->base.rotation;
+	const struct drm_framebuffer *fb = master_plane_state->base.fb;
+	unsigned int rotation = master_plane_state->base.rotation;
 	int src_w = drm_rect_width(&plane_state->base.src) >> 16;
 
 	/* Display WA #1106 */
@@ -1793,33 +1796,37 @@ static int skl_plane_check_nv12_rotation(const struct intel_plane_state *plane_s
 }
 
 static int skl_plane_check(struct intel_crtc_state *crtc_state,
+			   const struct intel_plane_state *master_plane_state,
 			   struct intel_plane_state *plane_state)
 {
 	struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
 	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
-	const struct drm_framebuffer *fb = plane_state->base.fb;
+	const struct drm_framebuffer *fb = master_plane_state->base.fb;
 	int min_scale = DRM_PLANE_HELPER_NO_SCALING;
 	int max_scale = DRM_PLANE_HELPER_NO_SCALING;
 	int ret;
 
+	/*
+	 * it's ok to check slave plane_state here, master_plane_state is already checked
+	 * in its own skl_plane_check call.
+	 */
 	ret = skl_plane_check_fb(crtc_state, plane_state);
 	if (ret)
 		return ret;
 
 	/* use scaler when colorkey is not required */
-	if (!plane_state->ckey.flags && intel_fb_scalable(fb)) {
+	if (!master_plane_state->ckey.flags && intel_fb_scalable(fb)) {
 		min_scale = 1;
 		max_scale = skl_max_scale(crtc_state, fb->format);
 	}
 
-	ret = drm_atomic_helper_check_plane_state(&plane_state->base,
-						  &crtc_state->uapi,
-						  min_scale, max_scale,
-						  true, true);
+	ret = intel_atomic_plane_check_scaling(crtc_state,
+					       master_plane_state, plane_state,
+					       min_scale, max_scale);
 	if (ret)
 		return ret;
 
-	ret = skl_check_plane_surface(plane_state);
+	ret = skl_check_plane_surface(master_plane_state, plane_state);
 	if (ret)
 		return ret;
 
@@ -1830,11 +1837,11 @@ static int skl_plane_check(struct intel_crtc_state *crtc_state,
 	if (ret)
 		return ret;
 
-	ret = intel_plane_check_src_coordinates(plane_state);
+	ret = intel_plane_check_src_coordinates(master_plane_state, plane_state);
 	if (ret)
 		return ret;
 
-	ret = skl_plane_check_nv12_rotation(plane_state);
+	ret = skl_plane_check_nv12_rotation(master_plane_state, plane_state);
 	if (ret)
 		return ret;
 
@@ -1842,11 +1849,11 @@ static int skl_plane_check(struct intel_crtc_state *crtc_state,
 	if (!(plane_state->base.alpha >> 8))
 		plane_state->base.visible = false;
 
-	plane_state->ctl = skl_plane_ctl(crtc_state, plane_state);
+	plane_state->ctl = skl_plane_ctl(crtc_state, master_plane_state);
 
 	if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
 		plane_state->color_ctl = glk_plane_color_ctl(crtc_state,
-							     plane_state);
+							     master_plane_state);
 
 	if (icl_is_hdr_plane(dev_priv, plane->id) && fb->format->is_yuv)
 		/* Enable and use MPEG-2 chroma siting */
diff --git a/drivers/gpu/drm/i915/display/intel_sprite.h b/drivers/gpu/drm/i915/display/intel_sprite.h
index 6df62fae9368..453b153b303e 100644
--- a/drivers/gpu/drm/i915/display/intel_sprite.h
+++ b/drivers/gpu/drm/i915/display/intel_sprite.h
@@ -26,8 +26,10 @@ int intel_sprite_set_colorkey_ioctl(struct drm_device *dev, void *data,
 void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state);
 void intel_pipe_update_end(struct intel_crtc_state *new_crtc_state,
 			   struct intel_crtc_state *slave_crtc_state);
-int intel_plane_check_stride(const struct intel_plane_state *plane_state);
-int intel_plane_check_src_coordinates(struct intel_plane_state *plane_state);
+int intel_plane_check_stride(const struct intel_plane_state *master_plane_state,
+			     const struct intel_plane_state *plane_state);
+int intel_plane_check_src_coordinates(const struct intel_plane_state *master_plane_state,
+				      struct intel_plane_state *plane_state);
 int chv_plane_check_rotation(const struct intel_plane_state *plane_state);
 struct intel_plane *
 skl_universal_plane_create(struct drm_i915_private *dev_priv,
-- 
2.20.1



More information about the Intel-gfx-trybot mailing list