summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndi Shyti <andi.shyti@intel.com>2019-04-05 04:07:32 +0300
committerChris Wilson <chris@chris-wilson.co.uk>2019-04-05 08:58:58 +0100
commit019f892e5d1a0a9643cb726c47ce2d99c14b444f (patch)
tree3026e83febdee0f9b1885d7d7591ab2b0061bbc6 /lib
parent2f38eabf06ec5bcdf28e1bfd0ffd95581b20e26b (diff)
lib: ioctl_wrappers: reach engines by index as well
With the new engine query method engines are reachable through an index and context they are combined with. The 'gem_has_ring()' becomes 'gem_context_has_engine()' that requires the index that the engine is mapped within the driver. The function has been moved from lib/ioctl_wappers to lib/i915/gem_context where it is more appropriate. The previous 'gem_has_ring()' function becomes a wrapper to the new 'gem_context_has_engine()'. Signed-off-by: Andi Shyti <andi.shyti@intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/i915/gem_context.c25
-rw-r--r--lib/i915/gem_context.h2
-rw-r--r--lib/ioctl_wrappers.c19
-rw-r--r--lib/ioctl_wrappers.h3
4 files changed, 29 insertions, 20 deletions
diff --git a/lib/i915/gem_context.c b/lib/i915/gem_context.c
index 8b4d5b70..f94d89cb 100644
--- a/lib/i915/gem_context.c
+++ b/lib/i915/gem_context.c
@@ -271,3 +271,28 @@ void gem_context_set_priority(int fd, uint32_t ctx_id, int prio)
{
igt_assert_eq(__gem_context_set_priority(fd, ctx_id, prio), 0);
}
+
+bool gem_context_has_engine(int fd, uint32_t ctx, uint64_t engine)
+{
+ struct drm_i915_gem_exec_object2 exec = {};
+ struct drm_i915_gem_execbuffer2 execbuf = {
+ .buffers_ptr = to_user_pointer(&exec),
+ .buffer_count = 1,
+ .flags = engine,
+ .rsvd1 = ctx,
+ };
+
+ /*
+ * 'engine' value can either store an execbuf engine selector
+ * or a context map index; for the latter case we do not expect
+ * to have any value at bit 13 and 14 (BSD1/2 selector),
+ * therefore, we assume that the following check is safe and it
+ * wouldn't produce any result.
+ */
+ if ((engine & ~(3<<13)) == I915_EXEC_BSD) {
+ if (engine & (3 << 13) && !gem_has_bsd2(fd))
+ return false;
+ }
+
+ return __gem_execbuf(fd, &execbuf) == -ENOENT;
+}
diff --git a/lib/i915/gem_context.h b/lib/i915/gem_context.h
index aef68dda..a052714d 100644
--- a/lib/i915/gem_context.h
+++ b/lib/i915/gem_context.h
@@ -45,4 +45,6 @@ int __gem_context_get_param(int fd, struct drm_i915_gem_context_param *p);
int __gem_context_set_priority(int fd, uint32_t ctx, int prio);
void gem_context_set_priority(int fd, uint32_t ctx, int prio);
+bool gem_context_has_engine(int fd, uint32_t ctx, uint64_t engine);
+
#endif /* GEM_CONTEXT_H */
diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c
index 39920f87..280fdd62 100644
--- a/lib/ioctl_wrappers.c
+++ b/lib/ioctl_wrappers.c
@@ -1252,25 +1252,6 @@ void igt_require_gem(int fd)
igt_require_f(err == 0, "Unresponsive i915/GEM device\n");
}
-bool gem_has_ring(int fd, unsigned ring)
-{
- struct drm_i915_gem_execbuffer2 execbuf;
- struct drm_i915_gem_exec_object2 exec;
-
- /* silly ABI, the kernel thinks everyone who has BSD also has BSD2 */
- if ((ring & ~(3<<13)) == I915_EXEC_BSD) {
- if (ring & (3 << 13) && !gem_has_bsd2(fd))
- return false;
- }
-
- memset(&exec, 0, sizeof(exec));
- memset(&execbuf, 0, sizeof(execbuf));
- execbuf.buffers_ptr = to_user_pointer(&exec);
- execbuf.buffer_count = 1;
- execbuf.flags = ring;
- return __gem_execbuf(fd, &execbuf) == -ENOENT;
-}
-
/**
* gem_require_ring:
* @fd: open i915 drm file descriptor
diff --git a/lib/ioctl_wrappers.h b/lib/ioctl_wrappers.h
index f0be2608..03211c97 100644
--- a/lib/ioctl_wrappers.h
+++ b/lib/ioctl_wrappers.h
@@ -142,11 +142,12 @@ bool gem_has_exec_fence(int fd);
/* check functions which auto-skip tests by calling igt_skip() */
void gem_require_caching(int fd);
-bool gem_has_ring(int fd, unsigned ring);
void gem_require_ring(int fd, unsigned ring);
bool gem_has_mocs_registers(int fd);
void gem_require_mocs_registers(int fd);
+#define gem_has_ring(f, r) gem_context_has_engine(f, 0, r)
+
/* prime */
struct local_dma_buf_sync {
uint64_t flags;