[PATCH i-g-t v3 1/5] tests/intel/xe_pmu: Validate engine activity on gt reset

Riana Tauro riana.tauro at intel.com
Fri Jun 6 10:10:04 UTC 2025


Add a test to validate engine activity is idle/showing load after gt reset.

Signed-off-by: Riana Tauro <riana.tauro at intel.com>
---
 tests/intel/xe_pmu.c | 47 ++++++++++++++++++++++++++++++++++++++------
 1 file changed, 41 insertions(+), 6 deletions(-)

diff --git a/tests/intel/xe_pmu.c b/tests/intel/xe_pmu.c
index 02f23bd7d..d9b0d2c96 100644
--- a/tests/intel/xe_pmu.c
+++ b/tests/intel/xe_pmu.c
@@ -40,6 +40,12 @@
  * Description: Test to validate engine activity by running workload on all engines
  *		simultaneously and trailing idle
  *
+ * SUBTEST: engine-activity-gt-reset-idle
+ * Description: Test to validate engine activity is idle after gt reset
+ *
+ * SUBTEST: engine-activity-gt-reset
+ * Description: Test to validate engine activity on all engines before and after gt reset
+ *
  * SUBTEST: engine-activity-most-load
  * Description: Test to validate engine activity by running workload on all engines except one
  *
@@ -75,6 +81,7 @@
 #define TEST_LOAD		BIT(0)
 #define TEST_TRAILING_IDLE	BIT(1)
 #define TEST_IDLE		BIT(2)
+#define TEST_GT_RESET		BIT(3)
 
 const double tolerance = 0.1;
 static char xe_device[NAME_MAX];
@@ -238,7 +245,10 @@ static void engine_activity(int fd, struct drm_xe_engine_class_instance *eci, un
 		end_cork(fd, cork);
 	pmu_read_multi(pmu_fd[0], 2, after);
 
-	end_cork(fd, cork);
+	if (flags & TEST_GT_RESET)
+		xe_force_gt_reset_sync(fd, eci->gt_id);
+	else
+		end_cork(fd, cork);
 
 	engine_active_ticks = after[0] - before[0];
 	engine_total_ticks = after[1] - before[1];
@@ -248,6 +258,24 @@ static void engine_activity(int fd, struct drm_xe_engine_class_instance *eci, un
 	igt_debug("Engine total ticks: after %ld, before %ld delta %ld\n", after[1], before[1],
 		  engine_total_ticks);
 
+	if (flags & TEST_LOAD)
+		assert_within_epsilon(engine_active_ticks, engine_total_ticks, tolerance);
+	else
+		igt_assert(!engine_active_ticks);
+
+	if (flags & TEST_GT_RESET) {
+		pmu_read_multi(pmu_fd[0], 2, before);
+		usleep(SLEEP_DURATION * USEC_PER_SEC);
+		pmu_read_multi(pmu_fd[0], 2, after);
+
+		engine_active_ticks = after[0] - before[0];
+
+		igt_debug("Engine active ticks after gt reset:  after %ld, before %ld delta %ld\n",
+			  after[0], before[0], engine_active_ticks);
+
+		igt_assert(!engine_active_ticks);
+	}
+
 	if (cork)
 		xe_cork_destroy(fd, cork);
 
@@ -255,11 +283,6 @@ static void engine_activity(int fd, struct drm_xe_engine_class_instance *eci, un
 
 	close(pmu_fd[0]);
 	close(pmu_fd[1]);
-
-	if (flags & TEST_LOAD)
-		assert_within_epsilon(engine_active_ticks, engine_total_ticks, tolerance);
-	else
-		igt_assert(!engine_active_ticks);
 }
 
 static void engine_activity_load_single(int fd, int num_engines,
@@ -812,6 +835,18 @@ igt_main
 	igt_subtest("engine-activity-all-load-idle")
 		engine_activity_load_all(fd, num_engines, TEST_LOAD | TEST_TRAILING_IDLE);
 
+	igt_describe("Validate engine activity is idle after gt reset");
+	test_each_engine("engine-activity-gt-reset-idle", fd, eci)
+		engine_activity(fd, eci, TEST_LOAD | TEST_GT_RESET);
+
+	igt_describe("Validate engine activity before and after gt reset");
+	igt_subtest("engine-activity-gt-reset") {
+		engine_activity_load_all(fd, num_engines, TEST_LOAD);
+		xe_for_each_gt(fd, gt)
+			xe_force_gt_reset_sync(fd, gt);
+		engine_activity_load_all(fd, num_engines, TEST_LOAD);
+	}
+
 	igt_subtest_group {
 		unsigned int num_fns;
 
-- 
2.47.1



More information about the igt-dev mailing list