lib/igt_aux: Extract runtime pm helpers from pm_pc8

I want to use them elsewhere ...

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
Daniel Vetter
2014-05-14 16:10:50 +02:00
parent 1bee7e8b82
commit bd521b493e
3 changed files with 128 additions and 93 deletions
+3 -93
View File
@@ -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);
}