diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_sprite.c')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_sprite.c | 1714 | 
1 files changed, 24 insertions, 1690 deletions
| diff --git a/drivers/gpu/drm/i915/display/intel_sprite.c b/drivers/gpu/drm/i915/display/intel_sprite.c index 993543334a1e..acbf4e63b245 100644 --- a/drivers/gpu/drm/i915/display/intel_sprite.c +++ b/drivers/gpu/drm/i915/display/intel_sprite.c @@ -45,284 +45,10 @@  #include "intel_atomic_plane.h"  #include "intel_display_types.h"  #include "intel_frontbuffer.h" -#include "intel_pm.h" -#include "intel_psr.h" -#include "intel_dsi.h"  #include "intel_sprite.h"  #include "i9xx_plane.h"  #include "intel_vrr.h" -int intel_usecs_to_scanlines(const struct drm_display_mode *adjusted_mode, -			     int usecs) -{ -	/* paranoia */ -	if (!adjusted_mode->crtc_htotal) -		return 1; - -	return DIV_ROUND_UP(usecs * adjusted_mode->crtc_clock, -			    1000 * adjusted_mode->crtc_htotal); -} - -static int intel_mode_vblank_start(const struct drm_display_mode *mode) -{ -	int vblank_start = mode->crtc_vblank_start; - -	if (mode->flags & DRM_MODE_FLAG_INTERLACE) -		vblank_start = DIV_ROUND_UP(vblank_start, 2); - -	return vblank_start; -} - -/** - * intel_pipe_update_start() - start update of a set of display registers - * @new_crtc_state: the new crtc state - * - * Mark the start of an update to pipe registers that should be updated - * atomically regarding vblank. If the next vblank will happens within - * the next 100 us, this function waits until the vblank passes. - * - * After a successful call to this function, interrupts will be disabled - * until a subsequent call to intel_pipe_update_end(). That is done to - * avoid random delays. - */ -void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state) -{ -	struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc); -	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); -	const struct drm_display_mode *adjusted_mode = &new_crtc_state->hw.adjusted_mode; -	long timeout = msecs_to_jiffies_timeout(1); -	int scanline, min, max, vblank_start; -	wait_queue_head_t *wq = drm_crtc_vblank_waitqueue(&crtc->base); -	bool need_vlv_dsi_wa = (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) && -		intel_crtc_has_type(new_crtc_state, INTEL_OUTPUT_DSI); -	DEFINE_WAIT(wait); -	u32 psr_status; - -	if (new_crtc_state->uapi.async_flip) -		return; - -	if (new_crtc_state->vrr.enable) -		vblank_start = intel_vrr_vmax_vblank_start(new_crtc_state); -	else -		vblank_start = intel_mode_vblank_start(adjusted_mode); - -	/* FIXME needs to be calibrated sensibly */ -	min = vblank_start - intel_usecs_to_scanlines(adjusted_mode, -						      VBLANK_EVASION_TIME_US); -	max = vblank_start - 1; - -	if (min <= 0 || max <= 0) -		goto irq_disable; - -	if (drm_WARN_ON(&dev_priv->drm, drm_crtc_vblank_get(&crtc->base))) -		goto irq_disable; - -	/* -	 * Wait for psr to idle out after enabling the VBL interrupts -	 * VBL interrupts will start the PSR exit and prevent a PSR -	 * re-entry as well. -	 */ -	if (intel_psr_wait_for_idle(new_crtc_state, &psr_status)) -		drm_err(&dev_priv->drm, -			"PSR idle timed out 0x%x, atomic update may fail\n", -			psr_status); - -	local_irq_disable(); - -	crtc->debug.min_vbl = min; -	crtc->debug.max_vbl = max; -	trace_intel_pipe_update_start(crtc); - -	for (;;) { -		/* -		 * prepare_to_wait() has a memory barrier, which guarantees -		 * other CPUs can see the task state update by the time we -		 * read the scanline. -		 */ -		prepare_to_wait(wq, &wait, TASK_UNINTERRUPTIBLE); - -		scanline = intel_get_crtc_scanline(crtc); -		if (scanline < min || scanline > max) -			break; - -		if (!timeout) { -			drm_err(&dev_priv->drm, -				"Potential atomic update failure on pipe %c\n", -				pipe_name(crtc->pipe)); -			break; -		} - -		local_irq_enable(); - -		timeout = schedule_timeout(timeout); - -		local_irq_disable(); -	} - -	finish_wait(wq, &wait); - -	drm_crtc_vblank_put(&crtc->base); - -	/* -	 * On VLV/CHV DSI the scanline counter would appear to -	 * increment approx. 1/3 of a scanline before start of vblank. -	 * The registers still get latched at start of vblank however. -	 * This means we must not write any registers on the first -	 * line of vblank (since not the whole line is actually in -	 * vblank). And unfortunately we can't use the interrupt to -	 * wait here since it will fire too soon. We could use the -	 * frame start interrupt instead since it will fire after the -	 * critical scanline, but that would require more changes -	 * in the interrupt code. So for now we'll just do the nasty -	 * thing and poll for the bad scanline to pass us by. -	 * -	 * FIXME figure out if BXT+ DSI suffers from this as well -	 */ -	while (need_vlv_dsi_wa && scanline == vblank_start) -		scanline = intel_get_crtc_scanline(crtc); - -	crtc->debug.scanline_start = scanline; -	crtc->debug.start_vbl_time = ktime_get(); -	crtc->debug.start_vbl_count = intel_crtc_get_vblank_counter(crtc); - -	trace_intel_pipe_update_vblank_evaded(crtc); -	return; - -irq_disable: -	local_irq_disable(); -} - -#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_VBLANK_EVADE) -static void dbg_vblank_evade(struct intel_crtc *crtc, ktime_t end) -{ -	u64 delta = ktime_to_ns(ktime_sub(end, crtc->debug.start_vbl_time)); -	unsigned int h; - -	h = ilog2(delta >> 9); -	if (h >= ARRAY_SIZE(crtc->debug.vbl.times)) -		h = ARRAY_SIZE(crtc->debug.vbl.times) - 1; -	crtc->debug.vbl.times[h]++; - -	crtc->debug.vbl.sum += delta; -	if (!crtc->debug.vbl.min || delta < crtc->debug.vbl.min) -		crtc->debug.vbl.min = delta; -	if (delta > crtc->debug.vbl.max) -		crtc->debug.vbl.max = delta; - -	if (delta > 1000 * VBLANK_EVASION_TIME_US) { -		drm_dbg_kms(crtc->base.dev, -			    "Atomic update on pipe (%c) took %lld us, max time under evasion is %u us\n", -			    pipe_name(crtc->pipe), -			    div_u64(delta, 1000), -			    VBLANK_EVASION_TIME_US); -		crtc->debug.vbl.over++; -	} -} -#else -static void dbg_vblank_evade(struct intel_crtc *crtc, ktime_t end) {} -#endif - -/** - * intel_pipe_update_end() - end update of a set of display registers - * @new_crtc_state: the new crtc state - * - * Mark the end of an update started with intel_pipe_update_start(). This - * re-enables interrupts and verifies the update was actually completed - * before a vblank. - */ -void intel_pipe_update_end(struct intel_crtc_state *new_crtc_state) -{ -	struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc); -	enum pipe pipe = crtc->pipe; -	int scanline_end = intel_get_crtc_scanline(crtc); -	u32 end_vbl_count = intel_crtc_get_vblank_counter(crtc); -	ktime_t end_vbl_time = ktime_get(); -	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); - -	if (new_crtc_state->uapi.async_flip) -		return; - -	trace_intel_pipe_update_end(crtc, end_vbl_count, scanline_end); - -	/* -	 * Incase of mipi dsi command mode, we need to set frame update -	 * request for every commit. -	 */ -	if (INTEL_GEN(dev_priv) >= 11 && -	    intel_crtc_has_type(new_crtc_state, INTEL_OUTPUT_DSI)) -		icl_dsi_frame_update(new_crtc_state); - -	/* We're still in the vblank-evade critical section, this can't race. -	 * Would be slightly nice to just grab the vblank count and arm the -	 * event outside of the critical section - the spinlock might spin for a -	 * while ... */ -	if (new_crtc_state->uapi.event) { -		drm_WARN_ON(&dev_priv->drm, -			    drm_crtc_vblank_get(&crtc->base) != 0); - -		spin_lock(&crtc->base.dev->event_lock); -		drm_crtc_arm_vblank_event(&crtc->base, -				          new_crtc_state->uapi.event); -		spin_unlock(&crtc->base.dev->event_lock); - -		new_crtc_state->uapi.event = NULL; -	} - -	local_irq_enable(); - -	/* Send VRR Push to terminate Vblank */ -	intel_vrr_send_push(new_crtc_state); - -	if (intel_vgpu_active(dev_priv)) -		return; - -	if (crtc->debug.start_vbl_count && -	    crtc->debug.start_vbl_count != end_vbl_count) { -		drm_err(&dev_priv->drm, -			"Atomic update failure on pipe %c (start=%u end=%u) time %lld us, min %d, max %d, scanline start %d, end %d\n", -			pipe_name(pipe), crtc->debug.start_vbl_count, -			end_vbl_count, -			ktime_us_delta(end_vbl_time, -				       crtc->debug.start_vbl_time), -			crtc->debug.min_vbl, crtc->debug.max_vbl, -			crtc->debug.scanline_start, scanline_end); -	} - -	dbg_vblank_evade(crtc, end_vbl_time); -} - -int intel_plane_check_stride(const struct intel_plane_state *plane_state) -{ -	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane); -	const struct drm_framebuffer *fb = plane_state->hw.fb; -	unsigned int rotation = plane_state->hw.rotation; -	u32 stride, max_stride; - -	/* -	 * We ignore stride for all invisible planes that -	 * can be remapped. Otherwise we could end up -	 * with a false positive when the remapping didn't -	 * kick in due the plane being invisible. -	 */ -	if (intel_plane_can_remap(plane_state) && -	    !plane_state->uapi.visible) -		return 0; - -	/* FIXME other color planes? */ -	stride = plane_state->color_plane[0].stride; -	max_stride = plane->max_stride(plane, fb->format->format, -				       fb->modifier, rotation); - -	if (stride > max_stride) { -		DRM_DEBUG_KMS("[FB:%d] stride (%d) exceeds [PLANE:%d:%s] max stride (%d)\n", -			      fb->base.id, stride, -			      plane->base.base.id, plane->base.name, max_stride); -		return -EINVAL; -	} - -	return 0; -} -  int intel_plane_check_src_coordinates(struct intel_plane_state *plane_state)  {  	const struct drm_framebuffer *fb = plane_state->hw.fb; @@ -380,584 +106,6 @@ int intel_plane_check_src_coordinates(struct intel_plane_state *plane_state)  	return 0;  } -static u8 icl_nv12_y_plane_mask(struct drm_i915_private *i915) -{ -	if (IS_ROCKETLAKE(i915)) -		return BIT(PLANE_SPRITE2) | BIT(PLANE_SPRITE3); -	else -		return BIT(PLANE_SPRITE4) | BIT(PLANE_SPRITE5); -} - -bool icl_is_nv12_y_plane(struct drm_i915_private *dev_priv, -			 enum plane_id plane_id) -{ -	return INTEL_GEN(dev_priv) >= 11 && -		icl_nv12_y_plane_mask(dev_priv) & BIT(plane_id); -} - -bool icl_is_hdr_plane(struct drm_i915_private *dev_priv, enum plane_id plane_id) -{ -	return INTEL_GEN(dev_priv) >= 11 && -		icl_hdr_plane_mask() & BIT(plane_id); -} - -static void -skl_plane_ratio(const struct intel_crtc_state *crtc_state, -		const struct intel_plane_state *plane_state, -		unsigned int *num, unsigned int *den) -{ -	struct drm_i915_private *dev_priv = to_i915(plane_state->uapi.plane->dev); -	const struct drm_framebuffer *fb = plane_state->hw.fb; - -	if (fb->format->cpp[0] == 8) { -		if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)) { -			*num = 10; -			*den = 8; -		} else { -			*num = 9; -			*den = 8; -		} -	} else { -		*num = 1; -		*den = 1; -	} -} - -static int skl_plane_min_cdclk(const struct intel_crtc_state *crtc_state, -			       const struct intel_plane_state *plane_state) -{ -	struct drm_i915_private *dev_priv = to_i915(plane_state->uapi.plane->dev); -	unsigned int num, den; -	unsigned int pixel_rate = intel_plane_pixel_rate(crtc_state, plane_state); - -	skl_plane_ratio(crtc_state, plane_state, &num, &den); - -	/* two pixels per clock on glk+ */ -	if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)) -		den *= 2; - -	return DIV_ROUND_UP(pixel_rate * num, den); -} - -static int skl_plane_max_width(const struct drm_framebuffer *fb, -			       int color_plane, -			       unsigned int rotation) -{ -	int cpp = fb->format->cpp[color_plane]; - -	switch (fb->modifier) { -	case DRM_FORMAT_MOD_LINEAR: -	case I915_FORMAT_MOD_X_TILED: -		/* -		 * Validated limit is 4k, but has 5k should -		 * work apart from the following features: -		 * - Ytile (already limited to 4k) -		 * - FP16 (already limited to 4k) -		 * - render compression (already limited to 4k) -		 * - KVMR sprite and cursor (don't care) -		 * - horizontal panning (TODO verify this) -		 * - pipe and plane scaling (TODO verify this) -		 */ -		if (cpp == 8) -			return 4096; -		else -			return 5120; -	case I915_FORMAT_MOD_Y_TILED_CCS: -	case I915_FORMAT_MOD_Yf_TILED_CCS: -	case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS: -		/* FIXME AUX plane? */ -	case I915_FORMAT_MOD_Y_TILED: -	case I915_FORMAT_MOD_Yf_TILED: -		if (cpp == 8) -			return 2048; -		else -			return 4096; -	default: -		MISSING_CASE(fb->modifier); -		return 2048; -	} -} - -static int glk_plane_max_width(const struct drm_framebuffer *fb, -			       int color_plane, -			       unsigned int rotation) -{ -	int cpp = fb->format->cpp[color_plane]; - -	switch (fb->modifier) { -	case DRM_FORMAT_MOD_LINEAR: -	case I915_FORMAT_MOD_X_TILED: -		if (cpp == 8) -			return 4096; -		else -			return 5120; -	case I915_FORMAT_MOD_Y_TILED_CCS: -	case I915_FORMAT_MOD_Yf_TILED_CCS: -		/* FIXME AUX plane? */ -	case I915_FORMAT_MOD_Y_TILED: -	case I915_FORMAT_MOD_Yf_TILED: -		if (cpp == 8) -			return 2048; -		else -			return 5120; -	default: -		MISSING_CASE(fb->modifier); -		return 2048; -	} -} - -static int icl_plane_min_width(const struct drm_framebuffer *fb, -			       int color_plane, -			       unsigned int rotation) -{ -	/* Wa_14011264657, Wa_14011050563: gen11+ */ -	switch (fb->format->format) { -	case DRM_FORMAT_C8: -		return 18; -	case DRM_FORMAT_RGB565: -		return 10; -	case DRM_FORMAT_XRGB8888: -	case DRM_FORMAT_XBGR8888: -	case DRM_FORMAT_ARGB8888: -	case DRM_FORMAT_ABGR8888: -	case DRM_FORMAT_XRGB2101010: -	case DRM_FORMAT_XBGR2101010: -	case DRM_FORMAT_ARGB2101010: -	case DRM_FORMAT_ABGR2101010: -	case DRM_FORMAT_XVYU2101010: -	case DRM_FORMAT_Y212: -	case DRM_FORMAT_Y216: -		return 6; -	case DRM_FORMAT_NV12: -		return 20; -	case DRM_FORMAT_P010: -	case DRM_FORMAT_P012: -	case DRM_FORMAT_P016: -		return 12; -	case DRM_FORMAT_XRGB16161616F: -	case DRM_FORMAT_XBGR16161616F: -	case DRM_FORMAT_ARGB16161616F: -	case DRM_FORMAT_ABGR16161616F: -	case DRM_FORMAT_XVYU12_16161616: -	case DRM_FORMAT_XVYU16161616: -		return 4; -	default: -		return 1; -	} -} - -static int icl_plane_max_width(const struct drm_framebuffer *fb, -			       int color_plane, -			       unsigned int rotation) -{ -	return 5120; -} - -static int skl_plane_max_height(const struct drm_framebuffer *fb, -				int color_plane, -				unsigned int rotation) -{ -	return 4096; -} - -static int icl_plane_max_height(const struct drm_framebuffer *fb, -				int color_plane, -				unsigned int rotation) -{ -	return 4320; -} - -static unsigned int -skl_plane_max_stride(struct intel_plane *plane, -		     u32 pixel_format, u64 modifier, -		     unsigned int rotation) -{ -	const struct drm_format_info *info = drm_format_info(pixel_format); -	int cpp = info->cpp[0]; - -	/* -	 * "The stride in bytes must not exceed the -	 * of the size of 8K pixels and 32K bytes." -	 */ -	if (drm_rotation_90_or_270(rotation)) -		return min(8192, 32768 / cpp); -	else -		return min(8192 * cpp, 32768); -} - -static void -skl_program_scaler(struct intel_plane *plane, -		   const struct intel_crtc_state *crtc_state, -		   const struct intel_plane_state *plane_state) -{ -	struct drm_i915_private *dev_priv = to_i915(plane->base.dev); -	const struct drm_framebuffer *fb = plane_state->hw.fb; -	enum pipe pipe = plane->pipe; -	int scaler_id = plane_state->scaler_id; -	const struct intel_scaler *scaler = -		&crtc_state->scaler_state.scalers[scaler_id]; -	int crtc_x = plane_state->uapi.dst.x1; -	int crtc_y = plane_state->uapi.dst.y1; -	u32 crtc_w = drm_rect_width(&plane_state->uapi.dst); -	u32 crtc_h = drm_rect_height(&plane_state->uapi.dst); -	u16 y_hphase, uv_rgb_hphase; -	u16 y_vphase, uv_rgb_vphase; -	int hscale, vscale; -	u32 ps_ctrl; - -	hscale = drm_rect_calc_hscale(&plane_state->uapi.src, -				      &plane_state->uapi.dst, -				      0, INT_MAX); -	vscale = drm_rect_calc_vscale(&plane_state->uapi.src, -				      &plane_state->uapi.dst, -				      0, INT_MAX); - -	/* TODO: handle sub-pixel coordinates */ -	if (intel_format_info_is_yuv_semiplanar(fb->format, fb->modifier) && -	    !icl_is_hdr_plane(dev_priv, plane->id)) { -		y_hphase = skl_scaler_calc_phase(1, hscale, false); -		y_vphase = skl_scaler_calc_phase(1, vscale, false); - -		/* MPEG2 chroma siting convention */ -		uv_rgb_hphase = skl_scaler_calc_phase(2, hscale, true); -		uv_rgb_vphase = skl_scaler_calc_phase(2, vscale, false); -	} else { -		/* not used */ -		y_hphase = 0; -		y_vphase = 0; - -		uv_rgb_hphase = skl_scaler_calc_phase(1, hscale, false); -		uv_rgb_vphase = skl_scaler_calc_phase(1, vscale, false); -	} - -	ps_ctrl = skl_scaler_get_filter_select(plane_state->hw.scaling_filter, 0); -	ps_ctrl |= PS_SCALER_EN | PS_PLANE_SEL(plane->id) | scaler->mode; - -	skl_scaler_setup_filter(dev_priv, pipe, scaler_id, 0, -				plane_state->hw.scaling_filter); - -	intel_de_write_fw(dev_priv, SKL_PS_CTRL(pipe, scaler_id), ps_ctrl); -	intel_de_write_fw(dev_priv, SKL_PS_VPHASE(pipe, scaler_id), -			  PS_Y_PHASE(y_vphase) | PS_UV_RGB_PHASE(uv_rgb_vphase)); -	intel_de_write_fw(dev_priv, SKL_PS_HPHASE(pipe, scaler_id), -			  PS_Y_PHASE(y_hphase) | PS_UV_RGB_PHASE(uv_rgb_hphase)); -	intel_de_write_fw(dev_priv, SKL_PS_WIN_POS(pipe, scaler_id), -			  (crtc_x << 16) | crtc_y); -	intel_de_write_fw(dev_priv, SKL_PS_WIN_SZ(pipe, scaler_id), -			  (crtc_w << 16) | crtc_h); -} - -/* Preoffset values for YUV to RGB Conversion */ -#define PREOFF_YUV_TO_RGB_HI		0x1800 -#define PREOFF_YUV_TO_RGB_ME		0x0000 -#define PREOFF_YUV_TO_RGB_LO		0x1800 - -#define  ROFF(x)          (((x) & 0xffff) << 16) -#define  GOFF(x)          (((x) & 0xffff) << 0) -#define  BOFF(x)          (((x) & 0xffff) << 16) - -/* - * Programs the input color space conversion stage for ICL HDR planes. - * Note that it is assumed that this stage always happens after YUV - * range correction. Thus, the input to this stage is assumed to be - * in full-range YCbCr. - */ -static void -icl_program_input_csc(struct intel_plane *plane, -		      const struct intel_crtc_state *crtc_state, -		      const struct intel_plane_state *plane_state) -{ -	struct drm_i915_private *dev_priv = to_i915(plane->base.dev); -	enum pipe pipe = plane->pipe; -	enum plane_id plane_id = plane->id; - -	static const u16 input_csc_matrix[][9] = { -		/* -		 * BT.601 full range YCbCr -> full range RGB -		 * The matrix required is : -		 * [1.000, 0.000, 1.371, -		 *  1.000, -0.336, -0.698, -		 *  1.000, 1.732, 0.0000] -		 */ -		[DRM_COLOR_YCBCR_BT601] = { -			0x7AF8, 0x7800, 0x0, -			0x8B28, 0x7800, 0x9AC0, -			0x0, 0x7800, 0x7DD8, -		}, -		/* -		 * BT.709 full range YCbCr -> full range RGB -		 * The matrix required is : -		 * [1.000, 0.000, 1.574, -		 *  1.000, -0.187, -0.468, -		 *  1.000, 1.855, 0.0000] -		 */ -		[DRM_COLOR_YCBCR_BT709] = { -			0x7C98, 0x7800, 0x0, -			0x9EF8, 0x7800, 0xAC00, -			0x0, 0x7800,  0x7ED8, -		}, -		/* -		 * BT.2020 full range YCbCr -> full range RGB -		 * The matrix required is : -		 * [1.000, 0.000, 1.474, -		 *  1.000, -0.1645, -0.5713, -		 *  1.000, 1.8814, 0.0000] -		 */ -		[DRM_COLOR_YCBCR_BT2020] = { -			0x7BC8, 0x7800, 0x0, -			0x8928, 0x7800, 0xAA88, -			0x0, 0x7800, 0x7F10, -		}, -	}; -	const u16 *csc = input_csc_matrix[plane_state->hw.color_encoding]; - -	intel_de_write_fw(dev_priv, PLANE_INPUT_CSC_COEFF(pipe, plane_id, 0), -			  ROFF(csc[0]) | GOFF(csc[1])); -	intel_de_write_fw(dev_priv, PLANE_INPUT_CSC_COEFF(pipe, plane_id, 1), -			  BOFF(csc[2])); -	intel_de_write_fw(dev_priv, PLANE_INPUT_CSC_COEFF(pipe, plane_id, 2), -			  ROFF(csc[3]) | GOFF(csc[4])); -	intel_de_write_fw(dev_priv, PLANE_INPUT_CSC_COEFF(pipe, plane_id, 3), -			  BOFF(csc[5])); -	intel_de_write_fw(dev_priv, PLANE_INPUT_CSC_COEFF(pipe, plane_id, 4), -			  ROFF(csc[6]) | GOFF(csc[7])); -	intel_de_write_fw(dev_priv, PLANE_INPUT_CSC_COEFF(pipe, plane_id, 5), -			  BOFF(csc[8])); - -	intel_de_write_fw(dev_priv, PLANE_INPUT_CSC_PREOFF(pipe, plane_id, 0), -			  PREOFF_YUV_TO_RGB_HI); -	intel_de_write_fw(dev_priv, PLANE_INPUT_CSC_PREOFF(pipe, plane_id, 1), -			  PREOFF_YUV_TO_RGB_ME); -	intel_de_write_fw(dev_priv, PLANE_INPUT_CSC_PREOFF(pipe, plane_id, 2), -			  PREOFF_YUV_TO_RGB_LO); -	intel_de_write_fw(dev_priv, -			  PLANE_INPUT_CSC_POSTOFF(pipe, plane_id, 0), 0x0); -	intel_de_write_fw(dev_priv, -			  PLANE_INPUT_CSC_POSTOFF(pipe, plane_id, 1), 0x0); -	intel_de_write_fw(dev_priv, -			  PLANE_INPUT_CSC_POSTOFF(pipe, plane_id, 2), 0x0); -} - -static void -skl_plane_async_flip(struct intel_plane *plane, -		     const struct intel_crtc_state *crtc_state, -		     const struct intel_plane_state *plane_state, -		     bool async_flip) -{ -	struct drm_i915_private *dev_priv = to_i915(plane->base.dev); -	unsigned long irqflags; -	enum plane_id plane_id = plane->id; -	enum pipe pipe = plane->pipe; -	u32 surf_addr = plane_state->color_plane[0].offset; -	u32 plane_ctl = plane_state->ctl; - -	plane_ctl |= skl_plane_ctl_crtc(crtc_state); - -	if (async_flip) -		plane_ctl |= PLANE_CTL_ASYNC_FLIP; - -	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); - -	intel_de_write_fw(dev_priv, PLANE_CTL(pipe, plane_id), plane_ctl); -	intel_de_write_fw(dev_priv, PLANE_SURF(pipe, plane_id), -			  intel_plane_ggtt_offset(plane_state) + surf_addr); - -	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); -} - -static void -skl_program_plane(struct intel_plane *plane, -		  const struct intel_crtc_state *crtc_state, -		  const struct intel_plane_state *plane_state, -		  int color_plane) -{ -	struct drm_i915_private *dev_priv = to_i915(plane->base.dev); -	enum plane_id plane_id = plane->id; -	enum pipe pipe = plane->pipe; -	const struct drm_intel_sprite_colorkey *key = &plane_state->ckey; -	u32 surf_addr = plane_state->color_plane[color_plane].offset; -	u32 stride = skl_plane_stride(plane_state, color_plane); -	const struct drm_framebuffer *fb = plane_state->hw.fb; -	int aux_plane = intel_main_to_aux_plane(fb, color_plane); -	int crtc_x = plane_state->uapi.dst.x1; -	int crtc_y = plane_state->uapi.dst.y1; -	u32 x = plane_state->color_plane[color_plane].x; -	u32 y = plane_state->color_plane[color_plane].y; -	u32 src_w = drm_rect_width(&plane_state->uapi.src) >> 16; -	u32 src_h = drm_rect_height(&plane_state->uapi.src) >> 16; -	u8 alpha = plane_state->hw.alpha >> 8; -	u32 plane_color_ctl = 0, aux_dist = 0; -	unsigned long irqflags; -	u32 keymsk, keymax; -	u32 plane_ctl = plane_state->ctl; - -	plane_ctl |= skl_plane_ctl_crtc(crtc_state); - -	if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)) -		plane_color_ctl = plane_state->color_ctl | -			glk_plane_color_ctl_crtc(crtc_state); - -	/* Sizes are 0 based */ -	src_w--; -	src_h--; - -	keymax = (key->max_value & 0xffffff) | PLANE_KEYMAX_ALPHA(alpha); - -	keymsk = key->channel_mask & 0x7ffffff; -	if (alpha < 0xff) -		keymsk |= PLANE_KEYMSK_ALPHA_ENABLE; - -	/* The scaler will handle the output position */ -	if (plane_state->scaler_id >= 0) { -		crtc_x = 0; -		crtc_y = 0; -	} - -	if (aux_plane) { -		aux_dist = plane_state->color_plane[aux_plane].offset - surf_addr; - -		if (INTEL_GEN(dev_priv) < 12) -			aux_dist |= skl_plane_stride(plane_state, aux_plane); -	} - -	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); - -	intel_de_write_fw(dev_priv, PLANE_STRIDE(pipe, plane_id), stride); -	intel_de_write_fw(dev_priv, PLANE_POS(pipe, plane_id), -			  (crtc_y << 16) | crtc_x); -	intel_de_write_fw(dev_priv, PLANE_SIZE(pipe, plane_id), -			  (src_h << 16) | src_w); - -	intel_de_write_fw(dev_priv, PLANE_AUX_DIST(pipe, plane_id), aux_dist); - -	if (icl_is_hdr_plane(dev_priv, plane_id)) -		intel_de_write_fw(dev_priv, PLANE_CUS_CTL(pipe, plane_id), -				  plane_state->cus_ctl); - -	if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)) -		intel_de_write_fw(dev_priv, PLANE_COLOR_CTL(pipe, plane_id), -				  plane_color_ctl); - -	if (fb->format->is_yuv && icl_is_hdr_plane(dev_priv, plane_id)) -		icl_program_input_csc(plane, crtc_state, plane_state); - -	if (fb->modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS_CC) -		intel_uncore_write64_fw(&dev_priv->uncore, -					PLANE_CC_VAL(pipe, plane_id), plane_state->ccval); - -	skl_write_plane_wm(plane, crtc_state); - -	intel_de_write_fw(dev_priv, PLANE_KEYVAL(pipe, plane_id), -			  key->min_value); -	intel_de_write_fw(dev_priv, PLANE_KEYMSK(pipe, plane_id), keymsk); -	intel_de_write_fw(dev_priv, PLANE_KEYMAX(pipe, plane_id), keymax); - -	intel_de_write_fw(dev_priv, PLANE_OFFSET(pipe, plane_id), -			  (y << 16) | x); - -	if (INTEL_GEN(dev_priv) < 11) -		intel_de_write_fw(dev_priv, PLANE_AUX_OFFSET(pipe, plane_id), -				  (plane_state->color_plane[1].y << 16) | plane_state->color_plane[1].x); - -	if (!drm_atomic_crtc_needs_modeset(&crtc_state->uapi)) -		intel_psr2_program_plane_sel_fetch(plane, crtc_state, plane_state, color_plane); - -	/* -	 * The control register self-arms if the plane was previously -	 * disabled. Try to make the plane enable atomic by writing -	 * the control register just before the surface register. -	 */ -	intel_de_write_fw(dev_priv, PLANE_CTL(pipe, plane_id), plane_ctl); -	intel_de_write_fw(dev_priv, PLANE_SURF(pipe, plane_id), -			  intel_plane_ggtt_offset(plane_state) + surf_addr); - -	if (plane_state->scaler_id >= 0) -		skl_program_scaler(plane, crtc_state, plane_state); - -	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); -} - -static void -skl_update_plane(struct intel_plane *plane, -		 const struct intel_crtc_state *crtc_state, -		 const struct intel_plane_state *plane_state) -{ -	int color_plane = 0; - -	if (plane_state->planar_linked_plane && !plane_state->planar_slave) -		/* Program the UV plane on planar master */ -		color_plane = 1; - -	skl_program_plane(plane, crtc_state, plane_state, color_plane); -} -static void -skl_disable_plane(struct intel_plane *plane, -		  const struct intel_crtc_state *crtc_state) -{ -	struct drm_i915_private *dev_priv = to_i915(plane->base.dev); -	enum plane_id plane_id = plane->id; -	enum pipe pipe = plane->pipe; -	unsigned long irqflags; - -	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); - -	if (icl_is_hdr_plane(dev_priv, plane_id)) -		intel_de_write_fw(dev_priv, PLANE_CUS_CTL(pipe, plane_id), 0); - -	skl_write_plane_wm(plane, crtc_state); - -	intel_de_write_fw(dev_priv, PLANE_CTL(pipe, plane_id), 0); -	intel_de_write_fw(dev_priv, PLANE_SURF(pipe, plane_id), 0); - -	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); -} - -static bool -skl_plane_get_hw_state(struct intel_plane *plane, -		       enum pipe *pipe) -{ -	struct drm_i915_private *dev_priv = to_i915(plane->base.dev); -	enum intel_display_power_domain power_domain; -	enum plane_id plane_id = plane->id; -	intel_wakeref_t wakeref; -	bool ret; - -	power_domain = POWER_DOMAIN_PIPE(plane->pipe); -	wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain); -	if (!wakeref) -		return false; - -	ret = intel_de_read(dev_priv, PLANE_CTL(plane->pipe, plane_id)) & PLANE_CTL_ENABLE; - -	*pipe = plane->pipe; - -	intel_display_power_put(dev_priv, power_domain, wakeref); - -	return ret; -} - -static void -skl_plane_enable_flip_done(struct intel_plane *plane) -{ -	struct drm_i915_private *i915 = to_i915(plane->base.dev); -	enum pipe pipe = plane->pipe; - -	spin_lock_irq(&i915->irq_lock); -	bdw_enable_pipe_irq(i915, pipe, GEN9_PIPE_PLANE_FLIP_DONE(plane->id)); -	spin_unlock_irq(&i915->irq_lock); -} - -static void -skl_plane_disable_flip_done(struct intel_plane *plane) -{ -	struct drm_i915_private *i915 = to_i915(plane->base.dev); -	enum pipe pipe = plane->pipe; - -	spin_lock_irq(&i915->irq_lock); -	bdw_disable_pipe_irq(i915, pipe, GEN9_PIPE_PLANE_FLIP_DONE(plane->id)); -	spin_unlock_irq(&i915->irq_lock); -} -  static void i9xx_plane_linear_gamma(u16 gamma[8])  {  	/* The points are not evenly spaced. */ @@ -1275,15 +423,15 @@ vlv_update_plane(struct intel_plane *plane,  	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);  	enum pipe pipe = plane->pipe;  	enum plane_id plane_id = plane->id; -	u32 sprsurf_offset = plane_state->color_plane[0].offset; +	u32 sprsurf_offset = plane_state->view.color_plane[0].offset;  	u32 linear_offset;  	const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;  	int crtc_x = plane_state->uapi.dst.x1;  	int crtc_y = plane_state->uapi.dst.y1;  	u32 crtc_w = drm_rect_width(&plane_state->uapi.dst);  	u32 crtc_h = drm_rect_height(&plane_state->uapi.dst); -	u32 x = plane_state->color_plane[0].x; -	u32 y = plane_state->color_plane[0].y; +	u32 x = plane_state->view.color_plane[0].x; +	u32 y = plane_state->view.color_plane[0].y;  	unsigned long irqflags;  	u32 sprctl; @@ -1298,7 +446,7 @@ vlv_update_plane(struct intel_plane *plane,  	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);  	intel_de_write_fw(dev_priv, SPSTRIDE(pipe, plane_id), -			  plane_state->color_plane[0].stride); +			  plane_state->view.color_plane[0].stride);  	intel_de_write_fw(dev_priv, SPPOS(pipe, plane_id),  			  (crtc_y << 16) | crtc_x);  	intel_de_write_fw(dev_priv, SPSIZE(pipe, plane_id), @@ -1692,15 +840,15 @@ ivb_update_plane(struct intel_plane *plane,  {  	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);  	enum pipe pipe = plane->pipe; -	u32 sprsurf_offset = plane_state->color_plane[0].offset; +	u32 sprsurf_offset = plane_state->view.color_plane[0].offset;  	u32 linear_offset;  	const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;  	int crtc_x = plane_state->uapi.dst.x1;  	int crtc_y = plane_state->uapi.dst.y1;  	u32 crtc_w = drm_rect_width(&plane_state->uapi.dst);  	u32 crtc_h = drm_rect_height(&plane_state->uapi.dst); -	u32 x = plane_state->color_plane[0].x; -	u32 y = plane_state->color_plane[0].y; +	u32 x = plane_state->view.color_plane[0].x; +	u32 y = plane_state->view.color_plane[0].y;  	u32 src_w = drm_rect_width(&plane_state->uapi.src) >> 16;  	u32 src_h = drm_rect_height(&plane_state->uapi.src) >> 16;  	u32 sprctl, sprscale = 0; @@ -1722,7 +870,7 @@ ivb_update_plane(struct intel_plane *plane,  	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);  	intel_de_write_fw(dev_priv, SPRSTRIDE(pipe), -			  plane_state->color_plane[0].stride); +			  plane_state->view.color_plane[0].stride);  	intel_de_write_fw(dev_priv, SPRPOS(pipe), (crtc_y << 16) | crtc_x);  	intel_de_write_fw(dev_priv, SPRSIZE(pipe), (crtc_h << 16) | crtc_w);  	if (IS_IVYBRIDGE(dev_priv)) @@ -1898,7 +1046,7 @@ static u32 g4x_sprite_ctl(const struct intel_crtc_state *crtc_state,  	dvscntr = DVS_ENABLE; -	if (IS_GEN(dev_priv, 6)) +	if (IS_SANDYBRIDGE(dev_priv))  		dvscntr |= DVS_TRICKLE_FEED_DISABLE;  	switch (fb->format->format) { @@ -2020,15 +1168,15 @@ g4x_update_plane(struct intel_plane *plane,  {  	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);  	enum pipe pipe = plane->pipe; -	u32 dvssurf_offset = plane_state->color_plane[0].offset; +	u32 dvssurf_offset = plane_state->view.color_plane[0].offset;  	u32 linear_offset;  	const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;  	int crtc_x = plane_state->uapi.dst.x1;  	int crtc_y = plane_state->uapi.dst.y1;  	u32 crtc_w = drm_rect_width(&plane_state->uapi.dst);  	u32 crtc_h = drm_rect_height(&plane_state->uapi.dst); -	u32 x = plane_state->color_plane[0].x; -	u32 y = plane_state->color_plane[0].y; +	u32 x = plane_state->view.color_plane[0].x; +	u32 y = plane_state->view.color_plane[0].y;  	u32 src_w = drm_rect_width(&plane_state->uapi.src) >> 16;  	u32 src_h = drm_rect_height(&plane_state->uapi.src) >> 16;  	u32 dvscntr, dvsscale = 0; @@ -2050,7 +1198,7 @@ g4x_update_plane(struct intel_plane *plane,  	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);  	intel_de_write_fw(dev_priv, DVSSTRIDE(pipe), -			  plane_state->color_plane[0].stride); +			  plane_state->view.color_plane[0].stride);  	intel_de_write_fw(dev_priv, DVSPOS(pipe), (crtc_y << 16) | crtc_x);  	intel_de_write_fw(dev_priv, DVSSIZE(pipe), (crtc_h << 16) | crtc_w);  	intel_de_write_fw(dev_priv, DVSSCALE(pipe), dvsscale); @@ -2123,19 +1271,18 @@ g4x_plane_get_hw_state(struct intel_plane *plane,  	return ret;  } -static bool intel_fb_scalable(const struct drm_framebuffer *fb) +static bool g4x_fb_scalable(const struct drm_framebuffer *fb)  {  	if (!fb)  		return false;  	switch (fb->format->format) {  	case DRM_FORMAT_C8: -		return false;  	case DRM_FORMAT_XRGB16161616F:  	case DRM_FORMAT_ARGB16161616F:  	case DRM_FORMAT_XBGR16161616F:  	case DRM_FORMAT_ABGR16161616F: -		return INTEL_GEN(to_i915(fb->dev)) >= 11; +		return false;  	default:  		return true;  	} @@ -2151,7 +1298,7 @@ g4x_sprite_check_scaling(struct intel_crtc_state *crtc_state,  	int src_x, src_w, src_h, crtc_w, crtc_h;  	const struct drm_display_mode *adjusted_mode =  		&crtc_state->hw.adjusted_mode; -	unsigned int stride = plane_state->color_plane[0].stride; +	unsigned int stride = plane_state->view.color_plane[0].stride;  	unsigned int cpp = fb->format->cpp[0];  	unsigned int width_bytes;  	int min_width, min_height; @@ -2212,8 +1359,8 @@ g4x_sprite_check(struct intel_crtc_state *crtc_state,  	int max_scale = DRM_PLANE_HELPER_NO_SCALING;  	int ret; -	if (intel_fb_scalable(plane_state->hw.fb)) { -		if (INTEL_GEN(dev_priv) < 7) { +	if (g4x_fb_scalable(plane_state->hw.fb)) { +		if (DISPLAY_VER(dev_priv) < 7) {  			min_scale = 1;  			max_scale = 16 << 16;  		} else if (IS_IVYBRIDGE(dev_priv)) { @@ -2242,7 +1389,7 @@ g4x_sprite_check(struct intel_crtc_state *crtc_state,  	if (ret)  		return ret; -	if (INTEL_GEN(dev_priv) >= 7) +	if (DISPLAY_VER(dev_priv) >= 7)  		plane_state->ctl = ivb_sprite_ctl(crtc_state, plane_state);  	else  		plane_state->ctl = g4x_sprite_ctl(crtc_state, plane_state); @@ -2301,243 +1448,9 @@ vlv_sprite_check(struct intel_crtc_state *crtc_state,  	return 0;  } -static bool intel_format_is_p01x(u32 format) -{ -	switch (format) { -	case DRM_FORMAT_P010: -	case DRM_FORMAT_P012: -	case DRM_FORMAT_P016: -		return true; -	default: -		return false; -	} -} - -static int skl_plane_check_fb(const struct intel_crtc_state *crtc_state, -			      const struct intel_plane_state *plane_state) -{ -	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane); -	struct drm_i915_private *dev_priv = to_i915(plane->base.dev); -	const struct drm_framebuffer *fb = plane_state->hw.fb; -	unsigned int rotation = plane_state->hw.rotation; -	struct drm_format_name_buf format_name; - -	if (!fb) -		return 0; - -	if (rotation & ~(DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180) && -	    is_ccs_modifier(fb->modifier)) { -		drm_dbg_kms(&dev_priv->drm, -			    "RC support only with 0/180 degree rotation (%x)\n", -			    rotation); -		return -EINVAL; -	} - -	if (rotation & DRM_MODE_REFLECT_X && -	    fb->modifier == DRM_FORMAT_MOD_LINEAR) { -		drm_dbg_kms(&dev_priv->drm, -			    "horizontal flip is not supported with linear surface formats\n"); -		return -EINVAL; -	} - -	if (drm_rotation_90_or_270(rotation)) { -		if (fb->modifier != I915_FORMAT_MOD_Y_TILED && -		    fb->modifier != I915_FORMAT_MOD_Yf_TILED) { -			drm_dbg_kms(&dev_priv->drm, -				    "Y/Yf tiling required for 90/270!\n"); -			return -EINVAL; -		} - -		/* -		 * 90/270 is not allowed with RGB64 16:16:16:16 and -		 * Indexed 8-bit. RGB 16-bit 5:6:5 is allowed gen11 onwards. -		 */ -		switch (fb->format->format) { -		case DRM_FORMAT_RGB565: -			if (INTEL_GEN(dev_priv) >= 11) -				break; -			fallthrough; -		case DRM_FORMAT_C8: -		case DRM_FORMAT_XRGB16161616F: -		case DRM_FORMAT_XBGR16161616F: -		case DRM_FORMAT_ARGB16161616F: -		case DRM_FORMAT_ABGR16161616F: -		case DRM_FORMAT_Y210: -		case DRM_FORMAT_Y212: -		case DRM_FORMAT_Y216: -		case DRM_FORMAT_XVYU12_16161616: -		case DRM_FORMAT_XVYU16161616: -			drm_dbg_kms(&dev_priv->drm, -				    "Unsupported pixel format %s for 90/270!\n", -				    drm_get_format_name(fb->format->format, -							&format_name)); -			return -EINVAL; -		default: -			break; -		} -	} - -	/* Y-tiling is not supported in IF-ID Interlace mode */ -	if (crtc_state->hw.enable && -	    crtc_state->hw.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE && -	    (fb->modifier == I915_FORMAT_MOD_Y_TILED || -	     fb->modifier == I915_FORMAT_MOD_Yf_TILED || -	     fb->modifier == I915_FORMAT_MOD_Y_TILED_CCS || -	     fb->modifier == I915_FORMAT_MOD_Yf_TILED_CCS || -	     fb->modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS || -	     fb->modifier == I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS || -	     fb->modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS_CC)) { -		drm_dbg_kms(&dev_priv->drm, -			    "Y/Yf tiling not supported in IF-ID mode\n"); -		return -EINVAL; -	} - -	/* Wa_1606054188:tgl */ -	if (IS_TIGERLAKE(dev_priv) && -	    plane_state->ckey.flags & I915_SET_COLORKEY_SOURCE && -	    intel_format_is_p01x(fb->format->format)) { -		drm_dbg_kms(&dev_priv->drm, -			    "Source color keying not supported with P01x formats\n"); -		return -EINVAL; -	} - -	return 0; -} - -static int skl_plane_check_dst_coordinates(const struct intel_crtc_state *crtc_state, -					   const struct intel_plane_state *plane_state) -{ -	struct drm_i915_private *dev_priv = -		to_i915(plane_state->uapi.plane->dev); -	int crtc_x = plane_state->uapi.dst.x1; -	int crtc_w = drm_rect_width(&plane_state->uapi.dst); -	int pipe_src_w = crtc_state->pipe_src_w; - -	/* -	 * Display WA #1175: cnl,glk -	 * Planes other than the cursor may cause FIFO underflow and display -	 * corruption if starting less than 4 pixels from the right edge of -	 * the screen. -	 * Besides the above WA fix the similar problem, where planes other -	 * than the cursor ending less than 4 pixels from the left edge of the -	 * screen may cause FIFO underflow and display corruption. -	 */ -	if ((IS_GEMINILAKE(dev_priv) || IS_CANNONLAKE(dev_priv)) && -	    (crtc_x + crtc_w < 4 || crtc_x > pipe_src_w - 4)) { -		drm_dbg_kms(&dev_priv->drm, -			    "requested plane X %s position %d invalid (valid range %d-%d)\n", -			    crtc_x + crtc_w < 4 ? "end" : "start", -			    crtc_x + crtc_w < 4 ? crtc_x + crtc_w : crtc_x, -			    4, pipe_src_w - 4); -		return -ERANGE; -	} - -	return 0; -} - -static int skl_plane_check_nv12_rotation(const struct intel_plane_state *plane_state) -{ -	const struct drm_framebuffer *fb = plane_state->hw.fb; -	unsigned int rotation = plane_state->hw.rotation; -	int src_w = drm_rect_width(&plane_state->uapi.src) >> 16; - -	/* Display WA #1106 */ -	if (intel_format_info_is_yuv_semiplanar(fb->format, fb->modifier) && -	    src_w & 3 && -	    (rotation == DRM_MODE_ROTATE_270 || -	     rotation == (DRM_MODE_REFLECT_X | DRM_MODE_ROTATE_90))) { -		DRM_DEBUG_KMS("src width must be multiple of 4 for rotated planar YUV\n"); -		return -EINVAL; -	} - -	return 0; -} - -static int skl_plane_max_scale(struct drm_i915_private *dev_priv, -			       const struct drm_framebuffer *fb) -{ -	/* -	 * We don't yet know the final source width nor -	 * whether we can use the HQ scaler mode. Assume -	 * the best case. -	 * FIXME need to properly check this later. -	 */ -	if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv) || -	    !intel_format_info_is_yuv_semiplanar(fb->format, fb->modifier)) -		return 0x30000 - 1; -	else -		return 0x20000 - 1; -} - -static int skl_plane_check(struct intel_crtc_state *crtc_state, -			   struct intel_plane_state *plane_state) -{ -	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane); -	struct drm_i915_private *dev_priv = to_i915(plane->base.dev); -	const struct drm_framebuffer *fb = plane_state->hw.fb; -	int min_scale = DRM_PLANE_HELPER_NO_SCALING; -	int max_scale = DRM_PLANE_HELPER_NO_SCALING; -	int ret; - -	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)) { -		min_scale = 1; -		max_scale = skl_plane_max_scale(dev_priv, fb); -	} - -	ret = intel_atomic_plane_check_clipping(plane_state, crtc_state, -						min_scale, max_scale, true); -	if (ret) -		return ret; - -	ret = skl_check_plane_surface(plane_state); -	if (ret) -		return ret; - -	if (!plane_state->uapi.visible) -		return 0; - -	ret = skl_plane_check_dst_coordinates(crtc_state, plane_state); -	if (ret) -		return ret; - -	ret = intel_plane_check_src_coordinates(plane_state); -	if (ret) -		return ret; - -	ret = skl_plane_check_nv12_rotation(plane_state); -	if (ret) -		return ret; - -	/* HW only has 8 bits pixel precision, disable plane if invisible */ -	if (!(plane_state->hw.alpha >> 8)) -		plane_state->uapi.visible = false; - -	plane_state->ctl = skl_plane_ctl(crtc_state, plane_state); - -	if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)) -		plane_state->color_ctl = glk_plane_color_ctl(crtc_state, -							     plane_state); - -	if (intel_format_info_is_yuv_semiplanar(fb->format, fb->modifier) && -	    icl_is_hdr_plane(dev_priv, plane->id)) -		/* Enable and use MPEG-2 chroma siting */ -		plane_state->cus_ctl = PLANE_CUS_ENABLE | -			PLANE_CUS_HPHASE_0 | -			PLANE_CUS_VPHASE_SIGN_NEGATIVE | PLANE_CUS_VPHASE_0_25; -	else -		plane_state->cus_ctl = 0; - -	return 0; -} -  static bool has_dst_key_in_primary_plane(struct drm_i915_private *dev_priv)  { -	return INTEL_GEN(dev_priv) >= 9; +	return DISPLAY_VER(dev_priv) >= 9;  }  static void intel_plane_set_ckey(struct intel_plane_state *plane_state, @@ -2561,7 +1474,7 @@ static void intel_plane_set_ckey(struct intel_plane_state *plane_state,  	 * On SKL+ we want dst key enabled on  	 * the primary and not on the sprite.  	 */ -	if (INTEL_GEN(dev_priv) >= 9 && plane->id != PLANE_PRIMARY && +	if (DISPLAY_VER(dev_priv) >= 9 && plane->id != PLANE_PRIMARY &&  	    set->flags & I915_SET_COLORKEY_DESTINATION)  		key->flags = 0;  } @@ -2600,7 +1513,7 @@ int intel_sprite_set_colorkey_ioctl(struct drm_device *dev, void *data,  	 * Also multiple planes can't do destination keying on the same  	 * pipe simultaneously.  	 */ -	if (INTEL_GEN(dev_priv) >= 9 && +	if (DISPLAY_VER(dev_priv) >= 9 &&  	    to_intel_plane(plane)->id >= PLANE_SPRITE1 &&  	    set->flags & I915_SET_COLORKEY_DESTINATION)  		return -EINVAL; @@ -2712,186 +1625,6 @@ static const u32 chv_pipe_b_sprite_formats[] = {  	DRM_FORMAT_VYUY,  }; -static const u32 skl_plane_formats[] = { -	DRM_FORMAT_C8, -	DRM_FORMAT_RGB565, -	DRM_FORMAT_XRGB8888, -	DRM_FORMAT_XBGR8888, -	DRM_FORMAT_ARGB8888, -	DRM_FORMAT_ABGR8888, -	DRM_FORMAT_XRGB2101010, -	DRM_FORMAT_XBGR2101010, -	DRM_FORMAT_XRGB16161616F, -	DRM_FORMAT_XBGR16161616F, -	DRM_FORMAT_YUYV, -	DRM_FORMAT_YVYU, -	DRM_FORMAT_UYVY, -	DRM_FORMAT_VYUY, -	DRM_FORMAT_XYUV8888, -}; - -static const u32 skl_planar_formats[] = { -	DRM_FORMAT_C8, -	DRM_FORMAT_RGB565, -	DRM_FORMAT_XRGB8888, -	DRM_FORMAT_XBGR8888, -	DRM_FORMAT_ARGB8888, -	DRM_FORMAT_ABGR8888, -	DRM_FORMAT_XRGB2101010, -	DRM_FORMAT_XBGR2101010, -	DRM_FORMAT_XRGB16161616F, -	DRM_FORMAT_XBGR16161616F, -	DRM_FORMAT_YUYV, -	DRM_FORMAT_YVYU, -	DRM_FORMAT_UYVY, -	DRM_FORMAT_VYUY, -	DRM_FORMAT_NV12, -	DRM_FORMAT_XYUV8888, -}; - -static const u32 glk_planar_formats[] = { -	DRM_FORMAT_C8, -	DRM_FORMAT_RGB565, -	DRM_FORMAT_XRGB8888, -	DRM_FORMAT_XBGR8888, -	DRM_FORMAT_ARGB8888, -	DRM_FORMAT_ABGR8888, -	DRM_FORMAT_XRGB2101010, -	DRM_FORMAT_XBGR2101010, -	DRM_FORMAT_XRGB16161616F, -	DRM_FORMAT_XBGR16161616F, -	DRM_FORMAT_YUYV, -	DRM_FORMAT_YVYU, -	DRM_FORMAT_UYVY, -	DRM_FORMAT_VYUY, -	DRM_FORMAT_NV12, -	DRM_FORMAT_XYUV8888, -	DRM_FORMAT_P010, -	DRM_FORMAT_P012, -	DRM_FORMAT_P016, -}; - -static const u32 icl_sdr_y_plane_formats[] = { -	DRM_FORMAT_C8, -	DRM_FORMAT_RGB565, -	DRM_FORMAT_XRGB8888, -	DRM_FORMAT_XBGR8888, -	DRM_FORMAT_ARGB8888, -	DRM_FORMAT_ABGR8888, -	DRM_FORMAT_XRGB2101010, -	DRM_FORMAT_XBGR2101010, -	DRM_FORMAT_ARGB2101010, -	DRM_FORMAT_ABGR2101010, -	DRM_FORMAT_YUYV, -	DRM_FORMAT_YVYU, -	DRM_FORMAT_UYVY, -	DRM_FORMAT_VYUY, -	DRM_FORMAT_Y210, -	DRM_FORMAT_Y212, -	DRM_FORMAT_Y216, -	DRM_FORMAT_XYUV8888, -	DRM_FORMAT_XVYU2101010, -	DRM_FORMAT_XVYU12_16161616, -	DRM_FORMAT_XVYU16161616, -}; - -static const u32 icl_sdr_uv_plane_formats[] = { -	DRM_FORMAT_C8, -	DRM_FORMAT_RGB565, -	DRM_FORMAT_XRGB8888, -	DRM_FORMAT_XBGR8888, -	DRM_FORMAT_ARGB8888, -	DRM_FORMAT_ABGR8888, -	DRM_FORMAT_XRGB2101010, -	DRM_FORMAT_XBGR2101010, -	DRM_FORMAT_ARGB2101010, -	DRM_FORMAT_ABGR2101010, -	DRM_FORMAT_YUYV, -	DRM_FORMAT_YVYU, -	DRM_FORMAT_UYVY, -	DRM_FORMAT_VYUY, -	DRM_FORMAT_NV12, -	DRM_FORMAT_P010, -	DRM_FORMAT_P012, -	DRM_FORMAT_P016, -	DRM_FORMAT_Y210, -	DRM_FORMAT_Y212, -	DRM_FORMAT_Y216, -	DRM_FORMAT_XYUV8888, -	DRM_FORMAT_XVYU2101010, -	DRM_FORMAT_XVYU12_16161616, -	DRM_FORMAT_XVYU16161616, -}; - -static const u32 icl_hdr_plane_formats[] = { -	DRM_FORMAT_C8, -	DRM_FORMAT_RGB565, -	DRM_FORMAT_XRGB8888, -	DRM_FORMAT_XBGR8888, -	DRM_FORMAT_ARGB8888, -	DRM_FORMAT_ABGR8888, -	DRM_FORMAT_XRGB2101010, -	DRM_FORMAT_XBGR2101010, -	DRM_FORMAT_ARGB2101010, -	DRM_FORMAT_ABGR2101010, -	DRM_FORMAT_XRGB16161616F, -	DRM_FORMAT_XBGR16161616F, -	DRM_FORMAT_ARGB16161616F, -	DRM_FORMAT_ABGR16161616F, -	DRM_FORMAT_YUYV, -	DRM_FORMAT_YVYU, -	DRM_FORMAT_UYVY, -	DRM_FORMAT_VYUY, -	DRM_FORMAT_NV12, -	DRM_FORMAT_P010, -	DRM_FORMAT_P012, -	DRM_FORMAT_P016, -	DRM_FORMAT_Y210, -	DRM_FORMAT_Y212, -	DRM_FORMAT_Y216, -	DRM_FORMAT_XYUV8888, -	DRM_FORMAT_XVYU2101010, -	DRM_FORMAT_XVYU12_16161616, -	DRM_FORMAT_XVYU16161616, -}; - -static const u64 skl_plane_format_modifiers_noccs[] = { -	I915_FORMAT_MOD_Yf_TILED, -	I915_FORMAT_MOD_Y_TILED, -	I915_FORMAT_MOD_X_TILED, -	DRM_FORMAT_MOD_LINEAR, -	DRM_FORMAT_MOD_INVALID -}; - -static const u64 skl_plane_format_modifiers_ccs[] = { -	I915_FORMAT_MOD_Yf_TILED_CCS, -	I915_FORMAT_MOD_Y_TILED_CCS, -	I915_FORMAT_MOD_Yf_TILED, -	I915_FORMAT_MOD_Y_TILED, -	I915_FORMAT_MOD_X_TILED, -	DRM_FORMAT_MOD_LINEAR, -	DRM_FORMAT_MOD_INVALID -}; - -static const u64 gen12_plane_format_modifiers_mc_ccs[] = { -	I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS, -	I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS, -	I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS_CC, -	I915_FORMAT_MOD_Y_TILED, -	I915_FORMAT_MOD_X_TILED, -	DRM_FORMAT_MOD_LINEAR, -	DRM_FORMAT_MOD_INVALID -}; - -static const u64 gen12_plane_format_modifiers_rc_ccs[] = { -	I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS, -	I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS_CC, -	I915_FORMAT_MOD_Y_TILED, -	I915_FORMAT_MOD_X_TILED, -	DRM_FORMAT_MOD_LINEAR, -	DRM_FORMAT_MOD_INVALID -}; -  static bool g4x_sprite_format_mod_supported(struct drm_plane *_plane,  					    u32 format, u64 modifier)  { @@ -2984,150 +1717,6 @@ static bool vlv_sprite_format_mod_supported(struct drm_plane *_plane,  	}  } -static bool skl_plane_format_mod_supported(struct drm_plane *_plane, -					   u32 format, u64 modifier) -{ -	struct intel_plane *plane = to_intel_plane(_plane); - -	switch (modifier) { -	case DRM_FORMAT_MOD_LINEAR: -	case I915_FORMAT_MOD_X_TILED: -	case I915_FORMAT_MOD_Y_TILED: -	case I915_FORMAT_MOD_Yf_TILED: -		break; -	case I915_FORMAT_MOD_Y_TILED_CCS: -	case I915_FORMAT_MOD_Yf_TILED_CCS: -		if (!plane->has_ccs) -			return false; -		break; -	default: -		return false; -	} - -	switch (format) { -	case DRM_FORMAT_XRGB8888: -	case DRM_FORMAT_XBGR8888: -	case DRM_FORMAT_ARGB8888: -	case DRM_FORMAT_ABGR8888: -		if (is_ccs_modifier(modifier)) -			return true; -		fallthrough; -	case DRM_FORMAT_RGB565: -	case DRM_FORMAT_XRGB2101010: -	case DRM_FORMAT_XBGR2101010: -	case DRM_FORMAT_ARGB2101010: -	case DRM_FORMAT_ABGR2101010: -	case DRM_FORMAT_YUYV: -	case DRM_FORMAT_YVYU: -	case DRM_FORMAT_UYVY: -	case DRM_FORMAT_VYUY: -	case DRM_FORMAT_NV12: -	case DRM_FORMAT_XYUV8888: -	case DRM_FORMAT_P010: -	case DRM_FORMAT_P012: -	case DRM_FORMAT_P016: -	case DRM_FORMAT_XVYU2101010: -		if (modifier == I915_FORMAT_MOD_Yf_TILED) -			return true; -		fallthrough; -	case DRM_FORMAT_C8: -	case DRM_FORMAT_XBGR16161616F: -	case DRM_FORMAT_ABGR16161616F: -	case DRM_FORMAT_XRGB16161616F: -	case DRM_FORMAT_ARGB16161616F: -	case DRM_FORMAT_Y210: -	case DRM_FORMAT_Y212: -	case DRM_FORMAT_Y216: -	case DRM_FORMAT_XVYU12_16161616: -	case DRM_FORMAT_XVYU16161616: -		if (modifier == DRM_FORMAT_MOD_LINEAR || -		    modifier == I915_FORMAT_MOD_X_TILED || -		    modifier == I915_FORMAT_MOD_Y_TILED) -			return true; -		fallthrough; -	default: -		return false; -	} -} - -static bool gen12_plane_supports_mc_ccs(struct drm_i915_private *dev_priv, -					enum plane_id plane_id) -{ -	/* Wa_14010477008:tgl[a0..c0],rkl[all],dg1[all] */ -	if (IS_DG1(dev_priv) || IS_ROCKETLAKE(dev_priv) || -	    IS_TGL_DISP_REVID(dev_priv, TGL_REVID_A0, TGL_REVID_C0)) -		return false; - -	return plane_id < PLANE_SPRITE4; -} - -static bool gen12_plane_format_mod_supported(struct drm_plane *_plane, -					     u32 format, u64 modifier) -{ -	struct drm_i915_private *dev_priv = to_i915(_plane->dev); -	struct intel_plane *plane = to_intel_plane(_plane); - -	switch (modifier) { -	case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS: -		if (!gen12_plane_supports_mc_ccs(dev_priv, plane->id)) -			return false; -		fallthrough; -	case DRM_FORMAT_MOD_LINEAR: -	case I915_FORMAT_MOD_X_TILED: -	case I915_FORMAT_MOD_Y_TILED: -	case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS: -	case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS_CC: -		break; -	default: -		return false; -	} - -	switch (format) { -	case DRM_FORMAT_XRGB8888: -	case DRM_FORMAT_XBGR8888: -	case DRM_FORMAT_ARGB8888: -	case DRM_FORMAT_ABGR8888: -		if (is_ccs_modifier(modifier)) -			return true; -		fallthrough; -	case DRM_FORMAT_YUYV: -	case DRM_FORMAT_YVYU: -	case DRM_FORMAT_UYVY: -	case DRM_FORMAT_VYUY: -	case DRM_FORMAT_NV12: -	case DRM_FORMAT_XYUV8888: -	case DRM_FORMAT_P010: -	case DRM_FORMAT_P012: -	case DRM_FORMAT_P016: -		if (modifier == I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS) -			return true; -		fallthrough; -	case DRM_FORMAT_RGB565: -	case DRM_FORMAT_XRGB2101010: -	case DRM_FORMAT_XBGR2101010: -	case DRM_FORMAT_ARGB2101010: -	case DRM_FORMAT_ABGR2101010: -	case DRM_FORMAT_XVYU2101010: -	case DRM_FORMAT_C8: -	case DRM_FORMAT_XBGR16161616F: -	case DRM_FORMAT_ABGR16161616F: -	case DRM_FORMAT_XRGB16161616F: -	case DRM_FORMAT_ARGB16161616F: -	case DRM_FORMAT_Y210: -	case DRM_FORMAT_Y212: -	case DRM_FORMAT_Y216: -	case DRM_FORMAT_XVYU12_16161616: -	case DRM_FORMAT_XVYU16161616: -		if (modifier == DRM_FORMAT_MOD_LINEAR || -		    modifier == I915_FORMAT_MOD_X_TILED || -		    modifier == I915_FORMAT_MOD_Y_TILED) -			return true; -		fallthrough; -	default: -		return false; -	} -} -  static const struct drm_plane_funcs g4x_sprite_funcs = {  	.update_plane = drm_atomic_helper_update_plane,  	.disable_plane = drm_atomic_helper_disable_plane, @@ -3155,257 +1744,6 @@ static const struct drm_plane_funcs vlv_sprite_funcs = {  	.format_mod_supported = vlv_sprite_format_mod_supported,  }; -static const struct drm_plane_funcs skl_plane_funcs = { -	.update_plane = drm_atomic_helper_update_plane, -	.disable_plane = drm_atomic_helper_disable_plane, -	.destroy = intel_plane_destroy, -	.atomic_duplicate_state = intel_plane_duplicate_state, -	.atomic_destroy_state = intel_plane_destroy_state, -	.format_mod_supported = skl_plane_format_mod_supported, -}; - -static const struct drm_plane_funcs gen12_plane_funcs = { -	.update_plane = drm_atomic_helper_update_plane, -	.disable_plane = drm_atomic_helper_disable_plane, -	.destroy = intel_plane_destroy, -	.atomic_duplicate_state = intel_plane_duplicate_state, -	.atomic_destroy_state = intel_plane_destroy_state, -	.format_mod_supported = gen12_plane_format_mod_supported, -}; - -static bool skl_plane_has_fbc(struct drm_i915_private *dev_priv, -			      enum pipe pipe, enum plane_id plane_id) -{ -	if (!HAS_FBC(dev_priv)) -		return false; - -	return pipe == PIPE_A && plane_id == PLANE_PRIMARY; -} - -static bool skl_plane_has_planar(struct drm_i915_private *dev_priv, -				 enum pipe pipe, enum plane_id plane_id) -{ -	/* Display WA #0870: skl, bxt */ -	if (IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv)) -		return false; - -	if (IS_GEN(dev_priv, 9) && !IS_GEMINILAKE(dev_priv) && pipe == PIPE_C) -		return false; - -	if (plane_id != PLANE_PRIMARY && plane_id != PLANE_SPRITE0) -		return false; - -	return true; -} - -static const u32 *skl_get_plane_formats(struct drm_i915_private *dev_priv, -					enum pipe pipe, enum plane_id plane_id, -					int *num_formats) -{ -	if (skl_plane_has_planar(dev_priv, pipe, plane_id)) { -		*num_formats = ARRAY_SIZE(skl_planar_formats); -		return skl_planar_formats; -	} else { -		*num_formats = ARRAY_SIZE(skl_plane_formats); -		return skl_plane_formats; -	} -} - -static const u32 *glk_get_plane_formats(struct drm_i915_private *dev_priv, -					enum pipe pipe, enum plane_id plane_id, -					int *num_formats) -{ -	if (skl_plane_has_planar(dev_priv, pipe, plane_id)) { -		*num_formats = ARRAY_SIZE(glk_planar_formats); -		return glk_planar_formats; -	} else { -		*num_formats = ARRAY_SIZE(skl_plane_formats); -		return skl_plane_formats; -	} -} - -static const u32 *icl_get_plane_formats(struct drm_i915_private *dev_priv, -					enum pipe pipe, enum plane_id plane_id, -					int *num_formats) -{ -	if (icl_is_hdr_plane(dev_priv, plane_id)) { -		*num_formats = ARRAY_SIZE(icl_hdr_plane_formats); -		return icl_hdr_plane_formats; -	} else if (icl_is_nv12_y_plane(dev_priv, plane_id)) { -		*num_formats = ARRAY_SIZE(icl_sdr_y_plane_formats); -		return icl_sdr_y_plane_formats; -	} else { -		*num_formats = ARRAY_SIZE(icl_sdr_uv_plane_formats); -		return icl_sdr_uv_plane_formats; -	} -} - -static const u64 *gen12_get_plane_modifiers(struct drm_i915_private *dev_priv, -					    enum plane_id plane_id) -{ -	if (gen12_plane_supports_mc_ccs(dev_priv, plane_id)) -		return gen12_plane_format_modifiers_mc_ccs; -	else -		return gen12_plane_format_modifiers_rc_ccs; -} - -static bool skl_plane_has_ccs(struct drm_i915_private *dev_priv, -			      enum pipe pipe, enum plane_id plane_id) -{ -	if (plane_id == PLANE_CURSOR) -		return false; - -	if (INTEL_GEN(dev_priv) >= 10) -		return true; - -	if (IS_GEMINILAKE(dev_priv)) -		return pipe != PIPE_C; - -	return pipe != PIPE_C && -		(plane_id == PLANE_PRIMARY || -		 plane_id == PLANE_SPRITE0); -} - -struct intel_plane * -skl_universal_plane_create(struct drm_i915_private *dev_priv, -			   enum pipe pipe, enum plane_id plane_id) -{ -	const struct drm_plane_funcs *plane_funcs; -	struct intel_plane *plane; -	enum drm_plane_type plane_type; -	unsigned int supported_rotations; -	unsigned int supported_csc; -	const u64 *modifiers; -	const u32 *formats; -	int num_formats; -	int ret; - -	plane = intel_plane_alloc(); -	if (IS_ERR(plane)) -		return plane; - -	plane->pipe = pipe; -	plane->id = plane_id; -	plane->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, plane_id); - -	plane->has_fbc = skl_plane_has_fbc(dev_priv, pipe, plane_id); -	if (plane->has_fbc) { -		struct intel_fbc *fbc = &dev_priv->fbc; - -		fbc->possible_framebuffer_bits |= plane->frontbuffer_bit; -	} - -	if (INTEL_GEN(dev_priv) >= 11) { -		plane->min_width = icl_plane_min_width; -		plane->max_width = icl_plane_max_width; -		plane->max_height = icl_plane_max_height; -	} else if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)) { -		plane->max_width = glk_plane_max_width; -		plane->max_height = skl_plane_max_height; -	} else { -		plane->max_width = skl_plane_max_width; -		plane->max_height = skl_plane_max_height; -	} - -	plane->max_stride = skl_plane_max_stride; -	plane->update_plane = skl_update_plane; -	plane->disable_plane = skl_disable_plane; -	plane->get_hw_state = skl_plane_get_hw_state; -	plane->check_plane = skl_plane_check; -	plane->min_cdclk = skl_plane_min_cdclk; - -	if (plane_id == PLANE_PRIMARY) { -		plane->need_async_flip_disable_wa = IS_GEN_RANGE(dev_priv, 9, 10); -		plane->async_flip = skl_plane_async_flip; -		plane->enable_flip_done = skl_plane_enable_flip_done; -		plane->disable_flip_done = skl_plane_disable_flip_done; -	} - -	if (INTEL_GEN(dev_priv) >= 11) -		formats = icl_get_plane_formats(dev_priv, pipe, -						plane_id, &num_formats); -	else if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)) -		formats = glk_get_plane_formats(dev_priv, pipe, -						plane_id, &num_formats); -	else -		formats = skl_get_plane_formats(dev_priv, pipe, -						plane_id, &num_formats); - -	plane->has_ccs = skl_plane_has_ccs(dev_priv, pipe, plane_id); -	if (INTEL_GEN(dev_priv) >= 12) { -		modifiers = gen12_get_plane_modifiers(dev_priv, plane_id); -		plane_funcs = &gen12_plane_funcs; -	} else { -		if (plane->has_ccs) -			modifiers = skl_plane_format_modifiers_ccs; -		else -			modifiers = skl_plane_format_modifiers_noccs; -		plane_funcs = &skl_plane_funcs; -	} - -	if (plane_id == PLANE_PRIMARY) -		plane_type = DRM_PLANE_TYPE_PRIMARY; -	else -		plane_type = DRM_PLANE_TYPE_OVERLAY; - -	ret = drm_universal_plane_init(&dev_priv->drm, &plane->base, -				       0, plane_funcs, -				       formats, num_formats, modifiers, -				       plane_type, -				       "plane %d%c", plane_id + 1, -				       pipe_name(pipe)); -	if (ret) -		goto fail; - -	supported_rotations = -		DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_90 | -		DRM_MODE_ROTATE_180 | DRM_MODE_ROTATE_270; - -	if (INTEL_GEN(dev_priv) >= 10) -		supported_rotations |= DRM_MODE_REFLECT_X; - -	drm_plane_create_rotation_property(&plane->base, -					   DRM_MODE_ROTATE_0, -					   supported_rotations); - -	supported_csc = BIT(DRM_COLOR_YCBCR_BT601) | BIT(DRM_COLOR_YCBCR_BT709); - -	if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)) -		supported_csc |= BIT(DRM_COLOR_YCBCR_BT2020); - -	drm_plane_create_color_properties(&plane->base, -					  supported_csc, -					  BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | -					  BIT(DRM_COLOR_YCBCR_FULL_RANGE), -					  DRM_COLOR_YCBCR_BT709, -					  DRM_COLOR_YCBCR_LIMITED_RANGE); - -	drm_plane_create_alpha_property(&plane->base); -	drm_plane_create_blend_mode_property(&plane->base, -					     BIT(DRM_MODE_BLEND_PIXEL_NONE) | -					     BIT(DRM_MODE_BLEND_PREMULTI) | -					     BIT(DRM_MODE_BLEND_COVERAGE)); - -	drm_plane_create_zpos_immutable_property(&plane->base, plane_id); - -	if (INTEL_GEN(dev_priv) >= 12) -		drm_plane_enable_fb_damage_clips(&plane->base); - -	if (INTEL_GEN(dev_priv) >= 10) -		drm_plane_create_scaling_filter_property(&plane->base, -						BIT(DRM_SCALING_FILTER_DEFAULT) | -						BIT(DRM_SCALING_FILTER_NEAREST_NEIGHBOR)); - -	drm_plane_helper_add(&plane->base, &intel_plane_helper_funcs); - -	return plane; - -fail: -	intel_plane_free(plane); - -	return ERR_PTR(ret); -} -  struct intel_plane *  intel_sprite_plane_create(struct drm_i915_private *dev_priv,  			  enum pipe pipe, int sprite) @@ -3418,10 +1756,6 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv,  	int num_formats;  	int ret, zpos; -	if (INTEL_GEN(dev_priv) >= 9) -		return skl_universal_plane_create(dev_priv, pipe, -						  PLANE_SPRITE0 + sprite); -  	plane = intel_plane_alloc();  	if (IS_ERR(plane))  		return plane; @@ -3444,7 +1778,7 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv,  		modifiers = i9xx_plane_format_modifiers;  		plane_funcs = &vlv_sprite_funcs; -	} else if (INTEL_GEN(dev_priv) >= 7) { +	} else if (DISPLAY_VER(dev_priv) >= 7) {  		plane->update_plane = ivb_update_plane;  		plane->disable_plane = ivb_disable_plane;  		plane->get_hw_state = ivb_plane_get_hw_state; @@ -3472,7 +1806,7 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv,  		plane->min_cdclk = g4x_sprite_min_cdclk;  		modifiers = i9xx_plane_format_modifiers; -		if (IS_GEN(dev_priv, 6)) { +		if (IS_SANDYBRIDGE(dev_priv)) {  			formats = snb_plane_formats;  			num_formats = ARRAY_SIZE(snb_plane_formats); | 
