[PATCH v20 18/18] drm/i915: Set src dest size restrictions for NV12

Vidya Srinivas vidya.srinivas at intel.com
Wed Apr 4 08:55:21 UTC 2018


As per display WA 1106, to avoid corruption issues
NV12 plane height needs to be multiplier of 4
We expect the src and dest dimensions to be multiplier of 4
We fail the case where src or dest width or height is not
multiple of 4 for NV12. We also skip src trunction/adjustments for
NV12 case and handle the sizes directly. Without these, pipe
fifo underruns are seen on APL/KBL.

Credits-to: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
Signed-off-by: Vidya Srinivas <vidya.srinivas at intel.com>
---
 drivers/gpu/drm/i915/intel_display.c |  4 ++++
 drivers/gpu/drm/i915/intel_sprite.c  | 10 +++++++++-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index f545352..d595e04 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -12978,6 +12978,9 @@ intel_check_primary_plane(struct intel_plane *plane,
 		can_position = true;
 	}
 
+	if (pixel_format == DRM_FORMAT_NV12)
+		goto check_plane_surface;
+
 	ret = drm_atomic_helper_check_plane_state(&state->base,
 						  &crtc_state->base,
 						  min_scale, max_scale,
@@ -12988,6 +12991,7 @@ intel_check_primary_plane(struct intel_plane *plane,
 	if (!state->base.fb)
 		return 0;
 
+check_plane_surface:
 	if (INTEL_GEN(dev_priv) >= 9) {
 		ret = skl_check_plane_surface(crtc_state, state);
 		if (ret)
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
index d5dad44..bf6d43e 100644
--- a/drivers/gpu/drm/i915/intel_sprite.c
+++ b/drivers/gpu/drm/i915/intel_sprite.c
@@ -255,6 +255,11 @@ skl_update_plane(struct intel_plane *plane,
 	uint32_t src_h = drm_rect_height(&plane_state->base.src) >> 16;
 	unsigned long irqflags;
 
+	if (fb->format->format == DRM_FORMAT_NV12 &&
+	    ((src_h % 4) != 0 || (src_w % 4) != 0 ||
+	     (crtc_h % 4) != 0 || (crtc_w % 4) != 0))
+		return;
+
 	/* Sizes are 0 based */
 	src_w--;
 	src_h--;
@@ -294,7 +299,6 @@ skl_update_plane(struct intel_plane *plane,
 		I915_WRITE_FW(SKL_PS_WIN_POS(pipe, scaler_id), (crtc_x << 16) | crtc_y);
 		I915_WRITE_FW(SKL_PS_WIN_SZ(pipe, scaler_id),
 			      ((crtc_w + 1) << 16)|(crtc_h + 1));
-
 		I915_WRITE_FW(PLANE_POS(pipe, plane_id), 0);
 	} else {
 		I915_WRITE_FW(PLANE_POS(pipe, plane_id), (crtc_y << 16) | crtc_x);
@@ -969,6 +973,9 @@ intel_check_sprite_plane(struct intel_plane *plane,
 		return -EINVAL;
 	}
 
+	if (fb->format->format == DRM_FORMAT_NV12)
+		goto check_plane_surface;
+
 	/* setup can_scale, min_scale, max_scale */
 	if (INTEL_GEN(dev_priv) >= 9) {
 		if (state->base.fb)
@@ -1112,6 +1119,7 @@ intel_check_sprite_plane(struct intel_plane *plane,
 	dst->y1 = crtc_y;
 	dst->y2 = crtc_y + crtc_h;
 
+check_plane_surface:
 	if (INTEL_GEN(dev_priv) >= 9) {
 		ret = skl_check_plane_surface(crtc_state, state);
 		if (ret)
-- 
2.7.4



More information about the Intel-gfx-trybot mailing list