Add 2 new properties to the i915-perf open ioctl to specify an arry of
GEM context handles as well as the length of the array.

Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@intel.com>
---
 drivers/gpu/drm/i915/i915_perf.c | 51 ++++++++++++++++++++++++++++++--
 include/uapi/drm/i915_drm.h      | 21 +++++++++++++
 2 files changed, 69 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 74f59c5f60e4..887bd0c4d8e6 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -3686,7 +3686,8 @@ static int read_properties_unlocked(struct i915_perf 
*perf,
                                    struct perf_open_properties *props)
 {
        u64 __user *uprop = uprops;
-       u32 i;
+       u32 __user *uctx_handles = NULL;
+       u32 i, n_uctx_handles = 0;
        int ret;
 
        memset(props, 0, sizeof(struct perf_open_properties));
@@ -3735,7 +3736,7 @@ static int read_properties_unlocked(struct i915_perf 
*perf,
 
                switch ((enum drm_i915_perf_property_id)id) {
                case DRM_I915_PERF_PROP_CTX_HANDLE:
-                       if (props->n_ctx_handles > 0) {
+                       if (props->n_ctx_handles > 0 || n_uctx_handles > 0) {
                                DRM_DEBUG("Context handle specified multiple 
times\n");
                                return -EINVAL;
                        }
@@ -3826,6 +3827,32 @@ static int read_properties_unlocked(struct i915_perf 
*perf,
                        props->has_sseu = true;
                        break;
                }
+               case DRM_I915_PERF_PROP_CTX_HANDLE_ARRAY: {
+                       /* HSW can only filter in HW and only on a single
+                        * context.
+                        */
+                       if (IS_HASWELL(perf->i915)) {
+                               DRM_DEBUG("Multi context filter not supported 
on HSW\n");
+                               return -ENODEV;
+                       }
+                       uctx_handles = u64_to_user_ptr(value);
+                       break;
+               }
+               case DRM_I915_PERF_PROP_CTX_HANDLE_ARRAY_LENGTH:
+                       if (IS_HASWELL(perf->i915)) {
+                               DRM_DEBUG("Multi context filter not supported 
on HSW\n");
+                               return -ENODEV;
+                       }
+                       if (value > I915_PERF_MAX_FILTER_CONTEXTS) {
+                               DRM_DEBUG("Out of range context handle array 
length\n");
+                               return -EINVAL;
+                       }
+                       if (props->n_ctx_handles > 0 || n_uctx_handles > 0) {
+                               DRM_DEBUG("Context handle specified multiple 
times\n");
+                               return -EINVAL;
+                       }
+                       n_uctx_handles = value;
+                       break;
                case DRM_I915_PERF_PROP_MAX:
                        MISSING_CASE(id);
                        return -EINVAL;
@@ -3834,6 +3861,20 @@ static int read_properties_unlocked(struct i915_perf 
*perf,
                uprop += 2;
        }
 
+       if (n_uctx_handles > 0 && props->n_ctx_handles > 0) {
+               DRM_DEBUG("Context handle specified multiple times\n");
+               return -EINVAL;
+       }
+
+       for (i = 0; i < n_uctx_handles; i++) {
+               ret = get_user(props->ctx_handles[i], uctx_handles);
+               if (ret)
+                       return ret;
+
+               uctx_handles++;
+               props->n_ctx_handles++;
+       }
+
        return 0;
 }
 
@@ -4603,8 +4644,12 @@ int i915_perf_ioctl_version(void)
         * 4: Add DRM_I915_PERF_PROP_ALLOWED_SSEU to limit what contexts can
         *    be run for the duration of the performance recording based on
         *    their SSEU configuration.
+        *
+        * 5: Add DRM_I915_PERF_PROP_CTX_HANDLE_ARRAY &
+        *    DRM_I915_PERF_PROP_CTX_HANDLE_ARRAY_LENGTH to allow an
+        *    application monitor/pin multiple contexts.
         */
-       return 4;
+       return 5;
 }
 
 #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h
index db649d03ab52..02edd2e3ae84 100644
--- a/include/uapi/drm/i915_drm.h
+++ b/include/uapi/drm/i915_drm.h
@@ -1980,6 +1980,27 @@ enum drm_i915_perf_property_id {
         */
        DRM_I915_PERF_PROP_GLOBAL_SSEU,
 
+       /**
+        * Specifies an array of u32 GEM context handles to filter reports
+        * with.
+        *
+        * Using this parameter is incompatible with using
+        * DRM_I915_PERF_PROP_CTX_HANDLE.
+        *
+        * This property is available in perf revision 5.
+        */
+       DRM_I915_PERF_PROP_CTX_HANDLE_ARRAY,
+
+       /**
+        * Specifies the length of the array specified with
+        * DRM_I915_PERF_PROP_CTX_HANDLE_ARRAY.
+        *
+        * The length must be in the range [1, 4].
+        *
+        * This property is available in perf revision 5.
+        */
+       DRM_I915_PERF_PROP_CTX_HANDLE_ARRAY_LENGTH,
+
        DRM_I915_PERF_PROP_MAX /* non-ABI */
 };
 
-- 
2.26.0

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

Reply via email to