Allow the user to specify a local engine index (as opposed to
class:index) that they can use to refer to a preset engine inside the
ctx->engine[] array defined by an earlier I915_CONTEXT_PARAM_ENGINES.
This will be useful for setting SSEU parameters on virtual engines that
are local to the context and do not have a valid global class:instance
lookup.

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursu...@intel.com>
---
 drivers/gpu/drm/i915/i915_gem_context.c | 24 ++++++++++++++++++++----
 include/uapi/drm/i915_drm.h             |  3 ++-
 2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem_context.c 
b/drivers/gpu/drm/i915/i915_gem_context.c
index 85067a3dc72c..d04fa649bc0e 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -1341,6 +1341,7 @@ static int set_sseu(struct i915_gem_context *ctx,
        struct drm_i915_gem_context_param_sseu user_sseu;
        struct intel_engine_cs *engine;
        struct intel_sseu sseu;
+       unsigned long lookup;
        int ret;
 
        if (args->size < sizeof(user_sseu))
@@ -1353,10 +1354,17 @@ static int set_sseu(struct i915_gem_context *ctx,
                           sizeof(user_sseu)))
                return -EFAULT;
 
-       if (user_sseu.flags || user_sseu.rsvd)
+       if (user_sseu.rsvd)
                return -EINVAL;
 
-       engine = lookup_user_engine(ctx, 0,
+       if (user_sseu.flags & ~(I915_CONTEXT_SSEU_FLAG_ENGINE_INDEX))
+               return -EINVAL;
+
+       lookup = 0;
+       if (user_sseu.flags & I915_CONTEXT_SSEU_FLAG_ENGINE_INDEX)
+               lookup |= LOOKUP_USER_INDEX;
+
+       engine = lookup_user_engine(ctx, lookup,
                                    user_sseu.engine_class,
                                    user_sseu.engine_instance);
        if (!engine)
@@ -1802,6 +1810,7 @@ static int get_sseu(struct i915_gem_context *ctx,
        struct drm_i915_gem_context_param_sseu user_sseu;
        struct intel_engine_cs *engine;
        struct intel_context *ce;
+       unsigned long lookup;
        int ret;
 
        if (args->size == 0)
@@ -1813,10 +1822,17 @@ static int get_sseu(struct i915_gem_context *ctx,
                           sizeof(user_sseu)))
                return -EFAULT;
 
-       if (user_sseu.flags || user_sseu.rsvd)
+       if (user_sseu.rsvd)
                return -EINVAL;
 
-       engine = lookup_user_engine(ctx, 0,
+       if (user_sseu.flags & ~(I915_CONTEXT_SSEU_FLAG_ENGINE_INDEX))
+               return -EINVAL;
+
+       lookup = 0;
+       if (user_sseu.flags & I915_CONTEXT_SSEU_FLAG_ENGINE_INDEX)
+               lookup |= LOOKUP_USER_INDEX;
+
+       engine = lookup_user_engine(ctx, lookup,
                                    user_sseu.engine_class,
                                    user_sseu.engine_instance);
        if (!engine)
diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h
index 85ccba4f04e8..b68e1ad12c0f 100644
--- a/include/uapi/drm/i915_drm.h
+++ b/include/uapi/drm/i915_drm.h
@@ -1565,9 +1565,10 @@ struct drm_i915_gem_context_param_sseu {
        __u16 engine_instance;
 
        /*
-        * Unused for now. Must be cleared to zero.
+        * Unknown flags must be cleared to zero.
         */
        __u32 flags;
+#define I915_CONTEXT_SSEU_FLAG_ENGINE_INDEX (1u << 0)
 
        /*
         * Mask of slices to enable for the context. Valid values are a subset
-- 
2.20.1

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

Reply via email to