diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2016-07-27 13:56:08 +0200 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2016-07-27 15:43:25 +0200 |
commit | 1260564c191a2e2de44b3ffb66ff68e72cd031dd (patch) | |
tree | f40e79b66e6cc1f5c8ad53b30bedffb96545b468 /lib/igt_pm.c | |
parent | 45cbdbc178dc232534a9bd047864f95029f53d6e (diff) |
lib: update docs for igt_pm
- Move all the pm helpers into igt_pm.c. No idea why that wasn't done
in the original commit that created igt_pm.c.
- Add missing docs where needed.
Cc: David Weinehall <david.weinehall@intel.com>
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'lib/igt_pm.c')
-rw-r--r-- | lib/igt_pm.c | 129 |
1 files changed, 118 insertions, 11 deletions
diff --git a/lib/igt_pm.c b/lib/igt_pm.c index b1b5503c..5bf5b2e2 100644 --- a/lib/igt_pm.c +++ b/lib/igt_pm.c @@ -36,6 +36,19 @@ #include "drmtest.h" #include "igt_pm.h" +#include "igt_aux.h" + +/** + * SECTION:igt_pm + * @short_description: Power Management related helpers + * @title: Power Management + * @include: igt.h + * + * This library provides various helpers to enable power management for, + * and in some cases subsequently allow restoring the old behaviour of, + * various external components that by default are set up in a way + * that interferes with the testing of our power management functionality. + */ enum { POLICY_UNKNOWN = -1, @@ -51,17 +64,6 @@ enum { #define MAX_POLICY_STRLEN strlen(MAX_PERFORMANCE_STR) /** - * SECTION:igt_pm - * @short_description: Power Management related helpers - * @title: Power Management - * @include: igt.h - * - * This library provides various helpers to enable power management for, - * and in some cases subsequently allow restoring the old behaviour of, - * various external components that by default are set up in a way - * that interferes with the testing of our power management functionality. - */ -/** * igt_pm_enable_audio_runtime_pm: * * We know that if we don't enable audio runtime PM, snd_hda_intel will never @@ -182,6 +184,7 @@ int8_t *igt_pm_enable_sata_link_power_management(void) * we might restore the settings to the wrong hosts. */ void igt_pm_restore_sata_link_power_management(int8_t *pm_data) + { int fd, i; char *file_name; @@ -231,3 +234,107 @@ void igt_pm_restore_sata_link_power_management(int8_t *pm_data) } free(file_name); } +#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; + + igt_pm_enable_audio_runtime_pm(); + + /* 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_get_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) +{ + return igt_wait(igt_get_runtime_pm_status() == status, 10000, 100); +} |