[Intel-gfx] [PATCH 1/2] lib/igt_aux: Extract runtime pm helpers from pm_pc8

Daniel Vetter daniel.vetter at ffwll.ch
Wed May 14 18:00:46 CEST 2014


I want to use them elsewhere ...

Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
---
 lib/igt_aux.c  | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/igt_aux.h  |  11 ++++++
 tests/pm_pc8.c |  96 ++----------------------------------------------
 3 files changed, 128 insertions(+), 93 deletions(-)

diff --git a/lib/igt_aux.c b/lib/igt_aux.c
index 5ae2e42716b6..182e1c04d1fb 100644
--- a/lib/igt_aux.c
+++ b/lib/igt_aux.c
@@ -369,3 +369,117 @@ void igt_wait_for_keypress(void)
 	getchar();
 	tcsetattr ( STDIN_FILENO, TCSANOW, &oldt );
 }
+
+#define POWER_DIR "/sys/devices/pci0000:00/0000:00:02.0/power"
+/* We just leak this on exit ... */
+int pm_status_fd = -1;
+
+/**
+ * igt_setup_runtime_pm:
+ *
+ * Sets up the runtime PM helper functions and enables runtime PM. To speed up
+ * tests the autosuspend delay is set to 0.
+ *
+ * Returns:
+ * True if runtime pm is available, false otherwise.
+ */
+bool igt_setup_runtime_pm(void)
+{
+	int fd;
+	ssize_t size;
+	char buf[6];
+
+	if (pm_status_fd >= 0)
+		return true;
+
+	/* Our implementation uses autosuspend. Try to set it to 0ms so the test
+	 * suite goes faster and we have a higher probability of triggering race
+	 * conditions. */
+	fd = open(POWER_DIR "/autosuspend_delay_ms", O_WRONLY);
+	igt_assert_f(fd >= 0,
+		     "Can't open " POWER_DIR "/autosuspend_delay_ms\n");
+
+	/* If we fail to write to the file, it means this system doesn't support
+	 * runtime PM. */
+	size = write(fd, "0\n", 2);
+
+	close(fd);
+
+	if (size != 2)
+		return false;
+
+	/* We know we support runtime PM, let's try to enable it now. */
+	fd = open(POWER_DIR "/control", O_RDWR);
+	igt_assert_f(fd >= 0, "Can't open " POWER_DIR "/control\n");
+
+	size = write(fd, "auto\n", 5);
+	igt_assert(size == 5);
+
+	lseek(fd, 0, SEEK_SET);
+	size = read(fd, buf, ARRAY_SIZE(buf));
+	igt_assert(size == 5);
+	igt_assert(strncmp(buf, "auto\n", 5) == 0);
+
+	close(fd);
+
+	pm_status_fd = open(POWER_DIR "/runtime_status", O_RDONLY);
+	igt_assert_f(pm_status_fd >= 0,
+		     "Can't open " POWER_DIR "/runtime_status\n");
+
+	return true;
+}
+
+/**
+ * igt_runtime_pm_status:
+ *
+ * Returns:
+ * The current runtime PM status.
+ */
+enum igt_runtime_pm_status igt_get_runtime_pm_status(void)
+{
+	ssize_t n_read;
+	char buf[32];
+
+	lseek(pm_status_fd, 0, SEEK_SET);
+	n_read = read(pm_status_fd, buf, ARRAY_SIZE(buf));
+	igt_assert(n_read >= 0);
+	buf[n_read] = '\0';
+
+	if (strncmp(buf, "suspended\n", n_read) == 0)
+		return IGT_RUNTIME_PM_STATUS_SUSPENDED;
+	else if (strncmp(buf, "active\n", n_read) == 0)
+		return IGT_RUNTIME_PM_STATUS_ACTIVE;
+	else if (strncmp(buf, "suspending\n", n_read) == 0)
+		return IGT_RUNTIME_PM_STATUS_SUSPENDING;
+	else if (strncmp(buf, "resuming\n", n_read) == 0)
+		return IGT_RUNTIME_PM_STATUS_RESUMING;
+
+	igt_assert_f(false, "Unknown status %s\n", buf);
+	return IGT_RUNTIME_PM_STATUS_UNKNOWN;
+}
+
+/**
+ * igt_wait_for_pm_status:
+ * @status: desired runtime PM status
+ *
+ * Waits until for the driver to switch to into the desired runtime PM status,
+ * with a 10 second timeout.
+ *
+ * Returns:
+ * True if the desired runtime PM status was attained, false if the operation
+ * timed out.
+ */
+bool igt_wait_for_pm_status(enum igt_runtime_pm_status status)
+{
+	int i;
+	int hundred_ms = 100 * 1000, ten_s = 10 * 1000 * 1000;
+
+	for (i = 0; i < ten_s; i += hundred_ms) {
+		if (igt_get_runtime_pm_status() == status)
+			return true;
+
+		usleep(hundred_ms);
+	}
+
+	return false;
+}
diff --git a/lib/igt_aux.h b/lib/igt_aux.h
index aa8a3878a62d..597580da0b4e 100644
--- a/lib/igt_aux.h
+++ b/lib/igt_aux.h
@@ -57,6 +57,17 @@ void igt_drop_root(void);
 
 void igt_wait_for_keypress(void);
 
+enum igt_runtime_pm_status {
+	IGT_RUNTIME_PM_STATUS_ACTIVE,
+	IGT_RUNTIME_PM_STATUS_SUSPENDED,
+	IGT_RUNTIME_PM_STATUS_SUSPENDING,
+	IGT_RUNTIME_PM_STATUS_RESUMING,
+	IGT_RUNTIME_PM_STATUS_UNKNOWN,
+};
+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);
+
 /* sysinfo cross-arch wrappers from intel_os.c */
 
 /* These are separate to allow easier testing when porting, see the comment at
diff --git a/tests/pm_pc8.c b/tests/pm_pc8.c
index 67583fe278d5..d36350370ba2 100644
--- a/tests/pm_pc8.c
+++ b/tests/pm_pc8.c
@@ -61,14 +61,6 @@
 
 #define POWER_DIR "/sys/devices/pci0000:00/0000:00:02.0/power"
 
-enum runtime_pm_status {
-	RUNTIME_PM_STATUS_ACTIVE,
-	RUNTIME_PM_STATUS_SUSPENDED,
-	RUNTIME_PM_STATUS_SUSPENDING,
-	RUNTIME_PM_STATUS_RESUMING,
-	RUNTIME_PM_STATUS_UNKNOWN,
-};
-
 enum pc8_status {
 	PC8_ENABLED,
 	PC8_DISABLED
@@ -202,50 +194,12 @@ static bool wait_for_pc8_status(enum pc8_status status)
 	return false;
 }
 
-static enum runtime_pm_status get_runtime_pm_status(void)
-{
-	ssize_t n_read;
-	char buf[32];
-
-	lseek(pm_status_fd, 0, SEEK_SET);
-	n_read = read(pm_status_fd, buf, ARRAY_SIZE(buf));
-	igt_assert(n_read >= 0);
-	buf[n_read] = '\0';
-
-	if (strncmp(buf, "suspended\n", n_read) == 0)
-		return RUNTIME_PM_STATUS_SUSPENDED;
-	else if (strncmp(buf, "active\n", n_read) == 0)
-		return RUNTIME_PM_STATUS_ACTIVE;
-	else if (strncmp(buf, "suspending\n", n_read) == 0)
-		return RUNTIME_PM_STATUS_SUSPENDING;
-	else if (strncmp(buf, "resuming\n", n_read) == 0)
-		return RUNTIME_PM_STATUS_RESUMING;
-
-	igt_assert_f(false, "Unknown status %s\n", buf);
-	return RUNTIME_PM_STATUS_UNKNOWN;
-}
-
-static bool wait_for_pm_status(enum runtime_pm_status status)
-{
-	int i;
-	int hundred_ms = 100 * 1000, ten_s = 10 * 1000 * 1000;
-
-	for (i = 0; i < ten_s; i += hundred_ms) {
-		if (get_runtime_pm_status() == status)
-			return true;
-
-		usleep(hundred_ms);
-	}
-
-	return false;
-}
-
 static bool wait_for_suspended(void)
 {
 	if (has_pc8 && !has_runtime_pm)
 		return wait_for_pc8_status(PC8_ENABLED);
 	else
-		return wait_for_pm_status(RUNTIME_PM_STATUS_SUSPENDED);
+		return igt_wait_for_pm_status(IGT_RUNTIME_PM_STATUS_SUSPENDED);
 }
 
 static bool wait_for_active(void)
@@ -253,7 +207,7 @@ static bool wait_for_active(void)
 	if (has_pc8 && !has_runtime_pm)
 		return wait_for_pc8_status(PC8_DISABLED);
 	else
-		return wait_for_pm_status(RUNTIME_PM_STATUS_ACTIVE);
+		return igt_wait_for_pm_status(IGT_RUNTIME_PM_STATUS_ACTIVE);
 }
 
 static void disable_all_screens_dpms(struct mode_set_data *data)
@@ -655,48 +609,6 @@ static void test_i2c(struct mode_set_data *data)
 		     drm_edids);
 }
 
-static void setup_runtime_pm(void)
-{
-	int fd;
-	ssize_t size;
-	char buf[6];
-
-	/* Our implementation uses autosuspend. Try to set it to 0ms so the test
-	 * suite goes faster and we have a higher probability of triggering race
-	 * conditions. */
-	fd = open(POWER_DIR "/autosuspend_delay_ms", O_WRONLY);
-	igt_assert_f(fd >= 0,
-		     "Can't open " POWER_DIR "/autosuspend_delay_ms\n");
-
-	/* If we fail to write to the file, it means this system doesn't support
-	 * runtime PM. */
-	size = write(fd, "0\n", 2);
-	has_runtime_pm = (size == 2);
-
-	close(fd);
-
-	if (!has_runtime_pm)
-		return;
-
-	/* We know we support runtime PM, let's try to enable it now. */
-	fd = open(POWER_DIR "/control", O_RDWR);
-	igt_assert_f(fd >= 0, "Can't open " POWER_DIR "/control\n");
-
-	size = write(fd, "auto\n", 5);
-	igt_assert(size == 5);
-
-	lseek(fd, 0, SEEK_SET);
-	size = read(fd, buf, ARRAY_SIZE(buf));
-	igt_assert(size == 5);
-	igt_assert(strncmp(buf, "auto\n", 5) == 0);
-
-	close(fd);
-
-	pm_status_fd = open(POWER_DIR "/runtime_status", O_RDONLY);
-	igt_assert_f(pm_status_fd >= 0,
-		     "Can't open " POWER_DIR "/runtime_status\n");
-}
-
 static void setup_pc8(void)
 {
 	has_pc8 = false;
@@ -776,7 +688,7 @@ static void setup_environment(void)
 
 	setup_non_graphics_runtime_pm();
 
-	setup_runtime_pm();
+	has_runtime_pm = igt_setup_runtime_pm();
 	setup_pc8();
 
 	igt_info("Runtime PM support: %d\n", has_runtime_pm);
@@ -799,8 +711,6 @@ static void teardown_environment(void)
 	fini_mode_set_data(&ms_data);
 	drmClose(drm_fd);
 	close(msr_fd);
-	if (has_runtime_pm)
-		close(pm_status_fd);
 	if (has_pc8)
 		close(pc8_status_fd);
 }
-- 
1.8.1.4




More information about the Intel-gfx mailing list