diff options
author | Riana Tauro <riana.tauro@intel.com> | 2022-05-16 17:13:09 +0530 |
---|---|---|
committer | Ashutosh Dixit <ashutosh.dixit@intel.com> | 2022-05-16 15:52:58 -0700 |
commit | 6e97b84b5dde0f43d0f232e99574b064b0238461 (patch) | |
tree | 4afea0260d78b0667f9e1522f07845f80344fd2a /lib | |
parent | 64723cd44c1cd2f8b8263e3b3681c99f05a1b499 (diff) |
lib/igt_aux: add library function to read current selected state of mem_sleep
Add a library function to read the current state of mem_sleep
Used by suspend tests without i915 to skip s3 cycle, if platform has
default state as s2idle. Reduces CI Execution time
v2: Addressed cosmetic review comments (Anshuman)
Reviewed-by: Anshuman Gupta <anshuman.gupta@intel.com>
Signed-off-by: Riana Tauro <riana.tauro@intel.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/igt_aux.c | 52 | ||||
-rw-r--r-- | lib/igt_aux.h | 19 |
2 files changed, 71 insertions, 0 deletions
diff --git a/lib/igt_aux.c b/lib/igt_aux.c index 03cc38c9..3945bebe 100644 --- a/lib/igt_aux.c +++ b/lib/igt_aux.c @@ -710,6 +710,12 @@ static const char *suspend_test_name[] = { [SUSPEND_TEST_CORE] = "core", }; +static const char *mem_sleep_name[] = { + [MEM_SLEEP_FREEZE] = "s2idle", + [MEM_SLEEP_STANDBY] = "shallow", + [MEM_SLEEP_MEM] = "deep" +}; + static enum igt_suspend_test get_suspend_test(int power_dir) { char *test_line; @@ -952,6 +958,52 @@ int igt_get_autoresume_delay(enum igt_suspend_state state) } /** + * igt_get_memsleep_state + * + * Reads the value of /sys/power/mem_sleep and + * returns the current suspend state associated with 'mem'. + * + * Returns : an #igt_mem_sleep state, current suspend state associated with 'mem'. + */ +int igt_get_memsleep_state(void) +{ + char *mem_sleep_states; + char *mem_sleep_state; + enum igt_mem_sleep mem_sleep; + int power_dir; + + igt_require((power_dir = open("/sys/power", O_RDONLY)) >= 0); + + if (faccessat(power_dir, "mem_sleep", R_OK, 0)) + return MEM_SLEEP_NONE; + + igt_assert((mem_sleep_states = igt_sysfs_get(power_dir, "mem_sleep"))); + for (mem_sleep_state = strtok(mem_sleep_states, " "); mem_sleep_state; + mem_sleep_state = strtok(NULL, " ")) { + if (mem_sleep_state[0] == '[') { + mem_sleep_state[strlen(mem_sleep_state) - 1] = '\0'; + mem_sleep_state++; + break; + } + } + + if (!mem_sleep_state) { + free(mem_sleep_states); + return MEM_SLEEP_NONE; + } + + for (mem_sleep = MEM_SLEEP_FREEZE; mem_sleep < MEM_SLEEP_NUM; mem_sleep++) { + if (strcmp(mem_sleep_name[mem_sleep], mem_sleep_state) == 0) + break; + } + + igt_assert_f(mem_sleep < MEM_SLEEP_NUM, "Invalid mem_sleep state\n"); + + free(mem_sleep_states); + close(power_dir); + return mem_sleep; +} +/** * igt_drop_root: * * Drop root privileges and make sure it actually worked. Useful for tests diff --git a/lib/igt_aux.h b/lib/igt_aux.h index 9f2588ae..2f7efd9c 100644 --- a/lib/igt_aux.h +++ b/lib/igt_aux.h @@ -186,11 +186,30 @@ enum igt_suspend_test { SUSPEND_TEST_NUM, }; +/** + * igt_mem_sleep: + * @MEM_SLEEP_NONE: no support + * @MEM_SLEEP_FREEZE: suspend-to-idle target state, aka S0ix or freeze, + * @MEM_SLEEP_STANDBY: standby target state, aka S1 + * @MEM_SLEEP_MEM: suspend-to-mem target state aka S3 + */ +enum igt_mem_sleep { + MEM_SLEEP_NONE, + MEM_SLEEP_FREEZE, + MEM_SLEEP_STANDBY, + MEM_SLEEP_MEM, + + /*<private>*/ + MEM_SLEEP_NUM, +}; + void igt_system_suspend_autoresume(enum igt_suspend_state state, enum igt_suspend_test test); void igt_set_autoresume_delay(int delay_secs); int igt_get_autoresume_delay(enum igt_suspend_state state); +int igt_get_memsleep_state(void); + /* dropping priviledges */ void igt_drop_root(void); |