Commit 9a61363a authored by Lionel Landwerlin's avatar Lionel Landwerlin Committed by Chris Wilson

drm/i915/perf: store the associated engine of a stream

We'll use this information later to verify that a client trying to
reconfigure the stream does so on the right engine. For now, we want to
pull the knowledge of which engine we use into a central property.
Signed-off-by: default avatarLionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20191010150520.26488-1-chris@chris-wilson.co.uk
parent 3a612765
...@@ -197,6 +197,7 @@ ...@@ -197,6 +197,7 @@
#include "gem/i915_gem_context.h" #include "gem/i915_gem_context.h"
#include "gem/i915_gem_pm.h" #include "gem/i915_gem_pm.h"
#include "gt/intel_engine_user.h"
#include "gt/intel_lrc_reg.h" #include "gt/intel_lrc_reg.h"
#include "i915_drv.h" #include "i915_drv.h"
...@@ -347,6 +348,7 @@ static const struct i915_oa_format gen8_plus_oa_formats[I915_OA_FORMAT_MAX] = { ...@@ -347,6 +348,7 @@ static const struct i915_oa_format gen8_plus_oa_formats[I915_OA_FORMAT_MAX] = {
* @oa_format: An OA unit HW report format * @oa_format: An OA unit HW report format
* @oa_periodic: Whether to enable periodic OA unit sampling * @oa_periodic: Whether to enable periodic OA unit sampling
* @oa_period_exponent: The OA unit sampling period is derived from this * @oa_period_exponent: The OA unit sampling period is derived from this
* @engine: The engine (typically rcs0) being monitored by the OA unit
* *
* As read_properties_unlocked() enumerates and validates the properties given * As read_properties_unlocked() enumerates and validates the properties given
* to open a stream of metrics the configuration is built up in the structure * to open a stream of metrics the configuration is built up in the structure
...@@ -363,6 +365,8 @@ struct perf_open_properties { ...@@ -363,6 +365,8 @@ struct perf_open_properties {
int oa_format; int oa_format;
bool oa_periodic; bool oa_periodic;
int oa_period_exponent; int oa_period_exponent;
struct intel_engine_cs *engine;
}; };
static enum hrtimer_restart oa_poll_check_timer_cb(struct hrtimer *hrtimer); static enum hrtimer_restart oa_poll_check_timer_cb(struct hrtimer *hrtimer);
...@@ -1205,7 +1209,7 @@ static struct intel_context *oa_pin_context(struct i915_perf_stream *stream) ...@@ -1205,7 +1209,7 @@ static struct intel_context *oa_pin_context(struct i915_perf_stream *stream)
int err; int err;
for_each_gem_engine(ce, i915_gem_context_lock_engines(ctx), it) { for_each_gem_engine(ce, i915_gem_context_lock_engines(ctx), it) {
if (ce->engine->class != RENDER_CLASS) if (ce->engine != stream->engine) /* first match! */
continue; continue;
/* /*
...@@ -2127,7 +2131,13 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream, ...@@ -2127,7 +2131,13 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream,
int format_size; int format_size;
int ret; int ret;
/* If the sysfs metrics/ directory wasn't registered for some if (!props->engine) {
DRM_DEBUG("OA engine not specified\n");
return -EINVAL;
}
/*
* If the sysfs metrics/ directory wasn't registered for some
* reason then don't let userspace try their luck with config * reason then don't let userspace try their luck with config
* IDs * IDs
*/ */
...@@ -2146,7 +2156,8 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream, ...@@ -2146,7 +2156,8 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream,
return -ENODEV; return -ENODEV;
} }
/* To avoid the complexity of having to accurately filter /*
* To avoid the complexity of having to accurately filter
* counter reports and marshal to the appropriate client * counter reports and marshal to the appropriate client
* we currently only allow exclusive access * we currently only allow exclusive access
*/ */
...@@ -2160,6 +2171,9 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream, ...@@ -2160,6 +2171,9 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream,
return -EINVAL; return -EINVAL;
} }
stream->engine = props->engine;
stream->gt = stream->engine->gt;
stream->sample_size = sizeof(struct drm_i915_perf_record_header); stream->sample_size = sizeof(struct drm_i915_perf_record_header);
format_size = perf->oa_formats[props->oa_format].size; format_size = perf->oa_formats[props->oa_format].size;
...@@ -2711,7 +2725,6 @@ i915_perf_open_ioctl_locked(struct i915_perf *perf, ...@@ -2711,7 +2725,6 @@ i915_perf_open_ioctl_locked(struct i915_perf *perf,
} }
stream->perf = perf; stream->perf = perf;
stream->gt = &perf->i915->gt;
stream->ctx = specific_ctx; stream->ctx = specific_ctx;
ret = i915_oa_stream_init(stream, param, props); ret = i915_oa_stream_init(stream, param, props);
...@@ -2796,6 +2809,15 @@ static int read_properties_unlocked(struct i915_perf *perf, ...@@ -2796,6 +2809,15 @@ static int read_properties_unlocked(struct i915_perf *perf,
return -EINVAL; return -EINVAL;
} }
/* At the moment we only support using i915-perf on the RCS. */
props->engine = intel_engine_lookup_user(perf->i915,
I915_ENGINE_CLASS_RENDER,
0);
if (!props->engine) {
DRM_DEBUG("No RENDER-capable engines\n");
return -EINVAL;
}
/* Considering that ID = 0 is reserved and assuming that we don't /* Considering that ID = 0 is reserved and assuming that we don't
* (currently) expect any configurations to ever specify duplicate * (currently) expect any configurations to ever specify duplicate
* values for a particular property ID then the last _PROP_MAX value is * values for a particular property ID then the last _PROP_MAX value is
......
...@@ -140,6 +140,11 @@ struct i915_perf_stream { ...@@ -140,6 +140,11 @@ struct i915_perf_stream {
*/ */
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
/**
* @engine: Engine associated with this performance stream.
*/
struct intel_engine_cs *engine;
/** /**
* @sample_flags: Flags representing the `DRM_I915_PERF_PROP_SAMPLE_*` * @sample_flags: Flags representing the `DRM_I915_PERF_PROP_SAMPLE_*`
* properties given when opening a stream, representing the contents * properties given when opening a stream, representing the contents
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment