i915: Avoid using y-tiling on huge buffer objects

<= GEN11 i915 devices can't scan out Y-tiled buffers greater than 4096
in width. This patch downgrades these huge buffers to X-tiled which can
be scanned out.

BUG=b:151166605
BUG=chromium:988091
TEST=Tested with hatch on Samsung CRG9 5k display

Change-Id: I9f83ab1f9d1f2a254ca0ae7028c138f87be378eb
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/2207670
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Reviewed-by: Robert Tarasov <tutankhamen@chromium.org>
Tested-by: Sean Paul <seanpaul@chromium.org>
Auto-Submit: Sean Paul <seanpaul@chromium.org>
Commit-Queue: Sean Paul <seanpaul@chromium.org>
diff --git a/i915.c b/i915.c
index 92fd5b1..b9a825a 100644
--- a/i915.c
+++ b/i915.c
@@ -278,6 +278,8 @@
 		DRM_FORMAT_MOD_LINEAR,
 	};
 	uint64_t modifier;
+	struct i915_device *i915 = bo->drv->priv;
+	bool huge_bo = (i915->gen <= 11) && (width > 4096);
 
 	if (modifiers) {
 		modifier =
@@ -289,6 +291,21 @@
 		modifier = combo->metadata.modifier;
 	}
 
+	/*
+	 * i915 only supports linear/x-tiled above 4096 wide
+	 */
+	if (huge_bo && modifier != I915_FORMAT_MOD_X_TILED && modifier != DRM_FORMAT_MOD_LINEAR) {
+		uint32_t i;
+		for (i = 0; modifiers && i < count; i++) {
+			if (modifiers[i] == I915_FORMAT_MOD_X_TILED)
+				break;
+		}
+		if (i == count)
+			modifier = DRM_FORMAT_MOD_LINEAR;
+		else
+			modifier = I915_FORMAT_MOD_X_TILED;
+	}
+
 	switch (modifier) {
 	case DRM_FORMAT_MOD_LINEAR:
 		bo->meta.tiling = I915_TILING_NONE;