From d3724de8948dee4c6cffc270ca89382fa39bbf9e Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Tue, 23 Nov 2021 00:44:06 +0200 Subject: [PATCH] intel/dev,perf: Use a single timescale function Signed-off-by: Lionel Landwerlin Reviewed-by: Rohan Garg Acked-by: Antonio Caggiano Part-of: --- src/intel/dev/intel_device_info.h | 7 ++++++- src/intel/ds/intel_pps_driver.cc | 11 +++++------ src/intel/perf/intel_perf.c | 11 ----------- src/intel/perf/intel_perf.h | 5 ----- 4 files changed, 11 insertions(+), 23 deletions(-) diff --git a/src/intel/dev/intel_device_info.h b/src/intel/dev/intel_device_info.h index 89c662e956a..3d9154a3de7 100644 --- a/src/intel/dev/intel_device_info.h +++ b/src/intel/dev/intel_device_info.h @@ -448,7 +448,12 @@ static inline uint64_t intel_device_info_timebase_scale(const struct intel_device_info *devinfo, uint64_t gpu_timestamp) { - return (1000000000ull * gpu_timestamp) / devinfo->timestamp_frequency; + /* Try to avoid going over the 64bits when doing the scaling */ + uint64_t upper_ts = gpu_timestamp >> 32; + uint64_t lower_ts = gpu_timestamp & 0xffffffff; + uint64_t upper_scaled_ts = upper_ts * 1000000000ull / devinfo->timestamp_frequency; + uint64_t lower_scaled_ts = lower_ts * 1000000000ull / devinfo->timestamp_frequency; + return (upper_scaled_ts << 32) + lower_scaled_ts; } bool intel_get_device_info_from_fd(int fh, struct intel_device_info *devinfo); diff --git a/src/intel/ds/intel_pps_driver.cc b/src/intel/ds/intel_pps_driver.cc index 8a9788b7a6b..c0cbec8f134 100644 --- a/src/intel/ds/intel_pps_driver.cc +++ b/src/intel/ds/intel_pps_driver.cc @@ -223,8 +223,8 @@ std::vector IntelDriver::parse_perf_records(const std::vectordevinfo, - gpu_timestamp - prev_gpu_timestamp); + auto duration = intel_device_info_timebase_scale(&perf->devinfo, + gpu_timestamp - prev_gpu_timestamp); // Skip perf-records that are too short by checking // the distance between last report and this one @@ -318,8 +318,7 @@ uint64_t IntelDriver::gpu_next() // Consume first record records.erase(std::begin(records), std::begin(records) + 1); - return intel_perf_scale_gpu_timestamp(&perf->devinfo, - gpu_timestamp); + return intel_device_info_timebase_scale(&perf->devinfo, gpu_timestamp); } uint64_t IntelDriver::next() @@ -336,8 +335,8 @@ uint32_t IntelDriver::gpu_clock_id() const uint64_t IntelDriver::gpu_timestamp() const { - return intel_perf_scale_gpu_timestamp(&perf->devinfo, - read_gpu_timestamp(drm_device.fd)); + return intel_device_info_timebase_scale(&perf->devinfo, + read_gpu_timestamp(drm_device.fd)); } } // namespace pps diff --git a/src/intel/perf/intel_perf.c b/src/intel/perf/intel_perf.c index b96e187c8bd..f750e673fd3 100644 --- a/src/intel/perf/intel_perf.c +++ b/src/intel/perf/intel_perf.c @@ -1027,17 +1027,6 @@ can_use_mi_rpc_bc_counters(const struct intel_device_info *devinfo) return devinfo->ver <= 11; } -uint64_t intel_perf_scale_gpu_timestamp(const struct intel_device_info *devinfo, - uint64_t ts) -{ - // Try to avoid going over the 64bits when doing the scaling - uint64_t lower_ts = ts >> 6; - uint64_t scaled_ts = lower_ts * 1000000000ull / devinfo->timestamp_frequency; - scaled_ts <<= 6; - scaled_ts += (ts & 0x3f) * 1000000000ull / devinfo->timestamp_frequency; - return scaled_ts; -} - uint64_t intel_perf_report_timestamp(const struct intel_perf_query_info *query, const uint32_t *report) diff --git a/src/intel/perf/intel_perf.h b/src/intel/perf/intel_perf.h index 8894a29b9c2..83bd15c2611 100644 --- a/src/intel/perf/intel_perf.h +++ b/src/intel/perf/intel_perf.h @@ -464,11 +464,6 @@ void intel_perf_query_result_accumulate(struct intel_perf_query_result *result, uint64_t intel_perf_report_timestamp(const struct intel_perf_query_info *query, const uint32_t *report); -/** Turn a GPU timestamp into a nanosecond value. - */ -uint64_t intel_perf_scale_gpu_timestamp(const struct intel_device_info *devinfo, - uint64_t ts); - /** Accumulate the delta between 2 snapshots of OA perf registers (layout * should match description specified through intel_perf_query_register_layout). */