[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