From b98c7ee7e3d275e93200aec8965c15f6e1de83ac Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 8 Jun 2018 17:29:46 +0100 Subject: [PATCH i-g-t] igt/gem_mmap_gtt: Checking tiling pattern requires known swizzling 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 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106848 Signed-off-by: Chris Wilson --- tests/gem_mmap_gtt.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/gem_mmap_gtt.c b/tests/gem_mmap_gtt.c index 3148f25..ec2b60c 100644 --- a/tests/gem_mmap_gtt.c +++ b/tests/gem_mmap_gtt.c @@ -522,6 +522,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) { @@ -565,6 +583,7 @@ 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)); tiled_pattern = gem_mmap__cpu(fd, bo, 0, PAGE_SIZE, PROT_READ); linear_pattern = gem_mmap__gtt(fd, bo, PAGE_SIZE, PROT_WRITE); -- 2.7.4