[Intel-gfx] [PATCH i-g-t 20/29] igt/perf: add utility function for checking periodic reports

Lionel Landwerlin lionel.g.landwerlin at intel.com
Tue Apr 25 22:32:52 UTC 2017


Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
---
 tests/perf.c | 55 +++++++++++++++++++++++++++++--------------------------
 1 file changed, 29 insertions(+), 26 deletions(-)

diff --git a/tests/perf.c b/tests/perf.c
index d057d943..f8ac06c3 100644
--- a/tests/perf.c
+++ b/tests/perf.c
@@ -450,6 +450,29 @@ gen8_read_report_reason(const uint32_t *report)
 		return "unknown";
 }
 
+static bool
+oa_report_is_periodic(uint32_t oa_exponent, const uint32_t *report)
+{
+
+	if (IS_HASWELL(devid)) {
+		/* For Haswell we don't have a documented report reason field
+		 * (though empirically report[0] bit 10 does seem to correlate
+		 * with a timer trigger reason) so we instead infer which
+		 * reports are timer triggered by checking if the least
+		 * significant bits are zero and the exponent bit is set.
+		 */
+		uint32_t oa_exponent_mask = (1 << (oa_exponent + 1)) - 1;
+		if ((report[1] & oa_exponent_mask) != (1 << oa_exponent))
+			return true;
+	} else {
+		if ((report[0] >> OAREPORT_REASON_SHIFT) &
+		    OAREPORT_REASON_TIMER)
+			return true;
+	}
+
+	return false;
+}
+
 static uint64_t
 timebase_scale(uint32_t u32_delta)
 {
@@ -1115,22 +1138,8 @@ read_2_oa_reports(int stream_fd,
 			igt_assert_neq(report[1], 0);
 
 			if (timer_only) {
-				/* For Haswell we don't have a documented
-				 * report reason field (though empirically
-				 * report[0] bit 10 does seem to correlate with
-				 * a timer trigger reason) so we instead infer
-				 * which reports are timer triggered by
-				 * checking if the least significant bits are
-				 * zero and the exponent bit is set.
-				 */
-				if ((report[1] & exponent_mask) != (1 << exponent)) {
-					igt_debug("skipping non timer report reason=%x\n",
-						  report[0]);
-
-					/* Also assert our hypothesis about the
-					 * reason bit...
-					 */
-					igt_assert_eq(report[0] & (1 << 10), 0);
+				if (!oa_report_is_periodic(exponent, report)) {
+					igt_debug("skipping non timer report\n");
 					continue;
 				}
 			}
@@ -1740,11 +1749,8 @@ test_blocking(void)
 				if (header->type == DRM_I915_PERF_RECORD_SAMPLE) {
 					uint32_t *report = (void *)(header + 1);
 
-					uint32_t reason = ((report[0] >>
-							    OAREPORT_REASON_SHIFT) &
-							   OAREPORT_REASON_MASK);
-
-					if (reason & OAREPORT_REASON_TIMER)
+					if (oa_report_is_periodic(oa_exponent,
+								  report))
 						timer_report_read = true;
 					else
 						non_timer_report_read = true;
@@ -1914,11 +1920,8 @@ test_polling(void)
 				if (header->type == DRM_I915_PERF_RECORD_SAMPLE) {
 					uint32_t *report = (void *)(header + 1);
 
-					uint32_t reason = ((report[0] >>
-							    OAREPORT_REASON_SHIFT) &
-							   OAREPORT_REASON_MASK);
-
-					if (reason & OAREPORT_REASON_TIMER)
+					if (oa_report_is_periodic(oa_exponent,
+								  report))
 						timer_report_read = true;
 					else
 						non_timer_report_read = true;
-- 
2.11.0



More information about the Intel-gfx mailing list