mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-06-21 23:06:29 +00:00
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:
parent
1bee7e8b82
commit
bd521b493e
114
lib/igt_aux.c
114
lib/igt_aux.c
@ -369,3 +369,117 @@ void igt_wait_for_keypress(void)
|
|||||||
getchar();
|
getchar();
|
||||||
tcsetattr ( STDIN_FILENO, TCSANOW, &oldt );
|
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;
|
||||||
|
}
|
||||||
|
@ -57,6 +57,17 @@ void igt_drop_root(void);
|
|||||||
|
|
||||||
void igt_wait_for_keypress(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 */
|
/* sysinfo cross-arch wrappers from intel_os.c */
|
||||||
|
|
||||||
/* These are separate to allow easier testing when porting, see the comment at
|
/* These are separate to allow easier testing when porting, see the comment at
|
||||||
|
@ -61,14 +61,6 @@
|
|||||||
|
|
||||||
#define POWER_DIR "/sys/devices/pci0000:00/0000:00:02.0/power"
|
#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 {
|
enum pc8_status {
|
||||||
PC8_ENABLED,
|
PC8_ENABLED,
|
||||||
PC8_DISABLED
|
PC8_DISABLED
|
||||||
@ -202,50 +194,12 @@ static bool wait_for_pc8_status(enum pc8_status status)
|
|||||||
return false;
|
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)
|
static bool wait_for_suspended(void)
|
||||||
{
|
{
|
||||||
if (has_pc8 && !has_runtime_pm)
|
if (has_pc8 && !has_runtime_pm)
|
||||||
return wait_for_pc8_status(PC8_ENABLED);
|
return wait_for_pc8_status(PC8_ENABLED);
|
||||||
else
|
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)
|
static bool wait_for_active(void)
|
||||||
@ -253,7 +207,7 @@ static bool wait_for_active(void)
|
|||||||
if (has_pc8 && !has_runtime_pm)
|
if (has_pc8 && !has_runtime_pm)
|
||||||
return wait_for_pc8_status(PC8_DISABLED);
|
return wait_for_pc8_status(PC8_DISABLED);
|
||||||
else
|
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)
|
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);
|
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)
|
static void setup_pc8(void)
|
||||||
{
|
{
|
||||||
has_pc8 = false;
|
has_pc8 = false;
|
||||||
@ -776,7 +688,7 @@ static void setup_environment(void)
|
|||||||
|
|
||||||
setup_non_graphics_runtime_pm();
|
setup_non_graphics_runtime_pm();
|
||||||
|
|
||||||
setup_runtime_pm();
|
has_runtime_pm = igt_setup_runtime_pm();
|
||||||
setup_pc8();
|
setup_pc8();
|
||||||
|
|
||||||
igt_info("Runtime PM support: %d\n", has_runtime_pm);
|
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);
|
fini_mode_set_data(&ms_data);
|
||||||
drmClose(drm_fd);
|
drmClose(drm_fd);
|
||||||
close(msr_fd);
|
close(msr_fd);
|
||||||
if (has_runtime_pm)
|
|
||||||
close(pm_status_fd);
|
|
||||||
if (has_pc8)
|
if (has_pc8)
|
||||||
close(pc8_status_fd);
|
close(pc8_status_fd);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user