[igt-dev] [PATCH i-g-t v6 23/36] tools/i915-perf-recorder: capture OA & CS frequencies
Umesh Nerlige Ramappa
umesh.nerlige.ramappa at intel.com
Mon Oct 10 22:54:11 UTC 2022
On Mon, Oct 10, 2022 at 09:42:02PM +0000, Umesh Nerlige Ramappa wrote:
>From: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
>
>CS & OA timestamp don't have the same accuracy, so we need to adjuste
>the correlated timestamps (capture from the CS unit) in the recording
>to fit the data in the OA reports.
>
>Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
lgtm,
Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa at intel.com>
>---
> tools/i915-perf/i915_perf_recorder.c | 43 ++++++++++++++++++++++++----
> 1 file changed, 38 insertions(+), 5 deletions(-)
>
>diff --git a/tools/i915-perf/i915_perf_recorder.c b/tools/i915-perf/i915_perf_recorder.c
>index 7ced7b40..72011c87 100644
>--- a/tools/i915-perf/i915_perf_recorder.c
>+++ b/tools/i915-perf/i915_perf_recorder.c
>@@ -328,7 +328,7 @@ perf_ioctl(int fd, unsigned long request, void *arg)
> }
>
> static uint64_t
>-get_device_timestamp_frequency(const struct intel_device_info *devinfo, int drm_fd)
>+get_device_cs_timestamp_frequency(const struct intel_device_info *devinfo, int drm_fd)
> {
> drm_i915_getparam_t gp;
> int timestamp_frequency;
>@@ -352,12 +352,44 @@ get_device_timestamp_frequency(const struct intel_device_info *devinfo, int drm_
> return 12000000;
> }
>
>+static uint64_t
>+get_device_oa_timestamp_frequency(const struct intel_device_info *devinfo, int drm_fd)
>+{
>+ drm_i915_getparam_t gp;
>+ int timestamp_frequency;
>+
>+ gp.param = I915_PARAM_OA_TIMESTAMP_FREQUENCY;
>+ gp.value = ×tamp_frequency;
>+ if (perf_ioctl(drm_fd, DRM_IOCTL_I915_GETPARAM, &gp) == 0)
>+ return timestamp_frequency;
>+
>+ gp.param = I915_PARAM_CS_TIMESTAMP_FREQUENCY;
>+ gp.value = ×tamp_frequency;
>+ if (perf_ioctl(drm_fd, DRM_IOCTL_I915_GETPARAM, &gp) == 0)
>+ return timestamp_frequency;
>+
>+
>+ if (devinfo->graphics_ver > 9) {
>+ fprintf(stderr, "Unable to query timestamp frequency from i915, please update kernel.\n");
>+ return 0;
>+ }
>+
>+ fprintf(stderr, "Warning: unable to query timestamp frequency from i915, guessing values...\n");
>+
>+ if (devinfo->graphics_ver <= 8)
>+ return 12500000;
>+ if (devinfo->is_broxton)
>+ return 19200000;
>+ return 12000000;
>+}
>+
> struct recording_context {
> int drm_fd;
> int perf_fd;
>
> uint32_t devid;
>- uint64_t timestamp_frequency;
>+ uint64_t oa_timestamp_frequency;
>+ uint64_t cs_timestamp_frequency;
>
> const struct intel_device_info *devinfo;
>
>@@ -459,7 +491,7 @@ static bool
> write_header(FILE *output, struct recording_context *ctx)
> {
> struct intel_perf_record_device_info info = {
>- .timestamp_frequency = ctx->timestamp_frequency,
>+ .timestamp_frequency = ctx->oa_timestamp_frequency,
> .device_id = ctx->perf->devinfo.devid,
> .device_revision = ctx->perf->devinfo.revision,
> .gt_min_frequency = ctx->perf->devinfo.gt_min_freq,
>@@ -964,7 +996,8 @@ main(int argc, char *argv[])
>
> intel_perf_load_perf_configs(ctx.perf, ctx.drm_fd);
>
>- ctx.timestamp_frequency = get_device_timestamp_frequency(ctx.devinfo, ctx.drm_fd);
>+ ctx.oa_timestamp_frequency = get_device_oa_timestamp_frequency(ctx.devinfo, ctx.drm_fd);
>+ ctx.cs_timestamp_frequency = get_device_cs_timestamp_frequency(ctx.devinfo, ctx.drm_fd);
>
> signal(SIGINT, sigint_handler);
>
>@@ -1036,7 +1069,7 @@ main(int argc, char *argv[])
> goto fail;
> }
>
>- ctx.oa_exponent = oa_exponent_for_period(ctx.timestamp_frequency, perf_period);
>+ ctx.oa_exponent = oa_exponent_for_period(ctx.oa_timestamp_frequency, perf_period);
> fprintf(stdout, "Opening perf stream with metric_id=%"PRIu64" oa_exponent=%u oa_format=%u\n",
> ctx.metric_set->perf_oa_metrics_set, ctx.oa_exponent,
> ctx.metric_set->perf_oa_format);
>--
>2.25.1
>
More information about the igt-dev
mailing list