[Intel-gfx] [PATCH 2/2] igt/pm_rps: Add checks for freq = idle (RPn) in specific cases.

Imre Deak imre.deak at intel.com
Tue Dec 1 05:56:55 PST 2015


On ma, 2015-11-30 at 16:23 -0800, Bob Paauwe wrote:
> Now that the frequency can drop below the user specified minimum when
> the gpu is idle, add some checking to verify that it really does drop
> down to the RPn frequency in specific cases.
> 
> To do this, modify the main test flow to take two 'check' routines
> instead of one. When running the config-min-max-idle subtest make
> use of the second check routine to verify that the frequency drops
> to RPn instead of simply <= user min frequency.  For all other
> subtests, use the original check routines for both checks.
> 
> Signed-off-by: Bob Paauwe <bob.j.paauwe at intel.com>

I don't see the point. The frequency should always drop to the idle
frequency if the GPU is idle, it's not enough that it's below MIN-freq. 
So why do we need separate CUR-freq<=MIN-freq and CUR-freq==idle-freq
checks?

> ---
>  tests/pm_rps.c | 47 ++++++++++++++++++++++++++++++++++-------------
>  1 file changed, 34 insertions(+), 13 deletions(-)
> 
> diff --git a/tests/pm_rps.c b/tests/pm_rps.c
> index f919625..96225ce 100644
> --- a/tests/pm_rps.c
> +++ b/tests/pm_rps.c
> @@ -364,7 +364,7 @@ static int get_hw_rounded_freq(int target)
>  	return ret;
>  }
>  
> -static void min_max_config(void (*check)(void), bool load_gpu)
> +static void min_max_config(void (*check)(void), void
> (*check2)(void), bool load_gpu)
>  {
>  	int fmid = (origfreqs[RPn] + origfreqs[RP0]) / 2;
>  
> @@ -384,7 +384,7 @@ static void min_max_config(void (*check)(void),
> bool load_gpu)
>  	writeval(stuff[MAX].filp, origfreqs[RP0]);
>  	if (load_gpu)
>  		do_load_gpu();
> -	check();
> +	check2();
>  
>  	igt_debug("\nIncrease min to midpoint...\n");
>  	writeval(stuff[MIN].filp, fmid);
> @@ -412,7 +412,7 @@ static void min_max_config(void (*check)(void),
> bool load_gpu)
>  	writeval(stuff[MIN].filp, origfreqs[RPn]);
>  	if (load_gpu)
>  		do_load_gpu();
> -	check();
> +	check2();
>  
>  	igt_debug("\nDecrease min below RPn (invalid)...\n");
>  	writeval_inval(stuff[MIN].filp, 0);
> @@ -420,11 +420,11 @@ static void min_max_config(void (*check)(void),
> bool load_gpu)
>  
>  	igt_debug("\nDecrease max to midpoint...\n");
>  	writeval(stuff[MAX].filp, fmid);
> -	check();
> +	check2();
>  
>  	igt_debug("\nDecrease max to RPn...\n");
>  	writeval(stuff[MAX].filp, origfreqs[RPn]);
> -	check();
> +	check2();
>  
>  	igt_debug("\nDecrease max below RPn (invalid)...\n");
>  	writeval_inval(stuff[MAX].filp, 0);
> @@ -436,11 +436,11 @@ static void min_max_config(void (*check)(void),
> bool load_gpu)
>  
>  	igt_debug("\nIncrease max to midpoint...\n");
>  	writeval(stuff[MAX].filp, fmid);
> -	check();
> +	check2();
>  
>  	igt_debug("\nIncrease max to RP0...\n");
>  	writeval(stuff[MAX].filp, origfreqs[RP0]);
> -	check();
> +	check2();
>  
>  	igt_debug("\nIncrease max above RP0 (invalid)...\n");
>  	writeval_inval(stuff[MAX].filp, origfreqs[RP0] + 1000);
> @@ -461,7 +461,7 @@ static void basic_check(void)
>  
>  #define IDLE_WAIT_TIMESTEP_MSEC 100
>  #define IDLE_WAIT_TIMEOUT_MSEC 10000
> -static void idle_check(void)
> +static void idle_check_min(void)
>  {
>  	int freqs[NUMFREQ];
>  	int wait = 0;
> @@ -482,6 +482,27 @@ static void idle_check(void)
>  	igt_debug("Required %d msec to reach cur<=min\n", wait);
>  }
>  
> +static void idle_check_idle(void)
> +{
> +	int freqs[NUMFREQ];
> +	int wait = 0;
> +
> +	/* Monitor frequencies until cur settles down to min, which
> should
> +	 * happen within the allotted time */
> +	do {
> +		read_freqs(freqs);
> +		dump(freqs);
> +		checkit(freqs);
> +		if (freqs[CUR] == freqs[RPn])
> +			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_debug("Required %d msec to reach cur=idle\n", wait);
> +}
> +
>  #define LOADED_WAIT_TIMESTEP_MSEC 100
>  #define LOADED_WAIT_TIMEOUT_MSEC 3000
>  static void loaded_check(void)
> @@ -577,7 +598,7 @@ static void reset(void)
>  
>  	igt_debug("Removing load...\n");
>  	load_helper_stop();
> -	idle_check();
> +	idle_check_min();
>  }
>  
>  /*
> @@ -635,7 +656,7 @@ static void blocking(void)
>  	matchit(pre_freqs, post_freqs);
>  
>  	igt_debug("Removing load...\n");
> -	idle_check();
> +	idle_check_min();
>  }
>  
>  static void pm_rps_exit_handler(int sig)
> @@ -686,14 +707,14 @@ igt_main
>  	}
>  
>  	igt_subtest("basic-api")
> -		min_max_config(basic_check, false);
> +		min_max_config(basic_check, basic_check, false);
>  
>  	igt_subtest("min-max-config-idle")
> -		min_max_config(idle_check, true);
> +		min_max_config(idle_check_min, idle_check_idle,
> true);
>  
>  	igt_subtest("min-max-config-loaded") {
>  		load_helper_run(HIGH);
> -		min_max_config(loaded_check, false);
> +		min_max_config(loaded_check, loaded_check, false);
>  		load_helper_stop();
>  	}
>  


More information about the Intel-gfx mailing list