[igt-dev] [PATCH i-g-t 19/20] tests/psr: Test PSR using interrupt timestamps.

Katarzyna Dec katarzyna.dec at intel.com
Thu Apr 12 12:56:12 UTC 2018


On Tue, Apr 10, 2018 at 07:37:31PM -0700, Dhinakaran Pandiyan wrote:
> Signed-off-by: Dhinakaran Pandiyan <dhinakaran.pandiyan at intel.com>
Please add more information about this test, why do we need it, what
we want to achieve with it.
This code looks good in general, but I am not experienced enough to
give r-b without others opinion and more info in commit msg.

Kasia
> ---
>  tests/kms_psr_sink_crc.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 86 insertions(+), 2 deletions(-)
> 
> diff --git a/tests/kms_psr_sink_crc.c b/tests/kms_psr_sink_crc.c
> index 147b492f..dd811fb0 100644
> --- a/tests/kms_psr_sink_crc.c
> +++ b/tests/kms_psr_sink_crc.c
> @@ -78,6 +78,11 @@ typedef struct {
>  	bool with_timestamps;
>  } data_t;
>  
> +struct timestamps {
> +	int64_t last_attempted_entry;
> +	int64_t last_exit;
> +};
> +
>  static void create_cursor_fb(data_t *data)
>  {
>  	cairo_t *cr;
> @@ -209,7 +214,9 @@ static void timestamp_support(data_t *data)
>  	igt_debugfs_read(data->drm_fd, "i915_edp_psr_status", buf);
>  	data->with_timestamps = strstr(buf, "Last exit at:");
>  	igt_debug("Time stamp support %d\n", data->with_timestamps);
> -	igt_sysfs_set(data->debugfs_fd, "i915_edp_psr_debug", "0");
> +
> +	if (!data->with_timestamps)
> +		igt_sysfs_set(data->debugfs_fd, "i915_edp_psr_debug", "0");
>  }
>  
>  static bool psr_enabled(data_t *data)
> @@ -304,6 +311,77 @@ static bool drrs_disabled(data_t *data)
>  	return !strstr(buf, "DRRS Supported: Yes\n");
>  }
>  
> +static inline void  __timestamp_read(int fd, int64_t *entry, int64_t *exit)
> +{
> +	int found;
> +	char buf[512];
> +	char *begin;
> +
> +	igt_debugfs_read(fd, "i915_edp_psr_status", buf);
> +
> +	begin = strstr(buf, "Last attempted entry at: ");
> +	igt_assert_f(begin, "Could not read timestamp\n");
> +	found = sscanf(begin, "Last attempted entry at: %ld", entry);
> +	igt_assert(found == 1);
> +
> +	begin = strstr(buf, "Last exit at: ");
> +	igt_assert_f(begin, "Could not read timestamp\n");
> +	found =	sscanf(begin, "Last exit at: %ld\n", exit);
> +	igt_assert(found == 1);
> +}
> +
> +static inline void assert_timestamp_entry(data_t *data, struct timestamps *pre)
> +{
> +	int timeout = 300; /* 3 seconds */
> +
> +	if (!data->with_timestamps)
> +		return;
> +
> +	do {
> +		__timestamp_read(data->drm_fd, &pre->last_attempted_entry,
> +				 &pre->last_exit);
> +		igt_debug("pre-condition: last attempted exit: %ld last exit: %ld\n",
> +			  pre->last_attempted_entry, pre->last_exit);
> +
> +		if (pre->last_attempted_entry > pre->last_exit)
> +			break;
> +
> +		usleep(10000);
> +	} while (--timeout);
> +
> +	/* FIXME: Wait for a few frames after attempted entry interrupts so that
> +	 * PSR becomes active. Check if PSR_STATUS can be polled for a more
> +	 * precise check.
> +	 */
> +	usleep(50000);
> +	igt_assert_f(timeout, "timed out waiting for PSR entry\n");
> +}
> +
> +static inline void assert_timestamp_exit(data_t *data, struct timestamps *pre)
> +{
> +	int64_t last_attempted_entry = 0, last_exit = 0;
> +	int timeout = 300; /* 3 seconds */
> +
> +	if (!data->with_timestamps)
> +		return;
> +
> +	do {
> +		__timestamp_read(data->drm_fd, &last_attempted_entry,
> +				 &last_exit);
> +		igt_debug("post trigger: last attempted entry: %ld last exit: %ld\n",
> +			  last_attempted_entry, last_exit);
> +
> +		igt_assert_f(pre->last_attempted_entry == last_attempted_entry,
> +			     "PSR was not active before the exit trigger or the test waited too long to check for exit\n");
> +
> +		if (last_exit > last_attempted_entry)
> +			break;
> +
> +		usleep(10000);
> +	} while (--timeout);
> +	igt_assert_f(timeout, "timedout waiting for PSR exit\n");
> +}
> +
>  static void run_test(data_t *data)
>  {
>  	uint32_t handle = data->fb_white.gem_handle;
> @@ -311,8 +389,10 @@ static void run_test(data_t *data)
>  	void *ptr;
>  	char ref_crc[CRC_LEN];
>  	const char *expected = "";
> +	struct timestamps pre = {0};
>  
> -	igt_require_f(igt_interactive_debug || data->with_sink_crc,
> +	igt_require_f(data->with_timestamps ||
> +		      igt_interactive_debug || data->with_sink_crc,
>  		      "Enable interactive debug with --interactive-debug or "
>  		      "enable sink crc with --sink-crc\n");
>  
> @@ -334,6 +414,7 @@ static void run_test(data_t *data)
>  	manual(test_plane->type == DRM_PLANE_TYPE_PRIMARY ?
>  	       "screen WHITE" : "WHITE box on GREEN");
>  	is_not_green_crc(data, ref_crc);
> +	assert_timestamp_entry(data, &pre);
>  
>  	switch (data->op) {
>  	case PAGE_FLIP:
> @@ -383,6 +464,8 @@ static void run_test(data_t *data)
>  		expected = "screen GREEN";
>  		break;
>  	}
> +
> +	assert_timestamp_exit(data, &pre);
>  	manual(expected);
>  	is_not_equal_crc(data, ref_crc);
>  }
> @@ -585,6 +668,7 @@ int main(int argc, char *argv[])
>  	}
>  
>  	igt_fixture {
> +		igt_sysfs_set(data.debugfs_fd, "i915_edp_psr_debug", "0");
>  		close(data.debugfs_fd);
>  		drm_intel_bufmgr_destroy(data.bufmgr);
>  		display_fini(&data);
> -- 
> 2.14.1
> 
> _______________________________________________
> igt-dev mailing list
> igt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/igt-dev


More information about the igt-dev mailing list