[PATCH i-g-t v2 1/4] lib/intel_bufops: Add support for gen2 and i915 tiling layouts

Ville Syrjala ville.syrjala at linux.intel.com
Fri Nov 22 08:48:01 UTC 2024


From: Ville Syrjälä <ville.syrjala at linux.intel.com>

Add support for tiling formats on gen2/3.

Our tile formats are as follows:
X-tile:
 gen2:  128B x 16, made of  8B QWords
 gen3:  512B x  8, made of 32B SWords
 gen4+: 512B x  8, made of 16B OWords
Y-tile:
 gen2:  128B x 16, made of  8B QWords
 i915:  512B x  8, made of 32B SWords
 i945+: 128B x 32, made of 16B OWords

We already had the i945+ Y-tile and i915+ X-tile
(since the i945 OW vs. i915 SW makes no difference
for X-tile). So just need to deal with gen2 X/Y-tile
and i915 Y-tile.

Note that the gen2 check that was there was incorrect
becasue it completely forgot about i915 Y-tile.

Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
---
 lib/intel_bufops.c | 83 +++++++++++++++++++++++++++++++---------------
 1 file changed, 56 insertions(+), 27 deletions(-)

diff --git a/lib/intel_bufops.c b/lib/intel_bufops.c
index 600a485362b5..619222019fd8 100644
--- a/lib/intel_bufops.c
+++ b/lib/intel_bufops.c
@@ -307,10 +307,9 @@ static void *linear_ptr(void *ptr,
 
 static void *x_ptr(void *ptr,
 		   unsigned int x, unsigned int y,
-		   unsigned int stride, unsigned int cpp)
+		   unsigned int stride, unsigned int cpp,
+		   const int tile_width, const int tile_height)
 {
-	const int tile_width = 512;
-	const int tile_height = 8;
 	const int tile_size = tile_width * tile_height;
 	int offset_x, offset_y, pos;
 	int tile_x, tile_y;
@@ -327,13 +326,27 @@ static void *x_ptr(void *ptr,
 	return ptr + pos;
 }
 
+static void *gen2_x_ptr(void *ptr,
+			unsigned int x, unsigned int y,
+			unsigned int stride, unsigned int cpp)
+{
+	return x_ptr(ptr, x, y, stride, cpp, 128, 16);
+}
+
+static void *gen3_x_ptr(void *ptr,
+			unsigned int x, unsigned int y,
+			unsigned int stride, unsigned int cpp)
+{
+	return x_ptr(ptr, x, y, stride, cpp, 512, 8);
+}
+
 static void *y_ptr(void *ptr,
 		   unsigned int x, unsigned int y,
-		   unsigned int stride, unsigned int cpp)
+		   unsigned int stride, unsigned int cpp,
+		   const int tile_width,
+		   const int tile_height,
+		   const int owords)
 {
-	const int tile_width = 128;
-	const int tile_height = 32;
-	const int owords = 16;
 	const int tile_size = tile_width * tile_height;
 	int offset_x, offset_y, pos;
 	int shift_x, shift_y;
@@ -352,6 +365,27 @@ static void *y_ptr(void *ptr,
 	return ptr + pos;
 }
 
+static void *gen2_y_ptr(void *ptr,
+			unsigned int x, unsigned int y,
+			unsigned int stride, unsigned int cpp)
+{
+	return y_ptr(ptr, x, y, stride, cpp, 128, 16, 8);
+}
+
+static void *i915_y_ptr(void *ptr,
+			unsigned int x, unsigned int y,
+			unsigned int stride, unsigned int cpp)
+{
+	return y_ptr(ptr, x, y, stride, cpp, 512, 8, 32);
+}
+
+static void *i945_y_ptr(void *ptr,
+			unsigned int x, unsigned int y,
+			unsigned int stride, unsigned int cpp)
+{
+	return y_ptr(ptr, x, y, stride, cpp, 128, 32, 16);
+}
+
 /*
  * (x,y) to memory location in tiled-4 surface
  *
@@ -426,8 +460,10 @@ static void *yf_ptr(void *ptr,
 
 typedef void *(*tile_fn)(void *, unsigned int, unsigned int,
 			unsigned int, unsigned int);
-static tile_fn __get_tile_fn_ptr(int tiling)
+static tile_fn __get_tile_fn_ptr(int fd, int tiling)
 {
+	const struct intel_device_info *info =
+		intel_get_device_info(intel_get_drm_devid(fd));
 	tile_fn fn = NULL;
 
 	switch (tiling) {
@@ -435,10 +471,18 @@ static tile_fn __get_tile_fn_ptr(int tiling)
 		fn = linear_ptr;
 		break;
 	case I915_TILING_X:
-		fn = x_ptr;
+		if (info->graphics_ver == 2)
+			fn = gen2_x_ptr;
+		else
+			fn = gen3_x_ptr;
 		break;
 	case I915_TILING_Y:
-		fn = y_ptr;
+		if (info->graphics_ver == 2)
+			fn = gen2_y_ptr;
+		else if (info->is_grantsdale || info->is_alviso)
+			fn = i915_y_ptr;
+		else
+			fn = i945_y_ptr;
 		break;
 	case I915_TILING_Yf:
 		fn = yf_ptr;
@@ -595,7 +639,7 @@ static void __copy_linear_to(int fd, struct intel_buf *buf,
 			     const uint32_t *linear,
 			     int tiling, uint32_t swizzle)
 {
-	const tile_fn fn = __get_tile_fn_ptr(tiling);
+	const tile_fn fn = __get_tile_fn_ptr(fd, tiling);
 	int height = intel_buf_height(buf);
 	int width = intel_buf_width(buf);
 	void *map = mmap_write(fd, buf);
@@ -659,7 +703,7 @@ static void copy_linear_to_tile4(struct buf_ops *bops, struct intel_buf *buf,
 static void __copy_to_linear(int fd, struct intel_buf *buf,
 			     uint32_t *linear, int tiling, uint32_t swizzle)
 {
-	const tile_fn fn = __get_tile_fn_ptr(tiling);
+	const tile_fn fn = __get_tile_fn_ptr(fd, tiling);
 	int height = intel_buf_height(buf);
 	int width = intel_buf_width(buf);
 	void *map = mmap_write(fd, buf);
@@ -1699,21 +1743,6 @@ static struct buf_ops *__buf_ops_create(int fd, bool check_idempotency)
 		return bops;
 	}
 
-	/*
-	 * Warning!
-	 *
-	 * Gen2 software tiling/detiling is not supported! (yet).
-	 *
-	 * If you are brave hero with an access to Gen2 you can save the world.
-	 * Until then we're doomed to use only hardware (de)tiling.
-	 *
-	 * Ok, you have been warned.
-	 */
-	if (bops->intel_gen == 2) {
-		igt_warn("Gen2 detected. HW (de)tiling support only.");
-		return bops;
-	}
-
 	/* Let's probe X and Y hw tiling support */
 	if (is_hw_tiling_supported(bops, I915_TILING_X)) {
 		bool swizzling_supported;
-- 
2.45.2



More information about the igt-dev mailing list