[PATCH i-g-t 1/2] Add test gem_exec_kamil
Kamil Konieczny
kamil.konieczny at linux.intel.com
Thu Oct 21 13:11:20 UTC 2021
Add gem_exec_kamil with two basic tests.
Signed-off-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
---
tests/i915/gem_exec_kamil.c | 286 ++++++++++++++++++++++++++++++++++++
tests/meson.build | 1 +
2 files changed, 287 insertions(+)
create mode 100644 tests/i915/gem_exec_kamil.c
diff --git a/tests/i915/gem_exec_kamil.c b/tests/i915/gem_exec_kamil.c
new file mode 100644
index 00000000..94366b30
--- /dev/null
+++ b/tests/i915/gem_exec_kamil.c
@@ -0,0 +1,286 @@
+/*
+ * Copyright © 2016 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include "igt.h"
+#include "igt_collection.h"
+
+#include "i915/gem_create.h"
+
+IGT_TEST_DESCRIPTION("Basic sanity check of execbuf-ioctl rings.");
+
+static void gem(int fd)
+{
+ uint32_t bb = gem_create(fd, 4096); // todo: why fd+1 works ???
+
+ igt_info("bb handle: %x\n", bb);
+ gem_close(fd, bb);
+ igt_info("bb closed: %x\n", bb);
+}
+
+static void offsety(int i915)
+{
+ uint32_t obiekt = gem_create(i915, 8192);
+ uint32_t bb = gem_create(i915, 4096);
+ uint32_t fake = gem_create(i915, 0x5000);
+ const uint32_t bbe = MI_BATCH_BUFFER_END;
+ int i;
+ uint32_t *ptr;
+
+ struct drm_i915_gem_execbuffer2 execbuf;
+ struct drm_i915_gem_exec_object2 obj[3];
+ struct drm_i915_gem_relocation_entry reloc = {};
+
+ gem_write(i915, bb, 0, &bbe, sizeof(bbe));
+
+ ptr = gem_mmap__cpu_coherent(i915, bb, 0, 4096, PROT_READ);
+ for (i = 0; i < 8; i++)
+ igt_info("[%04x]: %08x\n", i, ptr[i]);
+ gem_munmap(ptr, 4096);
+
+ memset(&execbuf, 0, sizeof(execbuf));
+ execbuf.buffers_ptr = to_user_pointer(obj);
+ execbuf.buffer_count = 3;
+
+ memset(obj, 0, sizeof(obj));
+ obj[0].handle = fake;
+ obj[0].offset = 0;
+ obj[0].flags = EXEC_OBJECT_PINNED;
+ obj[1].handle = obiekt;
+ obj[1].alignment = 0x2000;
+ obj[2].handle = bb;
+ obj[2].relocation_count = 1;
+ obj[2].relocs_ptr = to_user_pointer(&reloc);
+ obj[2].offset = 0;
+ // offset = 0 with PINNED page will cause test fail, conflict with offset for fake
+ // obj[2].flags = EXEC_OBJECT_PINNED;
+
+ reloc.presumed_offset = -1;
+ reloc.offset = 16;
+ reloc.read_domains = I915_GEM_DOMAIN_INSTRUCTION;
+ reloc.write_domain = I915_GEM_DOMAIN_INSTRUCTION;
+ reloc.target_handle = obj[1].handle;
+
+ igt_info("A obj[0].offset: %llx, handle: %u\n", obj[0].offset, obj[0].handle);
+ igt_info("A obj[1].offset: %llx, handle: %u\n", obj[1].offset, obj[1].handle);
+ igt_info("A obj[2].offset: %llx, handle: %u\n", obj[2].offset, obj[2].handle);
+ gem_execbuf(i915, &execbuf);
+
+ igt_info("B obj[0].offset: %llx, handle: %u\n", obj[0].offset, obj[0].handle);
+ igt_info("B obj[1].offset: %llx, handle: %u\n", obj[1].offset, obj[1].handle);
+ igt_info("B obj[2].offset: %llx, handle: %u\n", obj[2].offset, obj[2].handle);
+
+ ptr = gem_mmap__cpu_coherent(i915, bb, 0, 4096, PROT_READ);
+ for (i = 0; i < 8; i++)
+ igt_info("[%04x]: %08x\n", i, ptr[i]);
+ gem_munmap(ptr, 4096);
+}
+
+#define MI_COPY ((2 << 29) | (0x53 << 22) | (3 << 20) | 8)
+
+static void copyrnd(int i915, bool use_reloc)
+{
+ uint32_t src = gem_create(i915, 4096);
+ uint32_t dst = gem_create(i915, 4096);
+ uint32_t bb = gem_create(i915, 4096);
+ uint32_t batch[16] = {}; //MI_BATCH_BUFFER_END;
+ int i;
+ uint32_t *ptr;
+ char myaddr[128], mybuff[1024], mybatch[1024];
+
+ struct drm_i915_gem_execbuffer2 execbuf;
+ struct drm_i915_gem_exec_object2 obj[3];
+ struct drm_i915_gem_relocation_entry reloc[2];
+
+ ptr = gem_mmap__cpu_coherent(i915, src, 0, 4096, PROT_READ|PROT_WRITE);
+ for (i = 0; i < 4096/4; i++)
+ ptr[i] = i; //rnd();
+
+ gem_munmap(ptr, 4096);
+ i = 0;
+ batch[i++] = MI_COPY;
+ // 0xcc - COPY ROP (ROP = Raster OP) - Blitter
+ batch[i++] = (3 << 24) | (0xcc << 16) | (1024); // 1024 = dst pitch
+ // dst
+ batch[i++] = 0; // Y1, X1 top, left
+ batch[i++] = (1 << 16) | 0x400; // Y2, X2 bottom, right 0,1024 ??? 1 or 0 ???
+ batch[i++] = 0x1000; // dst addr low-endian
+ batch[i++] = 0; // dst addr high bits
+ // src
+ batch[i++] = 0; // Y1, X1 top, left
+ batch[i++] = 1024; // src pitch
+ //
+ batch[i++] = 0x2000; // src addr low-endian
+ batch[i++] = 0; // src addr
+ igt_assert((i % 2) == 0);
+ batch[i++] = MI_BATCH_BUFFER_END;
+ batch[i++] = 0; // MI_NOP
+ // redundant = from array init {}
+
+ gem_write(i915, bb, 0, batch, sizeof(batch));
+
+ memset(&execbuf, 0, sizeof(execbuf));
+ execbuf.buffers_ptr = to_user_pointer(obj);
+ execbuf.buffer_count = 3;
+ execbuf.flags = I915_EXEC_BLT; // blitter
+
+ memset(obj, 0, sizeof(obj));
+ obj[0].handle = src;
+ obj[1].flags = EXEC_OBJECT_WRITE;
+ obj[1].handle = dst;
+ obj[2].handle = bb;
+ obj[2].offset = 0;
+ if (use_reloc) {
+ memset(reloc, 0, sizeof(reloc));
+ reloc[0].offset = 4*sizeof(uint32_t);
+ reloc[0].presumed_offset = -1;
+ reloc[0].target_handle = dst;
+ reloc[0].read_domains = I915_GEM_DOMAIN_RENDER;
+ reloc[0].write_domain = I915_GEM_DOMAIN_RENDER;
+ reloc[1].offset = 8*sizeof(uint32_t);
+ reloc[1].presumed_offset = -1;
+ reloc[1].target_handle = src;
+ reloc[1].read_domains = I915_GEM_DOMAIN_RENDER;
+ reloc[1].write_domain = 0;
+ obj[2].relocation_count = 2;
+ obj[2].relocs_ptr = to_user_pointer(reloc);
+ } else {
+ obj[0].offset = 0x2000;
+ obj[0].flags = EXEC_OBJECT_PINNED;
+ obj[1].offset = 0x1000;
+ obj[1].flags |= EXEC_OBJECT_PINNED;
+ }
+
+ gem_execbuf(i915, &execbuf);
+ i = getpid();
+ sprintf(myaddr, "%04x s/d %06" PRIx64 "/%06" PRIx64, i,
+ (uint64_t)obj[0].offset, (uint64_t)obj[1].offset);
+ //igt_info("%s\n", myaddr);
+ //
+ //gem_sync(i915, dst); // if no WRTIE flag
+ //
+ gem_set_domain(i915, dst, I915_GEM_DOMAIN_CPU, 0); // this or above, experiment without it
+ //
+ gem_sync(i915, bb);
+
+ ptr = gem_mmap__cpu_coherent(i915, dst, 0, 4096, PROT_READ); // device|cpu
+ //for (i = 0; i < 8; i++)
+ // igt_info("[%04x]: %08x\n", i, ptr[i]);
+ sprintf(mybuff, "%x %x %x %x", ptr[0], ptr[1], ptr[2], ptr[3]);
+ gem_munmap(ptr, 4096);
+
+ //igt_info("batchbuffer:\n");
+ ptr = gem_mmap__cpu_coherent(i915, bb, 0, 4096, PROT_READ); // device|cpu
+ //for (i = 0; i < 16; i++)
+ // igt_info("[%04x]: %08x\n", i, ptr[i]);
+ sprintf(mybatch, "%x %x %x %x %06x %x %x %x %x", ptr[0], ptr[1], ptr[2], ptr[3],
+ ptr[4], ptr[5], ptr[6], ptr[7], ptr[8]);
+ gem_munmap(ptr, 4096);
+ igt_info("%s %s %s\n", myaddr, mybuff, mybatch);
+}
+
+static void fork_ten(int i915)
+{
+ int child;
+ time_t t;
+ const int n = 10;
+
+ /* Intializes random number generator */
+ //srand((unsigned) time(&t));
+ srand(42); //3137417);
+
+ // igt_fork() - re-worked macro
+ for (child = 0; child < n; ++child) {
+ if(__igt_fork())
+ break;
+ }
+
+ if (child == n) { // parent
+ igt_waitchildren_timeout(3, "fork_ten wait timeout"); //int seconds, const char *reason
+ } else { // children
+ //srand((unsigned) time(&t));
+ for (int i=0; i < 2*child; ++i) rand();
+
+ usleep(1000 + (rand() % 8000));
+ copyrnd(i915, true);
+ exit(0);
+ }
+}
+
+igt_main
+{
+ int fd = -1;
+
+ igt_fixture {
+ fd = drm_open_driver(DRIVER_INTEL);
+ }
+
+ igt_subtest("gem") {
+ gem(fd);
+ }
+ igt_subtest("offsety") {
+ offsety(fd);
+ }
+ igt_subtest("copyrnd-noreloc") {
+ copyrnd(fd, false);
+ }
+ igt_subtest("copyrnd-reloc") {
+ copyrnd(fd, true);
+ }
+ igt_subtest("fork-ten") {
+ fork_ten(fd);
+ }
+ igt_subtest("exec") {
+
+ }
+/* igt_subtest_with_dynamic("basic") {
+ for_each_combination(regions, 1, set) {
+ char *sub_name = memregion_dynamic_subtest_name(regions);
+ struct drm_i915_gem_exec_object2 exec;
+ uint32_t region = igt_collection_get_value(regions, 0);
+
+ batch_size = gem_get_batch_size(fd, MEMORY_TYPE_FROM_REGION(region));
+ memset(&exec, 0, sizeof(exec));
+ exec.handle = batch_create(fd, batch_size, region);
+
+ for_each_ctx_engine(fd, ctx, e) {
+ igt_dynamic_f("%s-%s", e->name, sub_name) {
+ struct drm_i915_gem_execbuffer2 execbuf = {
+ .buffers_ptr = to_user_pointer(&exec),
+ .buffer_count = 1,
+ .flags = e->flags,
+ .rsvd1 = ctx->id,
+ };
+
+ gem_execbuf(fd, &execbuf);
+ }
+ }
+ gem_sync(fd, exec.handle);
+ gem_close(fd, exec.handle);
+ free(sub_name);
+ }
+ }
+*/
+ igt_fixture {
+ close(fd);
+ }
+}
diff --git a/tests/meson.build b/tests/meson.build
index 0af3e03a..29cdbd30 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -132,6 +132,7 @@ i915_progs = [
'gem_exec_fence',
'gem_exec_flush',
'gem_exec_gttfill',
+ 'gem_exec_kamil',
'gem_exec_latency',
'gem_exec_lut_handle',
'gem_exec_nop',
--
2.30.2
More information about the Intel-gfx-trybot
mailing list