I want to use them elsewhere ... Signed-off-by: Daniel Vetter <daniel.vetter@xxxxxxxx> --- 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 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx