summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorImre Deak <imre.deak@intel.com>2015-05-15 16:31:09 +0300
committerImre Deak <imre.deak@intel.com>2015-05-19 11:35:55 +0300
commita2ce95eb9ec1b90a5697d8f8c41ae781328e29bf (patch)
tree55c1d85bd01b36bd45d56815eb8eeca63b30e0f9 /tests
parenta76591a4be53b608c5cb9793227aa4a957a2f7b1 (diff)
tests/pm_rc6_residency: sanitize the RC6 enabled mask check
The way the test checks for the RC6 enabled mask atm doesn't work: calling igt_success outside of any subtests doesn't have any effect. This means the test will run a 11 second idle loop for each RC6 state regardless if the platform supports these or have them enabled. Fix this by checking explicitly if a given RC6 state is enabled before reading out/checking the corresponding counter. With this fix we can also get rid of the GEN6/IVB checks, since the RC6 mask check makes them redundant. We still need the VLV/CHV checks, since media RC6 doesn't have a separate bit in the mask. Signed-off-by: Imre Deak <imre.deak@intel.com> Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'tests')
-rw-r--r--tests/pm_rc6_residency.c71
1 files changed, 46 insertions, 25 deletions
diff --git a/tests/pm_rc6_residency.c b/tests/pm_rc6_residency.c
index 14573eb2..276fd41b 100644
--- a/tests/pm_rc6_residency.c
+++ b/tests/pm_rc6_residency.c
@@ -38,6 +38,10 @@
#define SLEEP_DURATION 3000 // in milliseconds
#define CODE_TIME 50 // in microseconfs
+#define RC6_ENABLED 1
+#define RC6P_ENABLED 2
+#define RC6PP_ENABLED 4
+
struct residencies {
int rc6;
int media_rc6;
@@ -61,29 +65,33 @@ static unsigned int readit(const char *path)
return ret;
}
+static unsigned long get_rc6_enabled_mask(void)
+{
+ unsigned long rc6_mask;
+ char *path;
+ int ret;
+
+ ret = asprintf(&path, "/sys/class/drm/card%d/power/rc6_enable",
+ drm_get_card());
+ igt_assert_neq(ret, -1);
+ rc6_mask = readit(path);
+ free(path);
+
+ return rc6_mask;
+}
+
static int read_rc6_residency(const char *name_of_rc6_residency)
{
unsigned int i;
const int device = drm_get_card();
char *path ;
int ret;
- FILE *file;
int value[2];
/* For some reason my ivb isn't idle even after syncing up with the gpu.
* Let's add a sleept just to make it happy. */
sleep(5);
- ret = asprintf(&path, "/sys/class/drm/card%d/power/rc6_enable", device);
- igt_assert_neq(ret, -1);
-
- file = fopen(path, "r");
- igt_require(file);
-
- /* claim success if no rc6 enabled. */
- if (readit(path) == 0)
- igt_success();
-
for(i = 0; i < 2; i++)
{
sleep(SLEEP_DURATION / 1000);
@@ -109,20 +117,26 @@ static void residency_accuracy(unsigned int diff,
"Sysfs RC6 residency counter is inaccurate.\n");
}
-static void measure_residencies(int devid, struct residencies *res)
+static void measure_residencies(int devid, unsigned int rc6_mask,
+ struct residencies *res)
{
- res->rc6 = read_rc6_residency("rc6");
- if (IS_VALLEYVIEW(devid) || IS_CHERRYVIEW(devid))
+ if (rc6_mask & RC6_ENABLED)
+ res->rc6 = read_rc6_residency("rc6");
+
+ if ((rc6_mask & RC6_ENABLED) &&
+ (IS_VALLEYVIEW(devid) || IS_CHERRYVIEW(devid)))
res->media_rc6 = read_rc6_residency("media_rc6");
- if (IS_GEN6(devid) || IS_IVYBRIDGE(devid)) {
+ if (rc6_mask & RC6P_ENABLED)
res->rc6p = read_rc6_residency("rc6p");
+
+ if (rc6_mask & RC6PP_ENABLED)
res->rc6pp = read_rc6_residency("rc6pp");
- }
}
igt_main
{
+ unsigned int rc6_mask;
int fd;
int devid = 0;
struct residencies res;
@@ -135,22 +149,29 @@ igt_main
devid = intel_get_drm_devid(fd);
close(fd);
- measure_residencies(devid, &res);
+ rc6_mask = get_rc6_enabled_mask();
+ measure_residencies(devid, rc6_mask, &res);
}
- igt_subtest("rc6-accuracy")
+ igt_subtest("rc6-accuracy") {
+ igt_skip_on(!(rc6_mask & RC6_ENABLED));
+
residency_accuracy(res.rc6, "rc6");
- igt_subtest("media-rc6-accuracy")
- if (IS_VALLEYVIEW(devid) || IS_CHERRYVIEW(devid))
- residency_accuracy(res.media_rc6, "media_rc6");
+ }
+ igt_subtest("media-rc6-accuracy") {
+ igt_skip_on(!((rc6_mask & RC6_ENABLED) &&
+ (IS_VALLEYVIEW(devid) || IS_CHERRYVIEW(devid))));
+
+ residency_accuracy(res.media_rc6, "media_rc6");
+ }
igt_subtest("rc6p-accuracy") {
- if (!IS_GEN6(devid) && !IS_IVYBRIDGE(devid))
- igt_skip("This platform doesn't support RC6p\n");
+ igt_skip_on(!(rc6_mask & RC6P_ENABLED));
+
residency_accuracy(res.rc6p, "rc6p");
}
igt_subtest("rc6pp-accuracy") {
- if (!IS_GEN6(devid) && !IS_IVYBRIDGE(devid))
- igt_skip("This platform doesn't support RC6pp\n");
+ igt_skip_on(!(rc6_mask & RC6PP_ENABLED));
+
residency_accuracy(res.rc6pp, "rc6pp");
}
}