All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tvrtko Ursulin <tursulin@ursulin.net>
To: Intel-gfx@lists.freedesktop.org
Cc: Ben Widawsky <ben@bwidawsk.net>,
	intel-vaapi-media@lists.01.org, mesa-dev@lists.freedesktop.org,
	Daniel Vetter <daniel.vetter@intel.com>
Subject: [RFC 2/2] drm/i915: Select engines via class and instance in execbuffer2
Date: Tue, 18 Apr 2017 17:56:15 +0100	[thread overview]
Message-ID: <20170418165615.27666-3-tvrtko.ursulin@linux.intel.com> (raw)
In-Reply-To: <20170418165615.27666-1-tvrtko.ursulin@linux.intel.com>

From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Building on top of the previous patch which exported the concept
of engine classes and instances, we can also use this instead of
the current awkward engine selection uAPI.

This is primarily interesting for the VCS engine selection which
is a) currently done via disjoint set of flags, and b) the
current I915_EXEC_BSD flags has different semantics depending on
the underlying hardware which is bad.

Proposed idea here is to reserve 16-bits of flags, to pass in
the engine class and instance (8 bits each), and a new flag
named I915_EXEC_CLASS_INSTACE to tell the kernel this new engine
selection API is in use.

The new uAPI also removes access to the weak VCS engine
balancing as currently existing in the driver.

Example usage to send a command to VCS0:

  eb.flags = i915_execbuffer2_engine(DRM_I915_ENGINE_CLASS_VIDEO_DECODE, 0);

Or to send a command to VCS1:

  eb.flags = i915_execbuffer2_engine(DRM_I915_ENGINE_CLASS_VIDEO_DECODE, 1);

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Ben Widawsky <ben@bwidawsk.net>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Daniel Vetter <daniel.vetter@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Jon Bloomfield <jon.bloomfield@intel.com>
Cc: Daniel Charles <daniel.charles@intel.com>
Cc: "Rogozhkin, Dmitry V" <dmitry.v.rogozhkin@intel.com>
Cc: Oscar Mateo <oscar.mateo@intel.com>
Cc: "Gong, Zhipeng" <zhipeng.gong@intel.com>
Cc: intel-vaapi-media@lists.01.org
Cc: mesa-dev@lists.freedesktop.org
---
 drivers/gpu/drm/i915/i915_gem_execbuffer.c | 36 ++++++++++++++++++++++++++++++
 include/uapi/drm/i915_drm.h                |  7 +++++-
 2 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index af1965774e7b..7fc92ec839a1 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -1153,6 +1153,10 @@ i915_gem_check_execbuffer(struct drm_i915_gem_execbuffer2 *exec)
 	if (exec->flags & __I915_EXEC_UNKNOWN_FLAGS)
 		return false;
 
+	if ((exec->flags & I915_EXEC_CLASS_INSTANCE) &&
+	    (exec->flags & I915_EXEC_RING_MASK))
+		return false;
+
 	/* Kernel clipping was a DRI1 misfeature */
 	if (exec->num_cliprects || exec->cliprects_ptr)
 		return false;
@@ -1492,6 +1496,35 @@ gen8_dispatch_bsd_engine(struct drm_i915_private *dev_priv,
 	return file_priv->bsd_engine;
 }
 
+extern u8 user_class_map[DRM_I915_ENGINE_CLASS_MAX];
+
+static struct intel_engine_cs *
+eb_select_engine_class_instance(struct drm_i915_private *i915,
+				struct drm_i915_gem_execbuffer2 *args)
+{
+	struct intel_engine_cs *engine;
+	enum intel_engine_id id;
+	u16 class_instance;
+	u8 user_class, class, instance;
+
+	class_instance = (args->flags & I915_EXEC_CLASS_INSTANCE_MASK) >>
+			 I915_EXEC_CLASS_INSTANCE_SHIFT;
+
+	user_class = class_instance >> 8;
+	instance = class_instance & 0xff;
+
+	if (user_class >= DRM_I915_ENGINE_CLASS_MAX)
+		return NULL;
+	class = user_class_map[user_class];
+
+	for_each_engine(engine, i915, id) {
+		if (engine->class == class && engine->instance == instance)
+			return engine;
+	}
+
+	return NULL;
+}
+
 #define I915_USER_RINGS (4)
 
 static const enum intel_engine_id user_ring_map[I915_USER_RINGS + 1] = {
@@ -1510,6 +1543,9 @@ eb_select_engine(struct drm_i915_private *dev_priv,
 	unsigned int user_ring_id = args->flags & I915_EXEC_RING_MASK;
 	struct intel_engine_cs *engine;
 
+	if (args->flags & I915_EXEC_CLASS_INSTANCE)
+		return eb_select_engine_class_instance(dev_priv, args);
+
 	if (user_ring_id > I915_USER_RINGS) {
 		DRM_DEBUG("execbuf with unknown ring: %u\n", user_ring_id);
 		return NULL;
diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h
index 6058596a9f33..727a6dc4b029 100644
--- a/include/uapi/drm/i915_drm.h
+++ b/include/uapi/drm/i915_drm.h
@@ -906,7 +906,12 @@ struct drm_i915_gem_execbuffer2 {
  */
 #define I915_EXEC_FENCE_OUT		(1<<17)
 
-#define __I915_EXEC_UNKNOWN_FLAGS (-(I915_EXEC_FENCE_OUT<<1))
+#define I915_EXEC_CLASS_INSTANCE	(1<<18)
+
+#define I915_EXEC_CLASS_INSTANCE_SHIFT	(19)
+#define I915_EXEC_CLASS_INSTANCE_MASK	(0xffff << I915_EXEC_CLASS_INSTANCE_SHIFT)
+
+#define __I915_EXEC_UNKNOWN_FLAGS (-(35 << 1))
 
 #define I915_EXEC_CONTEXT_ID_MASK	(0xffffffff)
 #define i915_execbuffer2_set_context_id(eb2, context) \
-- 
2.9.3

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  parent reply	other threads:[~2017-04-18 16:56 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-18 16:56 [RFC 0/2] New engine discovery and execbuffer2 engine selection uAPI Tvrtko Ursulin
2017-04-18 16:56 ` [RFC 1/2] drm/i915: Engine discovery uAPI Tvrtko Ursulin
2017-04-18 20:13   ` Chris Wilson
2017-04-24  8:07     ` Tvrtko Ursulin
2017-04-19  5:22   ` Kenneth Graunke
2017-04-24  8:26     ` [Mesa-dev] " Tvrtko Ursulin
2017-04-19  8:32   ` Gong, Zhipeng
2017-04-27  9:10   ` [RFC v2 " Tvrtko Ursulin
2017-05-18 14:57     ` [RFC v3 " Tvrtko Ursulin
2017-06-26 15:47       ` [RFC v4 " Tvrtko Ursulin
2017-06-28 11:27         ` Chris Wilson
2017-06-28 13:15           ` Tvrtko Ursulin
2017-06-28 13:19             ` Tvrtko Ursulin
2017-06-28 13:21             ` Chris Wilson
2017-06-28 11:33         ` Chris Wilson
2017-06-28 15:30         ` [RFC v5 " Tvrtko Ursulin
2017-04-18 16:56 ` Tvrtko Ursulin [this message]
2017-04-18 21:10   ` [RFC 2/2] drm/i915: Select engines via class and instance in execbuffer2 Chris Wilson
2017-04-24  8:36     ` Tvrtko Ursulin
2017-04-27  9:10   ` [RFC v2 " Tvrtko Ursulin
2017-04-27  9:25     ` Chris Wilson
2017-04-27 10:09       ` Tvrtko Ursulin
2017-04-27 10:26         ` Chris Wilson
2017-05-17 15:40       ` [RFC v3] " Tvrtko Ursulin
2017-05-17 16:44         ` Chris Wilson
2017-05-18 13:30           ` Tvrtko Ursulin
2017-05-18 13:50             ` [Intel-gfx] " Chris Wilson
2017-05-18 10:55         ` Joonas Lahtinen
2017-05-18 11:10           ` Chris Wilson
2017-05-18 12:13             ` Tvrtko Ursulin
2017-05-18 12:24               ` Chris Wilson
2017-05-18 13:06                 ` Tvrtko Ursulin
2017-05-18 13:37                   ` Chris Wilson
2017-05-18 16:20                     ` Tvrtko Ursulin
2017-05-18 17:00                       ` [Intel-gfx] " Chris Wilson
2017-05-24 11:28                         ` Tvrtko Ursulin
2017-05-25 14:14                           ` [Intel-gfx] " Chris Wilson
2017-06-15  8:08                             ` Tvrtko Ursulin
2017-05-18 14:10                   ` [Intel-gfx] " Emil Velikov
2017-05-18 14:55                     ` Tvrtko Ursulin
2017-05-18 14:58         ` [RFC v4 2/2] " Tvrtko Ursulin
2017-05-18 15:13           ` Chris Wilson
2017-06-26 15:48           ` [RFC v6 " Tvrtko Ursulin
2017-04-18 17:12 ` ✗ Fi.CI.BAT: failure for New engine discovery and execbuffer2 engine selection uAPI Patchwork
2017-04-27 10:16 ` ✓ Fi.CI.BAT: success for New engine discovery and execbuffer2 engine selection uAPI (rev3) Patchwork
2017-05-18 17:11 ` ✓ Fi.CI.BAT: success for New engine discovery and execbuffer2 engine selection uAPI (rev6) Patchwork
2017-06-26 16:04 ` ✓ Fi.CI.BAT: success for New engine discovery and execbuffer2 engine selection uAPI (rev8) Patchwork
2017-06-28 15:47 ` ✗ Fi.CI.BAT: failure for New engine discovery and execbuffer2 engine selection uAPI (rev9) Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170418165615.27666-3-tvrtko.ursulin@linux.intel.com \
    --to=tursulin@ursulin.net \
    --cc=Intel-gfx@lists.freedesktop.org \
    --cc=ben@bwidawsk.net \
    --cc=daniel.vetter@intel.com \
    --cc=intel-vaapi-media@lists.01.org \
    --cc=mesa-dev@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.