[Intel-gfx] [PATCH igt] igt: Check the physical swizzle status

Chris Wilson chris at chris-wilson.co.uk
Wed Oct 19 13:10:33 UTC 2016


The kernel tries to hide L-shaped memory with asymmetric swizzling from
userspace by reporting lies through the get-tiling interface. Check for
these lies by comparing the reported swizzle with the actual swizzle,
and only run swizzling tests where we know the underlying physical
swizzling.

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
 lib/igt_draw.c                | 10 +++++-----
 lib/igt_sysfs.c               |  3 ++-
 lib/ioctl_wrappers.c          | 23 +++++++++++++++++++----
 lib/ioctl_wrappers.h          |  2 +-
 tests/gem_tiled_pread_basic.c |  2 +-
 5 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/lib/igt_draw.c b/lib/igt_draw.c
index 45fa10f..3afb827 100644
--- a/lib/igt_draw.c
+++ b/lib/igt_draw.c
@@ -246,7 +246,7 @@ static void draw_rect_mmap_cpu(int fd, struct buf_data *buf, struct rect *rect,
 
 	gem_set_domain(fd, buf->handle, I915_GEM_DOMAIN_CPU,
 		       I915_GEM_DOMAIN_CPU);
-	gem_get_tiling(fd, buf->handle, &tiling, &swizzle);
+	igt_require(gem_get_tiling(fd, buf->handle, &tiling, &swizzle));
 
 	/* We didn't implement suport for the older tiling methods yet. */
 	if (tiling != I915_TILING_NONE)
@@ -295,7 +295,7 @@ static void draw_rect_mmap_wc(int fd, struct buf_data *buf, struct rect *rect,
 
 	gem_set_domain(fd, buf->handle, I915_GEM_DOMAIN_GTT,
 		       I915_GEM_DOMAIN_GTT);
-	gem_get_tiling(fd, buf->handle, &tiling, &swizzle);
+	igt_require(gem_get_tiling(fd, buf->handle, &tiling, &swizzle));
 
 	/* We didn't implement suport for the older tiling methods yet. */
 	if (tiling != I915_TILING_NONE)
@@ -392,7 +392,7 @@ static void draw_rect_pwrite(int fd, struct buf_data *buf,
 {
 	uint32_t tiling, swizzle;
 
-	gem_get_tiling(fd, buf->handle, &tiling, &swizzle);
+	igt_require(gem_get_tiling(fd, buf->handle, &tiling, &swizzle));
 
 	switch (tiling) {
 	case I915_TILING_NONE:
@@ -419,7 +419,7 @@ static void draw_rect_blt(int fd, struct cmd_data *cmd_data,
 	uint32_t tiling, swizzle;
 	int pitch;
 
-	gem_get_tiling(fd, buf->handle, &tiling, &swizzle);
+	igt_require(gem_get_tiling(fd, buf->handle, &tiling, &swizzle));
 
 	dst = gem_handle_to_libdrm_bo(cmd_data->bufmgr, fd, "", buf->handle);
 	igt_assert(dst);
@@ -483,7 +483,7 @@ static void draw_rect_render(int fd, struct cmd_data *cmd_data,
 		    rect->w % (32 / buf->bpp) != 0 ||
 		    rect->h % (32 / buf->bpp) != 0);
 
-	gem_get_tiling(fd, buf->handle, &tiling, &swizzle);
+	igt_require(gem_get_tiling(fd, buf->handle, &tiling, &swizzle));
 
 	/* We create a temporary buffer and copy from it using rendercopy. */
 	tmp.size = rect->w * rect->h * pixel_size;
diff --git a/lib/igt_sysfs.c b/lib/igt_sysfs.c
index 612de75..c19821d 100644
--- a/lib/igt_sysfs.c
+++ b/lib/igt_sysfs.c
@@ -148,7 +148,8 @@ int igt_sysfs_open_parameters(int device)
 	if (dir < 0)
 		return -1;
 
-	params = openat(dir, "device/driver/module/parameters", O_RDONLY);
+	params = -1;
+	//params = openat(dir, "device/driver/module/parameters", O_RDONLY);
 	close(dir);
 
 	if (params < 0) { /* builtin? */
diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c
index 8632878..95bc5e2 100644
--- a/lib/ioctl_wrappers.c
+++ b/lib/ioctl_wrappers.c
@@ -111,6 +111,19 @@ gem_handle_to_libdrm_bo(drm_intel_bufmgr *bufmgr, int fd, const char *name, uint
 	return bo;
 }
 
+static int
+__gem_get_tiling(int fd, struct drm_i915_gem_get_tiling *arg)
+{
+	int err;
+
+	err = 0;
+	if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_GET_TILING, arg))
+		err = -errno;
+	errno = 0;
+
+	return err;
+}
+
 /**
  * gem_get_tiling:
  * @fd: open i915 drm file descriptor
@@ -119,21 +132,23 @@ gem_handle_to_libdrm_bo(drm_intel_bufmgr *bufmgr, int fd, const char *name, uint
  * @swizzle: (out) bit 6 swizzle mode
  *
  * This wraps the GET_TILING ioctl.
+ *
+ * Returns whether the actual physical tiling matches the reported tiling.
  */
-void
+bool
 gem_get_tiling(int fd, uint32_t handle, uint32_t *tiling, uint32_t *swizzle)
 {
 	struct drm_i915_gem_get_tiling get_tiling;
-	int ret;
 
 	memset(&get_tiling, 0, sizeof(get_tiling));
 	get_tiling.handle = handle;
 
-	ret = igt_ioctl(fd, DRM_IOCTL_I915_GEM_GET_TILING, &get_tiling);
-	igt_assert(ret == 0);
+	igt_assert_eq(__gem_get_tiling(fd, &get_tiling), 0);
 
 	*tiling = get_tiling.tiling_mode;
 	*swizzle = get_tiling.swizzle_mode;
+
+	return get_tiling.phys_swizzle_mode == get_tiling.swizzle_mode;
 }
 
 int __gem_set_tiling(int fd, uint32_t handle, uint32_t tiling, uint32_t stride)
diff --git a/lib/ioctl_wrappers.h b/lib/ioctl_wrappers.h
index 42dc3cb..465f760 100644
--- a/lib/ioctl_wrappers.h
+++ b/lib/ioctl_wrappers.h
@@ -53,7 +53,7 @@ drm_intel_bo * gem_handle_to_libdrm_bo(drm_intel_bufmgr *bufmgr, int fd,
 /* ioctl_wrappers.c:
  *
  * ioctl wrappers and similar stuff for bare metal testing */
-void gem_get_tiling(int fd, uint32_t handle, uint32_t *tiling, uint32_t *swizzle);
+bool gem_get_tiling(int fd, uint32_t handle, uint32_t *tiling, uint32_t *swizzle);
 void gem_set_tiling(int fd, uint32_t handle, uint32_t tiling, uint32_t stride);
 int __gem_set_tiling(int fd, uint32_t handle, uint32_t tiling, uint32_t stride);
 
diff --git a/tests/gem_tiled_pread_basic.c b/tests/gem_tiled_pread_basic.c
index 1dfd87c..bad3650 100644
--- a/tests/gem_tiled_pread_basic.c
+++ b/tests/gem_tiled_pread_basic.c
@@ -121,7 +121,7 @@ igt_simple_main
 	fd = drm_open_driver(DRIVER_INTEL);
 
 	handle = create_bo(fd);
-	gem_get_tiling(fd, handle, &tiling, &swizzle);
+	igt_require(gem_get_tiling(fd, handle, &tiling, &swizzle));
 
 	devid = intel_get_drm_devid(fd);
 
-- 
2.9.3



More information about the Intel-gfx mailing list