summaryrefslogtreecommitdiff
path: root/tests/pm_rps.c
diff options
context:
space:
mode:
authorImre Deak <imre.deak@intel.com>2014-12-04 16:40:19 +0200
committerImre Deak <imre.deak@intel.com>2014-12-08 12:36:28 +0200
commitaabf2d095269ae4cb8e77dd61e5c0c16e602c1d8 (patch)
treec9bf03e82cc4cde78d517aed200ce5ce1fe2f92f /tests/pm_rps.c
parent470071d4aba10f85b3728cf24acd792a273c1d28 (diff)
tests/pm_rps: vlv: wait for freq to settle
At least on VLV when forcing a new GT frequency by writing to the min/max freq sysfs entries the kernel doesn't wait until the new frequency settles, so the subsequent readback check might fail. To fix this wait until the current frequency is between the min/max values using a 10ms timeout. Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Imre Deak <imre.deak@intel.com>
Diffstat (limited to 'tests/pm_rps.c')
-rw-r--r--tests/pm_rps.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/tests/pm_rps.c b/tests/pm_rps.c
index 101f65d8..4429b2c5 100644
--- a/tests/pm_rps.c
+++ b/tests/pm_rps.c
@@ -34,6 +34,7 @@
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
+#include <time.h>
#include <sys/wait.h>
#include "drmtest.h"
@@ -87,6 +88,38 @@ static void read_freqs(int *freqs)
freqs[i] = readval(stuff[i].filp);
}
+static void nsleep(unsigned long ns)
+{
+ struct timespec ts;
+ int ret;
+
+ ts.tv_sec = 0;
+ ts.tv_nsec = ns;
+ do {
+ struct timespec rem;
+
+ ret = nanosleep(&ts, &rem);
+ igt_assert(ret == 0 || errno == EINTR);
+ ts = rem;
+ } while (ret && errno == EINTR);
+}
+
+static void wait_freq_settle(void)
+{
+ int timeout = 10;
+
+ while (1) {
+ int freqs[NUMFREQ];
+
+ read_freqs(freqs);
+ if (freqs[CUR] >= freqs[MIN] && freqs[CUR] <= freqs[MAX])
+ break;
+ nsleep(1000000);
+ if (!timeout--)
+ break;
+ }
+}
+
static int do_writeval(FILE *filp, int val, int lerrno)
{
int ret, orig;
@@ -102,6 +135,7 @@ static int do_writeval(FILE *filp, int val, int lerrno)
} else {
/* Expecting no error */
igt_assert_neq(ret, 0);
+ wait_freq_settle();
igt_assert(readval(filp) == val);
}