All of lore.kernel.org
 help / color / mirror / Atom feed
From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
To: intel-gfx@lists.freedesktop.org
Subject: [PATCH 19/23] drm/i915: Prepare atomic plane check for bigjoiner planes
Date: Fri, 20 Sep 2019 13:42:31 +0200	[thread overview]
Message-ID: <20190920114235.22411-19-maarten.lankhorst@linux.intel.com> (raw)
In-Reply-To: <20190920114235.22411-1-maarten.lankhorst@linux.intel.com>

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@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_atomic.c   |   7 +-
 .../gpu/drm/i915/display/intel_atomic_plane.c |  88 +++++++-
 .../gpu/drm/i915/display/intel_atomic_plane.h |   8 +-
 drivers/gpu/drm/i915/display/intel_display.c  | 213 ++++++++++--------
 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, 258 insertions(+), 141 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_atomic.c b/drivers/gpu/drm/i915/display/intel_atomic.c
index 0db04064c86e..a8f34254cd2a 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 5db091e4ad6a..a0c1d1696c8c 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,8 +144,12 @@ 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);
-	const struct drm_framebuffer *fb = new_plane_state->base.fb;
+	const struct drm_framebuffer *fb;
+	struct intel_atomic_state *state =
+		to_intel_atomic_state(new_plane_state->base.state);
 	int ret;
 
 	new_crtc_state->active_planes &= ~BIT(plane->id);
@@ -153,10 +158,21 @@ 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,6 +180,7 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_
 	if (new_plane_state->base.visible)
 		new_crtc_state->active_planes |= BIT(plane->id);
 
+	fb = new_master_plane_state->base.fb;
 	if (new_plane_state->base.visible &&
 	    drm_format_info_is_yuv_semiplanar(fb->format))
 		new_crtc_state->nv12_planes |= BIT(plane->id);
@@ -176,10 +193,11 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_
 		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 *
@@ -441,6 +459,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 7f86c358cf45..690c3d10ce44 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -2289,12 +2289,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);
 }
@@ -2365,14 +2366,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)
@@ -2594,11 +2596,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;
 
 	/*
@@ -2608,7 +2611,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;
 
 	/*
@@ -2788,14 +2791,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;
@@ -2901,11 +2905,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)
@@ -2913,8 +2918,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
@@ -2922,7 +2927,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);
@@ -2946,7 +2951,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)
@@ -3363,10 +3368,11 @@ static int icl_max_plane_height(void)
 	return 4320;
 }
 
-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;
@@ -3385,7 +3391,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;
@@ -3401,11 +3407,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;
@@ -3433,7 +3440,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);
 
 	/*
@@ -3442,7 +3449,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));
 
 	/*
@@ -3460,7 +3467,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);
 		}
 	}
@@ -3470,11 +3477,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);
 		}
 
@@ -3499,10 +3506,11 @@ 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;
+	const struct drm_framebuffer *fb = master_plane_state->base.fb;
+	unsigned int rotation = master_plane_state->base.rotation;
 	int max_width = skl_max_plane_width(fb, 1, rotation);
 	int max_height = 4096;
 	int x = plane_state->base.src.x1 >> 17;
@@ -3512,7 +3520,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) {
@@ -3528,7 +3536,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;
@@ -3540,7 +3549,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;
@@ -3549,12 +3558,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;
 
@@ -3566,11 +3576,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 {
@@ -3579,11 +3589,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
@@ -3694,7 +3700,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;
 
@@ -3708,6 +3714,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;
@@ -3759,6 +3766,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);
@@ -3784,7 +3792,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;
 
@@ -5549,12 +5557,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;
@@ -5577,7 +5586,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);
@@ -10662,11 +10671,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;
 
@@ -10679,19 +10689,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;
@@ -10718,13 +10733,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;
 
@@ -10736,6 +10752,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) {
@@ -10749,6 +10766,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;
@@ -10759,22 +10777,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;
 
@@ -10819,12 +10836,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;
 
@@ -10877,8 +10895,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);
@@ -11032,15 +11050,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;
 
@@ -11049,17 +11068,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;
@@ -11076,19 +11095,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;
@@ -11099,11 +11119,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);
@@ -11151,10 +11171,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,
@@ -11662,6 +11689,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);
@@ -11674,7 +11702,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;
 	}
@@ -15269,7 +15297,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;
@@ -15539,6 +15567,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 764d05d13b9e..a8b2198fcef1 100644
--- a/drivers/gpu/drm/i915/display/intel_display.h
+++ b/drivers/gpu/drm/i915/display/intel_display.h
@@ -562,8 +562,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 f05f4830a529..154fb07a62eb 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1117,6 +1117,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 9337f5a8dce0..00d5f7eb0c29 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.
@@ -1574,6 +1576,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);
@@ -1592,10 +1595,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;
 
@@ -1606,7 +1608,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;
 
@@ -1641,6 +1643,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;
@@ -1649,11 +1652,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;
 
@@ -1664,7 +1666,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;
 
@@ -1777,10 +1779,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 */
@@ -1795,33 +1798,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;
 
@@ -1832,11 +1839,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;
 
@@ -1844,11 +1851,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

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  parent reply	other threads:[~2019-09-20 11:42 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-09-20 11:42 [PATCH 01/23] drm/i915/dp: Fix dsc bpp calculations, v2 Maarten Lankhorst
2019-09-20 11:42 ` [PATCH 02/23] HAX drm/i915: Disable FEC entirely for now Maarten Lankhorst
2019-09-23 13:08   ` Maarten Lankhorst
2019-09-20 11:42 ` [PATCH 03/23] drm/i915: Prepare to split crtc state in uapi and hw state Maarten Lankhorst
2019-09-24 23:40   ` Matt Roper
2019-09-25  9:09     ` Maarten Lankhorst
2019-09-20 11:42 ` [PATCH 04/23] drm/i915: Handle a few more cases for hw/sw split Maarten Lankhorst
2019-09-24 23:40   ` Matt Roper
2019-09-20 11:42 ` [PATCH 05/23] drm/i915: Complete sw/hw split Maarten Lankhorst
2019-09-24 23:41   ` Matt Roper
2019-09-25  9:29     ` Maarten Lankhorst
2019-09-25 13:01   ` Ville Syrjälä
2019-09-25 14:12     ` Maarten Lankhorst
2019-09-25 14:18     ` Maarten Lankhorst
2019-09-25 14:54       ` Ville Syrjälä
2019-09-20 11:42 ` [PATCH 06/23] drm/i915: Get rid of crtc_state->fb_changed Maarten Lankhorst
2019-09-24 23:44   ` Matt Roper
2019-09-20 11:42 ` [PATCH 07/23] drm/i915: Remove begin/finish_crtc_commit Maarten Lankhorst
2019-09-25  4:17   ` Matt Roper
2019-09-25 14:14     ` Maarten Lankhorst
2019-09-25 22:14   ` Manasi Navare
2019-09-20 11:42 ` [PATCH 08/23] drm/i915: Rename planar linked plane variables Maarten Lankhorst
2019-09-25  4:30   ` Matt Roper
2019-09-20 11:42 ` [PATCH 09/23] drm/i915: Do not add all planes when checking scalers on glk+ Maarten Lankhorst
2019-09-25  4:55   ` Matt Roper
2019-09-25 12:45     ` Maarten Lankhorst
2019-09-25 13:02     ` Ville Syrjälä
2019-09-20 11:42 ` [PATCH 10/23] drm/i915/dp: Allow big joiner modes in intel_dp_mode_valid() Maarten Lankhorst
2019-09-25  5:30   ` Matt Roper
2019-09-25  5:56     ` Matt Roper
2019-09-25 22:09     ` Manasi Navare
2019-09-26 16:00       ` Maarten Lankhorst
2019-09-20 11:42 ` [PATCH 11/23] drm/i915: Try to make bigjoiner work in atomic check Maarten Lankhorst
2019-09-26  3:48   ` Matt Roper
2019-09-30 14:12     ` Maarten Lankhorst
2019-09-20 11:42 ` [PATCH 12/23] drm/i915: Enable big joiner support in enable and disable sequences Maarten Lankhorst
2019-09-26  5:18   ` Matt Roper
2019-09-26 23:54     ` Matt Roper
2019-09-27  8:25       ` Maarten Lankhorst
2019-09-20 11:42 ` [PATCH 13/23] drm/i915: Make hardware readout work on i915 Maarten Lankhorst
2019-09-27  0:49   ` Matt Roper
2019-09-20 11:42 ` [PATCH 14/23] drm/i915: Prepare update_slave() for bigjoiner plane updates Maarten Lankhorst
2019-09-27  3:18   ` Matt Roper
2019-09-20 11:42 ` [PATCH 15/23] drm/i915: Link planes in a bigjoiner configuration Maarten Lankhorst
2019-10-01 16:44   ` Matt Roper
2019-10-01 17:21     ` Ville Syrjälä
2019-09-20 11:42 ` [PATCH 16/23] drm/i915: Program planes in bigjoiner mode Maarten Lankhorst
2019-09-26 13:06   ` Ville Syrjälä
2019-09-26 15:50     ` Maarten Lankhorst
2019-09-26 16:09       ` Ville Syrjälä
2019-09-26 16:13         ` Maarten Lankhorst
2019-09-26 16:26           ` Ville Syrjälä
2019-09-26 19:11         ` Ville Syrjälä
2019-09-27  8:56           ` Maarten Lankhorst
2019-09-27 14:41             ` Ville Syrjälä
2019-09-27 15:00               ` Ville Syrjälä
2019-09-20 11:42 ` [PATCH 17/23] drm/i915: Add intel_update_bigjoiner handling Maarten Lankhorst
2019-09-20 11:42 ` [PATCH 18/23] drm/i915: Disable FBC in bigjoiner configuration Maarten Lankhorst
2019-09-20 11:42 ` Maarten Lankhorst [this message]
2019-09-20 11:42 ` [PATCH 20/23] drm/i915: Make prepare_plane_fb() work with bigjoiner planes Maarten Lankhorst
2019-09-20 11:42 ` [PATCH 21/23] drm/i915: Make sure watermarks work correctly with bigjoiner as well Maarten Lankhorst
2019-09-20 11:42 ` [PATCH 22/23] drm/i915: Add debugfs dumping for bigjoiner Maarten Lankhorst
2019-09-20 11:42 ` [PATCH 23/23] HAX to make it work on the icelake test system Maarten Lankhorst
2019-09-20 14:52 ` ✗ Fi.CI.CHECKPATCH: warning for series starting with [01/23] drm/i915/dp: Fix dsc bpp calculations, v2 Patchwork
2019-09-20 14:59 ` ✗ Fi.CI.SPARSE: " Patchwork
2019-09-20 15:16 ` ✓ Fi.CI.BAT: success " Patchwork
2019-09-20 16:38 ` [Intel-gfx] [PATCH 01/23] " Ville Syrjälä
2019-09-23 12:52   ` [PATCH] drm/i915/dp: Fix dsc bpp calculations, v3 Maarten Lankhorst
2019-09-23 13:03     ` Ville Syrjälä
2019-09-23 13:03       ` Ville Syrjälä
2019-09-23 14:49       ` [PATCH] drm/i915/dp: Fix dsc bpp calculations, v4 Maarten Lankhorst
2019-09-23 14:50         ` Maarten Lankhorst
2019-09-23 14:57         ` Ville Syrjälä
2019-09-23 15:56           ` Manasi Navare
2019-09-23 15:56           ` [Intel-gfx] " Ville Syrjälä
2019-09-23 14:22     ` [Intel-gfx] [PATCH] drm/i915/dp: Fix dsc bpp calculations, v3 kbuild test robot
2019-09-23 14:22       ` kbuild test robot
2019-09-23 15:53     ` Manasi Navare
2019-09-21 12:06 ` [PATCH 01/23] drm/i915/dp: Fix dsc bpp calculations, v2 Sasha Levin
2019-09-21 15:22 ` ✗ Fi.CI.IGT: failure for series starting with [01/23] " Patchwork
2019-09-23 10:43   ` Maarten Lankhorst
2019-09-23 19:10 ` ✗ Fi.CI.BUILD: failure for series starting with drm/i915/dp: Fix dsc bpp calculations, v4. (rev3) Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190920114235.22411-19-maarten.lankhorst@linux.intel.com \
    --to=maarten.lankhorst@linux.intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.