@@ -45,6 +45,7 @@ static int drm_fd;
static const char sysfs_base_path[] = "/sys/class/drm/card%d/gt_%s_freq_mhz";
enum {
CUR,
+ IDL,
MIN,
MAX,
RP0,
@@ -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 }, {"idl", "rb+", NULL }, { "min", "rb+", NULL }, { "max", "rb+", NULL }, { "RP0", "r", NULL }, { "RP1", "r", NULL }, { "RPn", "r", NULL }, { NULL, NULL, NULL }
};
static int readval(FILE *filp)
@@ -145,6 +146,7 @@ static int do_writeval(FILE *filp, int val, int lerrno, bool readback_check)
static void checkit(const int *freqs)
{
igt_assert_lte(freqs[MIN], freqs[MAX]);
+ igt_assert_lte(freqs[IDL], freqs[MIN]);
igt_assert_lte(freqs[CUR], freqs[MAX]);
igt_assert_lte(freqs[RPn], freqs[CUR]);
igt_assert_lte(freqs[RPn], freqs[MIN]);
@@ -160,6 +162,7 @@ static void matchit(const int *freqs1, const int *freqs2)
igt_assert_eq(freqs1[CUR], freqs2[CUR]);
igt_assert_eq(freqs1[MIN], freqs2[MIN]);
igt_assert_eq(freqs1[MAX], freqs2[MAX]);
+ igt_assert_eq(freqs1[IDL], freqs2[IDL]);
igt_assert_eq(freqs1[RP0], freqs2[RP0]);
igt_assert_eq(freqs1[RP1], freqs2[RP1]);
igt_assert_eq(freqs1[RPn], freqs2[RPn]);
@@ -379,19 +382,44 @@ static void min_max_config(void (*check)(void), bool load_gpu)
do_load_gpu();
check();
- igt_debug("\nSet min=RPn and max=RP0...\n");
+ igt_debug("\nSet idle=RPn, min=RPn and max=RP0...\n");
+ writeval(stuff[IDL].filp, origfreqs[RPn]);
writeval(stuff[MIN].filp, origfreqs[RPn]);
writeval(stuff[MAX].filp, origfreqs[RP0]);
if (load_gpu)
do_load_gpu();
check();
+ igt_debug("\nIncrease idle above min (invalid)...\n");
+ writeval_inval(stuff[IDL].filp, origfreqs[RPn] + 100);
+ if (load_gpu)
+ do_load_gpu();
+ check();
+
igt_debug("\nIncrease min to midpoint...\n");
writeval(stuff[MIN].filp, fmid);
if (load_gpu)
do_load_gpu();
check();
+ igt_debug("\nIncrease idle to midpoint...\n");
+ writeval(stuff[IDL].filp, fmid);
+ if (load_gpu)
+ do_load_gpu();
+ check();
+
+ igt_debug("\nDecrease min below idle (invalid)...\n");
+ writeval_inval(stuff[MIN].filp, fmid - 100);
+ if (load_gpu)
+ do_load_gpu();
+ check();
+
+ igt_debug("\nDecrease idle to RPn...\n");
+ writeval(stuff[IDL].filp, origfreqs[RPn]);
+ if (load_gpu)
+ do_load_gpu();
+ check();
+
igt_debug("\nIncrease min to RP0...\n");
writeval(stuff[MIN].filp, origfreqs[RP0]);
if (load_gpu)
@@ -476,13 +504,13 @@ static void idle_check(void)
read_freqs(freqs);
dump(freqs);
checkit(freqs);
- if (freqs[CUR] == freqs[RPn])
+ if (freqs[CUR] == freqs[IDL])
break;
usleep(1000 * IDLE_WAIT_TIMESTEP_MSEC);
wait += IDLE_WAIT_TIMESTEP_MSEC;
} while (wait < IDLE_WAIT_TIMEOUT_MSEC);
- igt_assert_eq(freqs[CUR], freqs[RPn]);
+ igt_assert_eq(freqs[CUR], freqs[IDL]);
igt_debug("Required %d msec to reach cur=idle\n", wait);
}
Signed-off-by: Micha? Winiarski <michal.winiarski@intel.com> --- tests/pm_rps.c | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-)