diff mbox

[i-g-t] igt/gem_mmap_gtt: Checking tiling pattern requires known swizzling

Message ID 20180608185414.1463-1-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show

Commit Message

Chris Wilson June 8, 2018, 6:54 p.m. UTC
As the swizzling is baked into the tiling pattern, the swizzling has to
be consistent across the entire GTT mmap for our tests to work. However,
under L-shaped memory configurations on older architectures, the
swizzling varied depending on which region the page found itself in --
invalidating our assumptions and ability to predict the tiling pattern.

Reported-by: Adric Blake <promarbler14@gmail.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106848
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
---
 tests/gem_mmap_gtt.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

Comments

Tvrtko Ursulin June 11, 2018, 1:20 p.m. UTC | #1
On 08/06/2018 19:54, Chris Wilson wrote:
> As the swizzling is baked into the tiling pattern, the swizzling has to
> be consistent across the entire GTT mmap for our tests to work. However,
> under L-shaped memory configurations on older architectures, the
> swizzling varied depending on which region the page found itself in --
> invalidating our assumptions and ability to predict the tiling pattern.
> 
> Reported-by: Adric Blake <promarbler14@gmail.com>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106848
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> ---
>   tests/gem_mmap_gtt.c | 20 ++++++++++++++++++++
>   1 file changed, 20 insertions(+)
> 
> diff --git a/tests/gem_mmap_gtt.c b/tests/gem_mmap_gtt.c
> index 6a332b254..fd60b8ff8 100644
> --- a/tests/gem_mmap_gtt.c
> +++ b/tests/gem_mmap_gtt.c
> @@ -445,6 +445,24 @@ static int max_tile_width(uint32_t devid, int tiling)
>   		return 8 << 10;
>   }
>   
> +static bool known_swizzling(int fd, uint32_t handle)
> +{
> +	struct drm_i915_gem_get_tiling2 {
> +		uint32_t handle;
> +		uint32_t tiling_mode;
> +		uint32_t swizzle_mode;
> +		uint32_t phys_swizzle_mode;
> +	} arg = {
> +		.handle = handle,
> +	};
> +#define DRM_IOCTL_I915_GEM_GET_TILING2	DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_TILING, struct drm_i915_gem_get_tiling2)
> +
> +	if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_GET_TILING2, &arg))
> +		return false;
> +
> +	return arg.phys_swizzle_mode == arg.swizzle_mode;
> +}
> +
>   static void
>   test_huge_bo(int fd, int huge, int tiling)
>   {
> @@ -488,6 +506,8 @@ test_huge_bo(int fd, int huge, int tiling)
>   	bo = gem_create(fd, PAGE_SIZE);
>   	if (tiling)
>   		igt_require(__gem_set_tiling(fd, bo, tiling, pitch) == 0);
> +	igt_require(known_swizzling(fd, bo));
> +
>   	linear_pattern = gem_mmap__gtt(fd, bo, PAGE_SIZE,
>   				       PROT_READ | PROT_WRITE);
>   	for (i = 0; i < PAGE_SIZE; i++)
> 

Had a think and couldn't come up with a way to solve it so skip sounds fine.

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Regards,

Tvrtko
diff mbox

Patch

diff --git a/tests/gem_mmap_gtt.c b/tests/gem_mmap_gtt.c
index 6a332b254..fd60b8ff8 100644
--- a/tests/gem_mmap_gtt.c
+++ b/tests/gem_mmap_gtt.c
@@ -445,6 +445,24 @@  static int max_tile_width(uint32_t devid, int tiling)
 		return 8 << 10;
 }
 
+static bool known_swizzling(int fd, uint32_t handle)
+{
+	struct drm_i915_gem_get_tiling2 {
+		uint32_t handle;
+		uint32_t tiling_mode;
+		uint32_t swizzle_mode;
+		uint32_t phys_swizzle_mode;
+	} arg = {
+		.handle = handle,
+	};
+#define DRM_IOCTL_I915_GEM_GET_TILING2	DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_TILING, struct drm_i915_gem_get_tiling2)
+
+	if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_GET_TILING2, &arg))
+		return false;
+
+	return arg.phys_swizzle_mode == arg.swizzle_mode;
+}
+
 static void
 test_huge_bo(int fd, int huge, int tiling)
 {
@@ -488,6 +506,8 @@  test_huge_bo(int fd, int huge, int tiling)
 	bo = gem_create(fd, PAGE_SIZE);
 	if (tiling)
 		igt_require(__gem_set_tiling(fd, bo, tiling, pitch) == 0);
+	igt_require(known_swizzling(fd, bo));
+
 	linear_pattern = gem_mmap__gtt(fd, bo, PAGE_SIZE,
 				       PROT_READ | PROT_WRITE);
 	for (i = 0; i < PAGE_SIZE; i++)