From 019f892e5d1a0a9643cb726c47ce2d99c14b444f Mon Sep 17 00:00:00 2001 From: Andi Shyti Date: Fri, 5 Apr 2019 04:07:32 +0300 Subject: 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 Reviewed-by: Chris Wilson Reviewed-by: Tvrtko Ursulin --- lib/i915/gem_context.c | 25 +++++++++++++++++++++++++ lib/i915/gem_context.h | 2 ++ lib/ioctl_wrappers.c | 19 ------------------- lib/ioctl_wrappers.h | 3 ++- 4 files changed, 29 insertions(+), 20 deletions(-) (limited to 'lib') 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; -- cgit v1.2.3