[igt-dev] [PATCH i-g-t v3 26/28] tools/i915-perf: add option to printout reports data

Umesh Nerlige Ramappa umesh.nerlige.ramappa at intel.com
Fri Oct 28 19:52:56 UTC 2022


From: Lionel Landwerlin <lionel.g.landwerlin at intel.com>

This is helpful to get an idea of how timelines of reports should be
built.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa at intel.com>
---
 tools/i915-perf/i915_perf_reader.c | 88 ++++++++++++++++++++----------
 1 file changed, 58 insertions(+), 30 deletions(-)

diff --git a/tools/i915-perf/i915_perf_reader.c b/tools/i915-perf/i915_perf_reader.c
index 9be1a9fc..bcd40624 100644
--- a/tools/i915-perf/i915_perf_reader.c
+++ b/tools/i915-perf/i915_perf_reader.c
@@ -53,7 +53,8 @@ usage(void)
 	       "     --help,    -h             Print this screen\n"
 	       "     --counters, -c c1,c2,...  List of counters to display values for.\n"
 	       "                               Use 'all' to display all counters.\n"
-	       "                               Use 'list' to list available counters.\n");
+	       "                               Use 'list' to list available counters.\n"
+	       "     --reports, -r             Print out data per report.\n");
 }
 
 static struct intel_perf_logical_counter *
@@ -165,12 +166,49 @@ get_logical_counters(struct intel_perf_metric_set *metric_set,
 	return counters;
 }
 
+static void
+print_report_deltas(const struct intel_perf_data_reader *reader,
+		    const struct drm_i915_perf_record_header *i915_report0,
+		    const struct drm_i915_perf_record_header *i915_report1,
+		    struct intel_perf_logical_counter **counters,
+		    uint32_t n_counters)
+{
+	struct intel_perf_accumulator accu;
+
+	intel_perf_accumulate_reports(&accu,
+				      reader->perf, reader->metric_set,
+				      i915_report0, i915_report1);
+
+	for (uint32_t c = 0; c < n_counters; c++) {
+		struct intel_perf_logical_counter *counter = counters[c];
+
+		switch (counter->storage) {
+		case INTEL_PERF_LOGICAL_COUNTER_STORAGE_UINT64:
+		case INTEL_PERF_LOGICAL_COUNTER_STORAGE_UINT32:
+		case INTEL_PERF_LOGICAL_COUNTER_STORAGE_BOOL32:
+			fprintf(stdout, "   %s: %" PRIu64 "\n",
+				counter->symbol_name, counter->read_uint64(reader->perf,
+									   reader->metric_set,
+									   accu.deltas));
+			break;
+		case INTEL_PERF_LOGICAL_COUNTER_STORAGE_DOUBLE:
+		case INTEL_PERF_LOGICAL_COUNTER_STORAGE_FLOAT:
+			fprintf(stdout, "   %s: %f\n",
+				counter->symbol_name, counter->read_float(reader->perf,
+									  reader->metric_set,
+									  accu.deltas));
+			break;
+		}
+	}
+}
+
 int
 main(int argc, char *argv[])
 {
 	const struct option long_options[] = {
 		{"help",             no_argument, 0, 'h'},
 		{"counters",   required_argument, 0, 'c'},
+		{"reports",          no_argument, 0, 'r'},
 		{0, 0, 0, 0}
 	};
 	struct intel_perf_data_reader reader;
@@ -179,8 +217,9 @@ main(int argc, char *argv[])
 	const char *counter_names = NULL;
 	int32_t n_counters;
 	int fd, opt;
+	bool print_reports = false;
 
-	while ((opt = getopt_long(argc, argv, "hc:", long_options, NULL)) != -1) {
+	while ((opt = getopt_long(argc, argv, "hc:r", long_options, NULL)) != -1) {
 		switch (opt) {
 		case 'h':
 			usage();
@@ -188,6 +227,9 @@ main(int argc, char *argv[])
 		case 'c':
 			counter_names = optarg;
 			break;
+		case 'r':
+			print_reports = true;
+			break;
 		default:
 			fprintf(stderr, "Internal error: "
 				"unexpected getopt value: %d\n", opt);
@@ -268,11 +310,6 @@ main(int argc, char *argv[])
 
 	for (uint32_t i = 0; i < reader.n_timelines; i++) {
 		const struct intel_perf_timeline_item *item = &reader.timelines[i];
-		const struct drm_i915_perf_record_header *i915_report0 =
-			reader.records[item->record_start];
-		const struct drm_i915_perf_record_header *i915_report1 =
-			reader.records[item->record_end];
-		struct intel_perf_accumulator accu;
 
 		fprintf(stdout, "Time: CPU=0x%016" PRIx64 "-0x%016" PRIx64
 			" GPU=0x%016" PRIx64 "-0x%016" PRIx64"\n",
@@ -281,29 +318,20 @@ main(int argc, char *argv[])
 		fprintf(stdout, "hw_id=0x%x %s\n",
 			item->hw_id, item->hw_id == 0xffffffff ? "(idle)" : "");
 
-		intel_perf_accumulate_reports(&accu,
-					      reader.perf, reader.metric_set,
-					      i915_report0, i915_report1);
-
-		for (uint32_t c = 0; c < n_counters; c++) {
-			struct intel_perf_logical_counter *counter = counters[c];
-
-			switch (counter->storage) {
-			case INTEL_PERF_LOGICAL_COUNTER_STORAGE_UINT64:
-			case INTEL_PERF_LOGICAL_COUNTER_STORAGE_UINT32:
-			case INTEL_PERF_LOGICAL_COUNTER_STORAGE_BOOL32:
-				fprintf(stdout, "   %s: %" PRIu64 "\n",
-					counter->symbol_name, counter->read_uint64(reader.perf,
-										   reader.metric_set,
-										   accu.deltas));
-				break;
-			case INTEL_PERF_LOGICAL_COUNTER_STORAGE_DOUBLE:
-			case INTEL_PERF_LOGICAL_COUNTER_STORAGE_FLOAT:
-				fprintf(stdout, "   %s: %f\n",
-					counter->symbol_name, counter->read_float(reader.perf,
-										  reader.metric_set,
-										  accu.deltas));
-				break;
+		print_report_deltas(&reader,
+				    reader.records[item->record_start],
+				    reader.records[item->record_end],
+				    counters, n_counters);
+
+		if (print_reports) {
+			for (uint32_t r = item->record_start; r < item->record_end; r++) {
+				fprintf(stdout, " report%i = %s\n",
+					r - item->record_start,
+					intel_perf_read_report_reason(reader.perf, reader.records[r]));
+				print_report_deltas(&reader,
+						    reader.records[r],
+						    reader.records[r + 1],
+						    counters, n_counters);
 			}
 		}
 	}
-- 
2.25.1



More information about the igt-dev mailing list