minigbm: Add tile4 support

Adding tile4 support for MTL.

BUG=b:243459433, b:243685631
TEST=emerge-rex minigbm

Change-Id: Ib66e121498b6eacc6038a6a4c392a76a104c5c2c
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3841638
Tested-by: Ashutosh Kumar <ashutosh1.kumar@intel.com>
Commit-Queue: Rajat Jain <rajatja@google.com>
Reviewed-by: Dominik Behr <dbehr@chromium.org>
diff --git a/drv.h b/drv.h
index 3422402..dec43fc 100644
--- a/drv.h
+++ b/drv.h
@@ -77,6 +77,10 @@
 #define I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS fourcc_mod_code(INTEL, 6)
 #endif
 
+//TODO: remove this defination once drm_fourcc.h contains it.
+#ifndef I915_FORMAT_MOD_4_TILED
+#define I915_FORMAT_MOD_4_TILED         fourcc_mod_code(INTEL, 9)
+#endif
 // clang-format on
 struct driver;
 struct bo;
diff --git a/external/i915_drm.h b/external/i915_drm.h
index e301c5f..e009a9e 100644
--- a/external/i915_drm.h
+++ b/external/i915_drm.h
@@ -1306,7 +1306,8 @@
 #define I915_TILING_NONE	0
 #define I915_TILING_X		1
 #define I915_TILING_Y		2
-#define I915_TILING_LAST	I915_TILING_Y
+#define I915_TILING_4		9
+#define I915_TILING_LAST	I915_TILING_4
 
 #define I915_BIT_6_SWIZZLE_NONE		0
 #define I915_BIT_6_SWIZZLE_9		1
diff --git a/i915.c b/i915.c
index e304dcc..a40f88f 100644
--- a/i915.c
+++ b/i915.c
@@ -44,6 +44,9 @@
 static const uint64_t gen11_modifier_order[] = { I915_FORMAT_MOD_Y_TILED, I915_FORMAT_MOD_X_TILED,
 						 DRM_FORMAT_MOD_LINEAR };
 
+static const uint64_t xe_lpdp_modifier_order[] = { I915_FORMAT_MOD_4_TILED, I915_FORMAT_MOD_X_TILED,
+						 DRM_FORMAT_MOD_LINEAR};
+
 struct modifier_support_t {
 	const uint64_t *order;
 	uint32_t count;
@@ -184,7 +187,10 @@
 
 static void i915_get_modifier_order(struct i915_device *i915)
 {
-	if (i915->graphics_version == 12) {
+	if (i915->is_mtl) {
+		i915->modifier.order = xe_lpdp_modifier_order;
+		i915->modifier.count = ARRAY_SIZE(xe_lpdp_modifier_order);
+	} else if (i915->graphics_version == 12) {
 		i915->modifier.order = gen12_modifier_order;
 		i915->modifier.count = ARRAY_SIZE(gen12_modifier_order);
 	} else if (i915->graphics_version == 11) {
@@ -263,30 +269,50 @@
 	drv_add_combinations(drv, scanout_render_formats, ARRAY_SIZE(scanout_render_formats),
 			     &metadata_x_tiled, scanout_and_render_not_linear);
 
-	struct format_metadata metadata_y_tiled = { .tiling = I915_TILING_Y,
+	if (i915->is_mtl) {
+		struct format_metadata metadata_4_tiled = { .tiling = I915_TILING_4,
+						    .priority = 3,
+						    .modifier = I915_FORMAT_MOD_4_TILED };
+/* Support tile4 NV12 and P010 for libva */
+#ifdef I915_SCANOUT_4_TILED
+		const uint64_t nv12_usage =
+			BO_USE_TEXTURE | BO_USE_HW_VIDEO_DECODER | BO_USE_SCANOUT | hw_protected;
+		const uint64_t p010_usage = BO_USE_TEXTURE | BO_USE_HW_VIDEO_DECODER | hw_protected |
+                        BO_USE_SCANOUT;
+#else
+		const uint64_t nv12_usage = BO_USE_TEXTURE | BO_USE_HW_VIDEO_DECODER;
+		const uint64_t p010_usage = nv12_usage;
+#endif
+		drv_add_combination(drv, DRM_FORMAT_NV12, &metadata_4_tiled, nv12_usage);
+		drv_add_combination(drv, DRM_FORMAT_P010, &metadata_4_tiled, p010_usage);
+		drv_add_combinations(drv, render_formats, ARRAY_SIZE(render_formats), &metadata_4_tiled,
+			     render_not_linear);
+		drv_add_combinations(drv, scanout_render_formats, ARRAY_SIZE(scanout_render_formats),
+			     &metadata_4_tiled, render_not_linear);
+	} else {
+		struct format_metadata metadata_y_tiled = { .tiling = I915_TILING_Y,
 						    .priority = 3,
 						    .modifier = I915_FORMAT_MOD_Y_TILED };
-
 /* Support y-tiled NV12 and P010 for libva */
 #ifdef I915_SCANOUT_Y_TILED
-	const uint64_t nv12_usage =
-	    BO_USE_TEXTURE | BO_USE_HW_VIDEO_DECODER | BO_USE_SCANOUT | hw_protected;
-	const uint64_t p010_usage = BO_USE_TEXTURE | BO_USE_HW_VIDEO_DECODER | hw_protected |
-				    (i915->graphics_version >= 11 ? BO_USE_SCANOUT : 0);
+		const uint64_t nv12_usage =
+			BO_USE_TEXTURE | BO_USE_HW_VIDEO_DECODER | BO_USE_SCANOUT | hw_protected;
+		const uint64_t p010_usage = BO_USE_TEXTURE | BO_USE_HW_VIDEO_DECODER | hw_protected |
+			(i915->graphics_version >= 11 ? BO_USE_SCANOUT : 0);
 #else
-	const uint64_t nv12_usage = BO_USE_TEXTURE | BO_USE_HW_VIDEO_DECODER;
-	const uint64_t p010_usage = nv12_usage;
+		const uint64_t nv12_usage = BO_USE_TEXTURE | BO_USE_HW_VIDEO_DECODER;
+		const uint64_t p010_usage = nv12_usage;
 #endif
-	drv_add_combination(drv, DRM_FORMAT_NV12, &metadata_y_tiled, nv12_usage);
-	drv_add_combination(drv, DRM_FORMAT_P010, &metadata_y_tiled, p010_usage);
-
-	drv_add_combinations(drv, render_formats, ARRAY_SIZE(render_formats), &metadata_y_tiled,
+		drv_add_combination(drv, DRM_FORMAT_NV12, &metadata_y_tiled, nv12_usage);
+		drv_add_combination(drv, DRM_FORMAT_P010, &metadata_y_tiled, p010_usage);
+		drv_add_combinations(drv, render_formats, ARRAY_SIZE(render_formats), &metadata_y_tiled,
 			     render_not_linear);
-
-	// Y-tiled scanout isn't available on old platforms so we add
-	// |scanout_render_formats| without that USE flag.
-	drv_add_combinations(drv, scanout_render_formats, ARRAY_SIZE(scanout_render_formats),
+		/* Y-tiled scanout isn't available on old platforms so we add
+		 * |scanout_render_formats| without that USE flag.
+		 */
+		drv_add_combinations(drv, scanout_render_formats, ARRAY_SIZE(scanout_render_formats),
 			     &metadata_y_tiled, render_not_linear);
+	}
 	return 0;
 }
 
@@ -325,6 +351,7 @@
 		break;
 
 	case I915_TILING_Y:
+	case I915_TILING_4:
 		if (i915->graphics_version == 3) {
 			horizontal_alignment = 512;
 			vertical_alignment = 8;
@@ -552,6 +579,9 @@
 	case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
 		bo->meta.tiling = I915_TILING_Y;
 		break;
+	case I915_FORMAT_MOD_4_TILED:
+		bo->meta.tiling = I915_TILING_4;
+		break;
 	}
 
 	bo->meta.format_modifier = modifier;
@@ -754,10 +784,9 @@
 	int ret;
 	void *addr = MAP_FAILED;
 
-	if (bo->meta.format_modifier == I915_FORMAT_MOD_Y_TILED_CCS)
-		return MAP_FAILED;
-
-	if (bo->meta.format_modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS)
+	if ((bo->meta.format_modifier == I915_FORMAT_MOD_Y_TILED_CCS) ||
+	    (bo->meta.format_modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS) ||
+	    (bo->meta.format_modifier == I915_FORMAT_MOD_4_TILED))
 		return MAP_FAILED;
 
 	if (bo->meta.tiling == I915_TILING_NONE) {