Commit d24f1341 authored by Matt Atwood's avatar Matt Atwood Committed by José Roberto de Souza
Browse files

drm/i915: Apply Wa_14011264657:gen11+



Add minimum width to planes, variable with specific formats for gen11+
to reflect recent bspec changes.

Signed-off-by: default avatarMatt Atwood <matthew.s.atwood@intel.com>
Reviewed-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
Signed-off-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200812210702.7153-1-matthew.s.atwood@intel.com
parent 25a322fd
Loading
Loading
Loading
Loading
+50 −10
Original line number Diff line number Diff line
@@ -3762,6 +3762,44 @@ static int glk_max_plane_width(const struct drm_framebuffer *fb,
	}
}
static int icl_min_plane_width(const struct drm_framebuffer *fb)
{
	/* 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_max_plane_width(const struct drm_framebuffer *fb,
			       int color_plane,
			       unsigned int rotation)
@@ -3844,29 +3882,31 @@ static int skl_check_main_surface(struct intel_plane_state *plane_state)
	int y = plane_state->uapi.src.y1 >> 16;
	int w = drm_rect_width(&plane_state->uapi.src) >> 16;
	int h = drm_rect_height(&plane_state->uapi.src) >> 16;
	int max_width;
	int max_height;
	u32 alignment;
	u32 offset;
	int max_width, min_width, max_height;
	u32 alignment, offset;
	int aux_plane = intel_main_to_aux_plane(fb, 0);
	u32 aux_offset = plane_state->color_plane[aux_plane].offset;
	if (INTEL_GEN(dev_priv) >= 11)
	if (INTEL_GEN(dev_priv) >= 11) {
		max_width = icl_max_plane_width(fb, 0, rotation);
	else if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
		min_width = icl_min_plane_width(fb);
	} else if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)) {
		max_width = glk_max_plane_width(fb, 0, rotation);
	else
		min_width = 1;
	} else {
		max_width = skl_max_plane_width(fb, 0, rotation);
		min_width = 1;
	}
	if (INTEL_GEN(dev_priv) >= 11)
		max_height = icl_max_plane_height();
	else
		max_height = skl_max_plane_height();
	if (w > max_width || h > max_height) {
	if (w > max_width || w < min_width || h > max_height) {
		drm_dbg_kms(&dev_priv->drm,
			    "requested Y/RGB source size %dx%d too big (limit %dx%d)\n",
			    w, h, max_width, max_height);
			    "requested Y/RGB source size %dx%d outside limits (min: %dx1 max: %dx%d)\n",
			    w, h, min_width, max_width, max_height);
		return -EINVAL;
	}