@@ -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)
@@ -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 */
};
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.landwerlin@intel.com> --- drivers/gpu/drm/i915/i915_perf.c | 51 ++++++++++++++++++++++++++++++-- include/uapi/drm/i915_drm.h | 21 +++++++++++++ 2 files changed, 69 insertions(+), 3 deletions(-)