Mesa (main): ac/rgp: add support for clock calibration

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Nov 9 11:01:47 UTC 2021


Module: Mesa
Branch: main
Commit: 1ee85e8babe94e8cd80b2aa7b62170f0a3e264be
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=1ee85e8babe94e8cd80b2aa7b62170f0a3e264be

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Mon Nov  8 14:28:33 2021 +0100

ac/rgp: add support for clock calibration

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13709>

---

 src/amd/common/ac_rgp.c  | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 src/amd/common/ac_rgp.h  | 12 ++++++++++++
 src/amd/common/ac_sqtt.h |  2 ++
 3 files changed, 60 insertions(+)

diff --git a/src/amd/common/ac_rgp.c b/src/amd/common/ac_rgp.c
index 4e06b2d44bf..85fbff0f837 100644
--- a/src/amd/common/ac_rgp.c
+++ b/src/amd/common/ac_rgp.c
@@ -841,6 +841,30 @@ ac_sqtt_fill_queue_event_timings(struct rgp_queue_info *rgp_queue_info,
    chunk->queue_event_table_size = queue_event_size;
 }
 
+/**
+ * SQTT clock calibration info.
+ */
+struct sqtt_file_chunk_clock_calibration {
+   struct sqtt_file_chunk_header header;
+   uint64_t cpu_timestamp;
+   uint64_t gpu_timestamp;
+   uint64_t reserved;
+};
+
+static_assert(sizeof(struct sqtt_file_chunk_clock_calibration) == 40,
+	      "sqtt_file_chunk_clock_calibration doesn't match RGP spec");
+
+static void
+ac_sqtt_fill_clock_calibration(struct sqtt_file_chunk_clock_calibration *chunk,
+                               int32_t chunk_index)
+{
+   chunk->header.chunk_id.type = SQTT_FILE_CHUNK_TYPE_CLOCK_CALIBRATION;
+   chunk->header.chunk_id.index = chunk_index;
+   chunk->header.major_version = 0;
+   chunk->header.minor_version = 0;
+   chunk->header.size_in_bytes = sizeof(*chunk);
+}
+
 /* Below values are from from llvm project
  * llvm/include/llvm/BinaryFormat/ELF.h
  */
@@ -886,6 +910,7 @@ static void ac_sqtt_dump_data(struct radeon_info *rad_info,
                                       &thread_trace_data->rgp_pso_correlation;
    struct rgp_queue_info *rgp_queue_info = &thread_trace_data->rgp_queue_info;
    struct rgp_queue_event *rgp_queue_event = &thread_trace_data->rgp_queue_event;
+   struct rgp_clock_calibration *rgp_clock_calibration = &thread_trace_data->rgp_clock_calibration;
 
    /* SQTT header file. */
    ac_sqtt_fill_header(&header);
@@ -1002,6 +1027,27 @@ static void ac_sqtt_dump_data(struct radeon_info *rad_info,
                       sizeof(struct sqtt_queue_event_record));
    }
 
+   /* SQTT clock calibration. */
+   if (rgp_clock_calibration->record_count) {
+      uint32_t num_records = 0;
+
+      list_for_each_entry_safe(struct rgp_clock_calibration_record, record,
+                               &rgp_clock_calibration->record, list) {
+         struct sqtt_file_chunk_clock_calibration clock_calibration;
+
+         ac_sqtt_fill_clock_calibration(&clock_calibration, num_records);
+
+         clock_calibration.cpu_timestamp = record->cpu_timestamp;
+         clock_calibration.gpu_timestamp = record->gpu_timestamp;
+
+         fwrite(&clock_calibration, sizeof(struct sqtt_file_chunk_clock_calibration), 1,
+             output);
+         file_offset += sizeof(struct sqtt_file_chunk_clock_calibration);
+
+         num_records++;
+      }
+   }
+
    if (thread_trace) {
       for (unsigned i = 0; i < thread_trace->num_traces; i++) {
          const struct ac_thread_trace_se *se = &thread_trace->traces[i];
diff --git a/src/amd/common/ac_rgp.h b/src/amd/common/ac_rgp.h
index ce06f644c7c..9e38556a090 100644
--- a/src/amd/common/ac_rgp.h
+++ b/src/amd/common/ac_rgp.h
@@ -175,6 +175,18 @@ struct rgp_queue_event {
    simple_mtx_t lock;
 };
 
+struct rgp_clock_calibration_record {
+   uint64_t cpu_timestamp;
+   uint64_t gpu_timestamp;
+   struct list_head list;
+};
+
+struct rgp_clock_calibration {
+   uint32_t record_count;
+   struct list_head record;
+   simple_mtx_t lock;
+};
+
 int
 ac_dump_rgp_capture(struct radeon_info *info,
                     struct ac_thread_trace *thread_trace);
diff --git a/src/amd/common/ac_sqtt.h b/src/amd/common/ac_sqtt.h
index 8700928f94a..20dac839b27 100644
--- a/src/amd/common/ac_sqtt.h
+++ b/src/amd/common/ac_sqtt.h
@@ -52,6 +52,8 @@ struct ac_thread_trace_data {
 
    struct rgp_queue_info rgp_queue_info;
    struct rgp_queue_event rgp_queue_event;
+
+   struct rgp_clock_calibration rgp_clock_calibration;
 };
 
 #define SQTT_BUFFER_ALIGN_SHIFT 12



More information about the mesa-commit mailing list