[Intel-gfx] [PATCH v1 1/1] tests/pm_slpc: Add test for GuC based SLPC

Sagar Arun Kamble sagar.a.kamble at intel.com
Mon Nov 14 10:38:57 UTC 2016


This tests whether SLPC in GuC is configured properly through shared data.
It checks whether GTPERF is running in default state, post reset and post
system suspend/resume.
This test will be extended further based on enablement of other SLPC tasks.

Signed-off-by: Sagar Arun Kamble <sagar.a.kamble at intel.com>
---
 lib/igt_pm.c           | 63 ++++++++++++++++++++++++++++++++++
 lib/igt_pm.h           |  2 ++
 tests/Makefile.sources |  1 +
 tests/pm_slpc.c        | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 159 insertions(+)
 create mode 100644 tests/pm_slpc.c

diff --git a/lib/igt_pm.c b/lib/igt_pm.c
index 5bf5b2e..e139d9a 100644
--- a/lib/igt_pm.c
+++ b/lib/igt_pm.c
@@ -37,6 +37,7 @@
 #include "drmtest.h"
 #include "igt_pm.h"
 #include "igt_aux.h"
+#include "igt_debugfs.h"
 
 /**
  * SECTION:igt_pm
@@ -338,3 +339,65 @@ bool igt_wait_for_pm_status(enum igt_runtime_pm_status status)
 {
 	return igt_wait(igt_get_runtime_pm_status() == status, 10000, 100);
 }
+
+#define DBG_BUF_SIZE 4096
+
+bool igt_slpc_active(void)
+{
+	ssize_t n_read;
+	char buf[DBG_BUF_SIZE];
+	bool guc_load_status = false, slpc_status = false;
+	int guc_load_status_fd;
+	int frequency_info_fd;
+
+	guc_load_status_fd = igt_debugfs_open("i915_guc_load_status", O_RDONLY);
+	igt_skip_on_f(guc_load_status_fd == -1,
+		      "debugfs entry 'i915_guc_load_status' not found\n");
+
+	frequency_info_fd = igt_debugfs_open("i915_frequency_info", O_RDONLY);
+	igt_skip_on_f(frequency_info_fd == -1,
+		      "debugfs entry 'i915_frequency_info' not found\n");
+
+	n_read = read(guc_load_status_fd, buf, ARRAY_SIZE(buf));
+	igt_assert(n_read >= 0);
+	buf[n_read] = '\0';
+
+	if (strstr(buf, "\tload: SUCCESS\n") != NULL)
+		guc_load_status = true;
+	else
+		igt_debug("GuC is not loaded\n");
+
+	n_read = read(frequency_info_fd, buf, ARRAY_SIZE(buf));
+	igt_assert(n_read >= 0);
+	buf[n_read] = '\0';
+
+	if (strstr(buf, "SLPC Active\n") != NULL)
+		slpc_status = true;
+
+	close(frequency_info_fd);
+	close(guc_load_status_fd);
+	return (guc_load_status && slpc_status);
+}
+
+void igt_gtperf_state_check(void)
+{
+	ssize_t n_read;
+	char buf[DBG_BUF_SIZE];
+	int slpc_info_fd;
+
+	igt_assert_f(igt_slpc_active(), "SLPC is not active\n");
+
+	slpc_info_fd = igt_debugfs_open("i915_slpc_info", O_RDONLY);
+	igt_skip_on_f(slpc_info_fd == -1,
+		      "debugfs entry 'i915_slpc_info' not found\n");
+
+	n_read = read(slpc_info_fd, buf, ARRAY_SIZE(buf));
+	igt_assert(n_read >= 0);
+	buf[n_read] = '\0';
+
+	igt_assert(strstr(buf, "global state: 3 (running)\n") != NULL);
+	igt_assert(strstr(buf, "\tgtperf task active: yes\n") != NULL);
+	igt_assert(strstr(buf, "\tfreq switch active: yes\n") != NULL);
+
+	close(slpc_info_fd);
+}
diff --git a/lib/igt_pm.h b/lib/igt_pm.h
index eced39f..cc1ae2d 100644
--- a/lib/igt_pm.h
+++ b/lib/igt_pm.h
@@ -49,5 +49,7 @@ enum igt_runtime_pm_status {
 bool igt_setup_runtime_pm(void);
 enum igt_runtime_pm_status igt_get_runtime_pm_status(void);
 bool igt_wait_for_pm_status(enum igt_runtime_pm_status status);
+bool igt_slpc_active(void);
+void igt_gtperf_state_check(void);
 
 #endif /* IGT_PM_H */
diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index 6d081c3..9a2e246 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -122,6 +122,7 @@ TESTS_progs_M = \
 	pm_rps \
 	pm_rc6_residency \
 	pm_sseu \
+	pm_slpc \
 	prime_busy \
 	prime_mmap \
 	prime_mmap_coherency \
diff --git a/tests/pm_slpc.c b/tests/pm_slpc.c
new file mode 100644
index 0000000..87ffdcb
--- /dev/null
+++ b/tests/pm_slpc.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright © 2016 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Sagar Arun Kamble <sagar.a.kamble at intel.com>
+ *
+ */
+
+#define _GNU_SOURCE
+#include "igt.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <errno.h>
+#include <time.h>
+#include <sys/wait.h>
+
+#include "intel_bufmgr.h"
+
+static int drm_fd;
+
+enum {
+	NONE,
+	RESET,
+	SYSTEM_SUSPEND
+};
+
+static void gtperf_test(unsigned mode)
+{
+	igt_gtperf_state_check();
+
+	switch (mode) {
+	case NONE:	break;
+	case RESET:	igt_force_gpu_reset();
+			break;
+	case SYSTEM_SUSPEND:	igt_system_suspend_autoresume(SUSPEND_STATE_MEM,
+						      SUSPEND_TEST_NONE);
+				sleep(5);
+				break;
+	}
+
+	igt_gtperf_state_check();
+
+}
+
+static bool has_slpc_support(void)
+{
+	return intel_gen(intel_get_drm_devid(drm_fd)) >= 9;
+}
+
+igt_main
+{
+	igt_skip_on_simulation();
+
+	igt_fixture {
+		drm_fd = drm_open_driver(DRIVER_INTEL);
+		igt_skip_on(!has_slpc_support());
+	}
+
+	igt_subtest("gtperf-status")
+		gtperf_test(NONE);
+
+	igt_subtest("reset-gtperf")
+		gtperf_test(RESET);
+
+	igt_subtest("system-suspend-gtperf")
+		gtperf_test(SYSTEM_SUSPEND);
+
+	igt_fixture
+		close(drm_fd);
+}
-- 
1.9.1



More information about the Intel-gfx mailing list