summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/pm_rps.c67
1 files changed, 42 insertions, 25 deletions
diff --git a/tests/pm_rps.c b/tests/pm_rps.c
index f0455e78..e79f0ea7 100644
--- a/tests/pm_rps.c
+++ b/tests/pm_rps.c
@@ -50,6 +50,7 @@ enum {
RP0,
RP1,
RPn,
+ BOOST,
NUMFREQ
};
@@ -60,7 +61,7 @@ struct junk {
const char *mode;
FILE *filp;
} stuff[] = {
- { "cur", "r", NULL }, { "min", "rb+", NULL }, { "max", "rb+", NULL }, { "RP0", "r", NULL }, { "RP1", "r", NULL }, { "RPn", "r", NULL }, { NULL, NULL, NULL }
+ { "cur", "r", NULL }, { "min", "rb+", NULL }, { "max", "rb+", NULL }, { "RP0", "r", NULL }, { "RP1", "r", NULL }, { "RPn", "r", NULL }, { "boost", "rb+", NULL }, { NULL, NULL, NULL }
};
static int readval(FILE *filp)
@@ -167,7 +168,7 @@ static void dump(const int *freqs)
}
enum load {
- LOW,
+ LOW = 0,
HIGH
};
@@ -185,9 +186,10 @@ static struct load_helper {
static void load_helper_signal_handler(int sig)
{
- if (sig == SIGUSR2)
- lh.load = lh.load == LOW ? HIGH : LOW;
- else
+ if (sig == SIGUSR2) {
+ lh.load = !lh.load;
+ igt_debug("Switching background load to %s\n", lh.load ? "high" : "low");
+ } else
lh.exit = true;
}
@@ -238,6 +240,7 @@ static void load_helper_run(enum load load)
return;
}
+ lh.exit = false;
lh.load = load;
igt_fork_helper(&lh.igt_proc) {
@@ -263,6 +266,8 @@ static void load_helper_run(enum load load)
if (intel_gen(lh.devid) >= 6)
execbuf.flags = I915_EXEC_BLT;
+ igt_debug("Applying %s load...\n", lh.load ? "high" : "low");
+
while (!lh.exit) {
memset(&object, 0, sizeof(object));
object.handle = fences[val%3];
@@ -296,6 +301,12 @@ static void load_helper_run(enum load load)
gem_close(drm_fd, fences[0]);
gem_close(drm_fd, fences[1]);
gem_close(drm_fd, fences[2]);
+
+ /* Idle/boost logic is tied with request retirement.
+ * Speed up detection of idle state and ensure deboost
+ * after removing load.
+ */
+ igt_drop_caches_set(drm_fd, DROP_RETIRE);
}
}
@@ -553,38 +564,43 @@ static void stabilize_check(int *out)
igt_debug("Waited %d msec to stabilize cur\n", wait);
}
-static void reset_gpu(void)
-{
- int fd = drm_open_driver(DRIVER_INTEL);
- igt_post_hang_ring(fd, igt_hang_ring(fd, I915_EXEC_DEFAULT));
- close(fd);
-}
-
static void boost_freq(int fd, int *boost_freqs)
{
int64_t timeout = 1;
- int ring = -1;
igt_spin_t *load;
+ unsigned int engine;
+ int fmid = (origfreqs[RPn] + origfreqs[RP0]) / 2;
- load = igt_spin_batch_new(fd, ring, 0);
+ fmid = get_hw_rounded_freq(fmid);
+ /* Set max freq to less then boost freq */
+ writeval(stuff[MAX].filp, fmid);
+ /* Put boost on the same engine as low load */
+ engine = I915_EXEC_RENDER;
+ if (intel_gen(lh.devid) >= 6)
+ engine = I915_EXEC_BLT;
+ load = igt_spin_batch_new(fd, engine, 0);
/* Waiting will grant us a boost to maximum */
gem_wait(fd, load->handle, &timeout);
read_freqs(boost_freqs);
dump(boost_freqs);
+ /* Avoid downlocking till boost request is pending */
+ igt_spin_batch_end(load);
+ gem_sync(fd, load->handle);
igt_spin_batch_free(fd, load);
+
+ /* Set max freq to original softmax */
+ writeval(stuff[MAX].filp, origfreqs[MAX]);
}
-static void waitboost(bool reset)
+static void waitboost(int fd, bool reset)
{
int pre_freqs[NUMFREQ];
int boost_freqs[NUMFREQ];
int post_freqs[NUMFREQ];
- int fd = drm_open_driver(DRIVER_INTEL);
-
load_helper_run(LOW);
igt_debug("Apply low load...\n");
@@ -593,7 +609,7 @@ static void waitboost(bool reset)
if (reset) {
igt_debug("Reset gpu...\n");
- reset_gpu();
+ igt_force_gpu_reset(fd);
sleep(1);
}
@@ -611,10 +627,9 @@ static void waitboost(bool reset)
idle_check();
igt_assert_lt(pre_freqs[CUR], pre_freqs[MAX]);
- igt_assert_eq(boost_freqs[CUR], boost_freqs[MAX]);
+ igt_assert_eq(boost_freqs[CUR], boost_freqs[BOOST]);
igt_assert_lt(post_freqs[CUR], post_freqs[MAX]);
- close(fd);
}
static void pm_rps_exit_handler(int sig)
@@ -657,7 +672,7 @@ igt_main
val = readval(junk->filp);
igt_assert(val >= 0);
junk++;
- } while(junk->name != NULL);
+ } while (junk->name != NULL);
read_freqs(origfreqs);
@@ -679,9 +694,11 @@ igt_main
}
igt_subtest("waitboost")
- waitboost(false);
-
- igt_subtest("reset")
- waitboost(true);
+ waitboost(drm_fd, false);
+ igt_subtest("reset") {
+ igt_hang_t hang = igt_allow_hang(drm_fd, 0, 0);
+ waitboost(drm_fd, true);
+ igt_disallow_hang(drm_fd, hang);
+ }
}