summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRiana Tauro <riana.tauro@intel.com>2022-05-16 17:13:09 +0530
committerAshutosh Dixit <ashutosh.dixit@intel.com>2022-05-16 15:52:58 -0700
commit6e97b84b5dde0f43d0f232e99574b064b0238461 (patch)
tree4afea0260d78b0667f9e1522f07845f80344fd2a /lib
parent64723cd44c1cd2f8b8263e3b3681c99f05a1b499 (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.c52
-rw-r--r--lib/igt_aux.h19
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);