summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2020-12-16 20:48:08 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2020-12-17 22:22:00 +0000
commited15a8d259429a77647c1d8691385f1b82915a13 (patch)
treed47f5e939612dc592a8137ea2dd1ac121e27f510
parentff747ef212f95e5a66bef553187e131cf1c53af1 (diff)
i915/gem_softpin: Check the last 32b page is excluded
In order to prevent issues with 32b stateless address, the last page under 4G is excluded for non-48b objects. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: CQ Tang <cq.tang@intel.com> Reviewed-by: Matthew Auld <matthew.auld@intel.com>
-rw-r--r--tests/i915/gem_softpin.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/i915/gem_softpin.c b/tests/i915/gem_softpin.c
index a3e6dcac..703beb77 100644
--- a/tests/i915/gem_softpin.c
+++ b/tests/i915/gem_softpin.c
@@ -156,6 +156,39 @@ static void test_zero(int i915)
gem_close(i915, object.handle);
}
+static void test_32b_last_page(int i915)
+{
+ uint64_t sz, gtt = gem_aperture_size(i915);
+ struct drm_i915_gem_exec_object2 object = {
+ .flags = EXEC_OBJECT_PINNED,
+ };
+ struct drm_i915_gem_execbuffer2 execbuf = {
+ .buffers_ptr = to_user_pointer(&object),
+ .buffer_count = 1,
+ };
+
+ /*
+ * The last page under 32b is excluded for !48b objects in order to
+ * prevent issues with stateless addressing.
+ */
+
+ igt_require(gtt >= 1ull << 32);
+ object.handle = batch_create(i915, &sz),
+
+ object.offset = 1ull << 32;
+ object.offset -= sz;
+ igt_assert_f(__gem_execbuf(i915, &execbuf) == -EINVAL,
+ "execbuf succeeded with object.offset=%llx + %"PRIx64"\n",
+ object.offset, sz);
+
+ object.offset -= 4096;
+ igt_assert_f(__gem_execbuf(i915, &execbuf) == 0,
+ "execbuf failed with object.offset=%llx + %"PRIx64"\n",
+ object.offset, sz);
+
+ gem_close(i915, object.handle);
+}
+
static void test_softpin(int fd)
{
const uint32_t size = 1024 * 1024;
@@ -622,6 +655,10 @@ igt_main
igt_require(gem_uses_full_ppgtt(fd));
test_zero(fd);
}
+ igt_subtest("32b-excludes-last-page") {
+ igt_require(gem_uses_full_ppgtt(fd));
+ test_32b_last_page(fd);
+ }
igt_subtest("softpin")
test_softpin(fd);
igt_subtest("overlap")