intel/mi_builder: Use softpin for tests on gen8+
authorJason Ekstrand <jason@jlekstrand.net>
Thu, 11 Apr 2019 16:34:45 +0000 (11:34 -0500)
committerJason Ekstrand <jason.ekstrand@intel.com>
Mon, 8 Mar 2021 16:47:19 +0000 (10:47 -0600)
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9445>

src/intel/common/tests/mi_builder_test.cpp

index 8ac4d26..07bb474 100644 (file)
@@ -129,12 +129,20 @@ public:
    gen_device_info devinfo;
 
    uint32_t batch_bo_handle;
+#if GEN_GEN >= 8
+   uint64_t batch_bo_addr;
+#endif
    uint32_t batch_offset;
    void *batch_map;
 
+#if GEN_GEN < 8
    std::vector<drm_i915_gem_relocation_entry> relocs;
+#endif
 
    uint32_t data_bo_handle;
+#if GEN_GEN >= 8
+   uint64_t data_bo_addr;
+#endif
    void *data_map;
    char *input;
    char *output;
@@ -202,12 +210,26 @@ mi_builder_test::SetUp()
                       (void *)&ctx_create), 0) << strerror(errno);
    ctx_id = ctx_create.ctx_id;
 
+   if (GEN_GEN >= 8) {
+      /* On gen8+, we require softpin */
+      int has_softpin;
+      drm_i915_getparam getparam = drm_i915_getparam();
+      getparam.param = I915_PARAM_HAS_EXEC_SOFTPIN;
+      getparam.value = &has_softpin;
+      ASSERT_EQ(drmIoctl(fd, DRM_IOCTL_I915_GETPARAM,
+                         (void *)&getparam), 0) << strerror(errno);
+      ASSERT_TRUE(has_softpin);
+   }
+
    // Create the batch buffer
    drm_i915_gem_create gem_create = drm_i915_gem_create();
    gem_create.size = BATCH_BO_SIZE;
    ASSERT_EQ(drmIoctl(fd, DRM_IOCTL_I915_GEM_CREATE,
                       (void *)&gem_create), 0) << strerror(errno);
    batch_bo_handle = gem_create.handle;
+#if GEN_GEN >= 8
+   batch_bo_addr = 0xffffffffdff70000ULL;
+#endif
 
    drm_i915_gem_caching gem_caching = drm_i915_gem_caching();
    gem_caching.handle = batch_bo_handle;
@@ -233,6 +255,9 @@ mi_builder_test::SetUp()
    ASSERT_EQ(drmIoctl(fd, DRM_IOCTL_I915_GEM_CREATE,
                       (void *)&gem_create), 0) << strerror(errno);
    data_bo_handle = gem_create.handle;
+#if GEN_GEN >= 8
+   data_bo_addr = 0xffffffffefff0000ULL;
+#endif
 
    gem_caching = drm_i915_gem_caching();
    gem_caching.handle = data_bo_handle;
@@ -282,18 +307,29 @@ mi_builder_test::submit_batch()
    objects[0].handle = data_bo_handle;
    objects[0].relocation_count = 0;
    objects[0].relocs_ptr = 0;
+#if GEN_GEN >= 8 /* On gen8+, we pin everything */
+   objects[0].flags = EXEC_OBJECT_SUPPORTS_48B_ADDRESS |
+                      EXEC_OBJECT_PINNED |
+                      EXEC_OBJECT_WRITE;
+   objects[0].offset = data_bo_addr;
+#else
    objects[0].flags = EXEC_OBJECT_WRITE;
    objects[0].offset = -1;
-   if (GEN_GEN >= 8)
-      objects[0].flags |= EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
+#endif
 
    objects[1].handle = batch_bo_handle;
+#if GEN_GEN >= 8 /* On gen8+, we don't use relocations */
+   objects[1].relocation_count = 0;
+   objects[1].relocs_ptr = 0;
+   objects[1].flags = EXEC_OBJECT_SUPPORTS_48B_ADDRESS |
+                      EXEC_OBJECT_PINNED;
+   objects[1].offset = batch_bo_addr;
+#else
    objects[1].relocation_count = relocs.size();
    objects[1].relocs_ptr = (uintptr_t)(void *)&relocs[0];
    objects[1].flags = 0;
    objects[1].offset = -1;
-   if (GEN_GEN >= 8)
-      objects[1].flags |= EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
+#endif
 
    drm_i915_gem_execbuffer2 execbuf = drm_i915_gem_execbuffer2();
    execbuf.buffers_ptr = (uintptr_t)(void *)objects;
@@ -317,6 +353,11 @@ uint64_t
 __gen_combine_address(mi_builder_test *test, void *location,
                       address addr, uint32_t delta)
 {
+#if GEN_GEN >= 8
+   uint64_t addr_u64 = addr.gem_handle == test->data_bo_handle ?
+                       test->data_bo_addr : test->batch_bo_addr;
+   return addr_u64 + addr.offset + delta;
+#else
    drm_i915_gem_relocation_entry reloc = drm_i915_gem_relocation_entry();
    reloc.target_handle = addr.gem_handle == test->data_bo_handle ? 0 : 1;
    reloc.delta = addr.offset + delta;
@@ -325,6 +366,7 @@ __gen_combine_address(mi_builder_test *test, void *location,
    test->relocs.push_back(reloc);
 
    return reloc.delta;
+#endif
 }
 
 void *