[Intel-gfx] [PATCH 01/11] drm/i915/perf: Disable rc6 only while OA is enabled
Lionel Landwerlin
lionel.g.landwerlin at intel.com
Wed Oct 9 20:46:56 UTC 2019
Hmm... nope, sorry.
We'll loose NOA configuration if you do that.
And you'll have to rerun the oa config BO prior to enabling.
-Lionel
On 09/10/2019 23:36, Chris Wilson wrote:
> Move rpm_get and forcewake_get into the perf enable (and corresponding
> the puts into the disable) so that we only prevent powermaangement while
> we OA is engaged.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/i915_perf.c | 49 ++++++++++++--------------
> drivers/gpu/drm/i915/i915_perf_types.h | 12 +++----
> 2 files changed, 26 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
> index 5a34cad7d824..6fa5c9dc38d3 100644
> --- a/drivers/gpu/drm/i915/i915_perf.c
> +++ b/drivers/gpu/drm/i915/i915_perf.c
> @@ -1348,9 +1348,6 @@ static void i915_oa_stream_destroy(struct i915_perf_stream *stream)
>
> free_oa_buffer(stream);
>
> - intel_uncore_forcewake_put(stream->gt->uncore, FORCEWAKE_ALL);
> - intel_runtime_pm_put(stream->gt->uncore->rpm, stream->wakeref);
> -
> if (stream->ctx)
> oa_put_render_ctx_id(stream);
>
> @@ -2192,21 +2189,6 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream,
> goto err_config;
> }
>
> - /* PRM - observability performance counters:
> - *
> - * OACONTROL, performance counter enable, note:
> - *
> - * "When this bit is set, in order to have coherent counts,
> - * RC6 power state and trunk clock gating must be disabled.
> - * This can be achieved by programming MMIO registers as
> - * 0xA094=0 and 0xA090[31]=1"
> - *
> - * In our case we are expecting that taking pm + FORCEWAKE
> - * references will effectively disable RC6.
> - */
> - stream->wakeref = intel_runtime_pm_get(stream->gt->uncore->rpm);
> - intel_uncore_forcewake_get(stream->gt->uncore, FORCEWAKE_ALL);
> -
> ret = alloc_oa_buffer(stream);
> if (ret)
> goto err_oa_buf_alloc;
> @@ -2237,9 +2219,6 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream,
> err_oa_buf_alloc:
> put_oa_config(stream->oa_config);
>
> - intel_uncore_forcewake_put(stream->gt->uncore, FORCEWAKE_ALL);
> - intel_runtime_pm_put(stream->gt->uncore->rpm, stream->wakeref);
> -
> err_config:
> if (stream->ctx)
> oa_put_render_ctx_id(stream);
> @@ -2473,8 +2452,21 @@ static void i915_perf_enable_locked(struct i915_perf_stream *stream)
> if (stream->enabled)
> return;
>
> - /* Allow stream->ops->enable() to refer to this */
> - stream->enabled = true;
> + /*
> + * PRM - observability performance counters:
> + *
> + * OACONTROL, performance counter enable, note:
> + *
> + * "When this bit is set, in order to have coherent counts,
> + * RC6 power state and trunk clock gating must be disabled.
> + * This can be achieved by programming MMIO registers as
> + * 0xA094=0 and 0xA090[31]=1"
> + *
> + * In our case we are expecting that taking pm + FORCEWAKE
> + * references will effectively disable RC6.
> + */
> + stream->enabled = intel_runtime_pm_get(stream->gt->uncore->rpm);
> + intel_uncore_forcewake_get(stream->gt->uncore, FORCEWAKE_ALL);
>
> if (stream->ops->enable)
> stream->ops->enable(stream);
> @@ -2496,14 +2488,17 @@ static void i915_perf_enable_locked(struct i915_perf_stream *stream)
> */
> static void i915_perf_disable_locked(struct i915_perf_stream *stream)
> {
> - if (!stream->enabled)
> - return;
> + intel_wakeref_t wakeref;
>
> - /* Allow stream->ops->disable() to refer to this */
> - stream->enabled = false;
> + wakeref = fetch_and_zero(&stream->enabled);
> + if (!wakeref)
> + return;
>
> if (stream->ops->disable)
> stream->ops->disable(stream);
> +
> + intel_uncore_forcewake_put(stream->gt->uncore, FORCEWAKE_ALL);
> + intel_runtime_pm_put(stream->gt->uncore->rpm, wakeref);
> }
>
> /**
> diff --git a/drivers/gpu/drm/i915/i915_perf_types.h b/drivers/gpu/drm/i915/i915_perf_types.h
> index 2d17059d32ee..edfd64732704 100644
> --- a/drivers/gpu/drm/i915/i915_perf_types.h
> +++ b/drivers/gpu/drm/i915/i915_perf_types.h
> @@ -137,8 +137,11 @@ struct i915_perf_stream {
> /**
> * @wakeref: As we keep the device awake while the perf stream is
> * active, we track our runtime pm reference for later release.
> + * Also indicates whether the stream is currently enabled, considering
> + * whether the stream was opened in a disabled state and based
> + * on `I915_PERF_IOCTL_ENABLE` and `I915_PERF_IOCTL_DISABLE` calls.
> */
> - intel_wakeref_t wakeref;
> + intel_wakeref_t enabled;
>
> /**
> * @sample_flags: Flags representing the `DRM_I915_PERF_PROP_SAMPLE_*`
> @@ -160,13 +163,6 @@ struct i915_perf_stream {
> */
> struct i915_gem_context *ctx;
>
> - /**
> - * @enabled: Whether the stream is currently enabled, considering
> - * whether the stream was opened in a disabled state and based
> - * on `I915_PERF_IOCTL_ENABLE` and `I915_PERF_IOCTL_DISABLE` calls.
> - */
> - bool enabled;
> -
> /**
> * @ops: The callbacks providing the implementation of this specific
> * type of configured stream.
More information about the Intel-gfx
mailing list