intel-gfx.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 01/12] tests/pm_psr: Update pm_psr for new psr debug interface.
@ 2014-09-04  1:29 Rodrigo Vivi
  2014-09-04  1:29 ` [PATCH 02/12] tests/kms_sink_crc_basic: Use igt_debugfs_fopen Rodrigo Vivi
                   ` (11 more replies)
  0 siblings, 12 replies; 19+ messages in thread
From: Rodrigo Vivi @ 2014-09-04  1:29 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi

v2: Doesn't duplicate kernel's HAS_PSR. skip based on debugfs output.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 tests/pm_psr.c | 30 +++++++++++++++++++++---------
 1 file changed, 21 insertions(+), 9 deletions(-)

diff --git a/tests/pm_psr.c b/tests/pm_psr.c
index 3ab7e7a..16ec3fa 100644
--- a/tests/pm_psr.c
+++ b/tests/pm_psr.c
@@ -32,6 +32,8 @@
 #include <errno.h>
 
 #include "drmtest.h"
+#include "intel_chipset.h"
+#include "igt_debugfs.h"
 
 #define SLEEP_DURATION 5000 // in milliseconds
 
@@ -41,22 +43,34 @@ static int get_perf(const char *path)
 	FILE *file;
 	char str[4];
 
-	file = fopen(path, "r");
-	igt_assert(file);
+	file = igt_debugfs_fopen("i915_edp_psr_status", "r");
+	igt_require(file);
 
 	ret = fscanf(file, "Sink_Support: %s\n", str);
 	igt_skip_on_f(ret == 0,
 		      "i915_edp_psr_status format not supported by this test case\n");
-	igt_require(strcmp(str, "yes") == 0);
+	igt_skip_on_f(strcmp(str, "yes") != 0,
+		      "PSR not supported on this platform\n");
+
 	ret = fscanf(file, "Source_OK: %s\n", str);
 	igt_assert(ret != 0);
-
 	igt_require(strcmp(str, "yes") == 0);
 
 	ret = fscanf(file, "Enabled: %s\n", str);
 	igt_assert(ret != 0);
 	igt_assert(strcmp(str, "yes") == 0);
 
+	ret = fscanf(file, "Active: %s\n", str);
+	igt_skip_on_f(ret == 0,
+		      "i915_edp_psr_status format not supported by this test case\n");
+
+	ret = fscanf(file, "Busy frontbuffer bits: %s\n", str);
+	igt_assert(ret != 0);
+	ret = fscanf(file, "Re-enable work scheduled: %s\n", str);
+	igt_assert(ret != 0);
+	ret = fscanf(file, "HW Enabled & Active bit: %s\n", str);
+	igt_assert(ret != 0);
+
 	ret = fscanf(file, "Performance_Counter: %i", &perf);
 	igt_assert(ret != 0);
 
@@ -68,15 +82,13 @@ static int get_perf(const char *path)
 
 igt_simple_main
 {
-	int ret, perf1, perf2;
-	int device = drm_get_card();
+	int perf1, perf2;
+	int drm_fd = drm_open_any();
+	uint32_t devid = intel_get_drm_devid(drm_fd);
 	char *path;
 
 	igt_skip_on_simulation();
 
-	ret = asprintf(&path, "/sys/kernel/debug/dri/%d/i915_edp_psr_status", device);
-	igt_assert(ret != -1);
-
 	perf1 = get_perf(path);
 	sleep(SLEEP_DURATION / 1000);
 	perf2 = get_perf(path);
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 02/12] tests/kms_sink_crc_basic: Use igt_debugfs_fopen
  2014-09-04  1:29 [PATCH 01/12] tests/pm_psr: Update pm_psr for new psr debug interface Rodrigo Vivi
@ 2014-09-04  1:29 ` Rodrigo Vivi
  2014-09-04  1:29 ` [PATCH 03/12] tests/kms_sink_crc_basic: Simplify test by using igt_kms functions Rodrigo Vivi
                   ` (10 subsequent siblings)
  11 siblings, 0 replies; 19+ messages in thread
From: Rodrigo Vivi @ 2014-09-04  1:29 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 tests/kms_sink_crc_basic.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/kms_sink_crc_basic.c b/tests/kms_sink_crc_basic.c
index 443f82e..3703dc1 100644
--- a/tests/kms_sink_crc_basic.c
+++ b/tests/kms_sink_crc_basic.c
@@ -52,7 +52,7 @@ typedef struct {
 
 static void get_crc(char *crc) {
 	int ret;
-	FILE *file = fopen("/sys/kernel/debug/dri/0/i915_sink_crc_eDP1", "r");
+	FILE *file = igt_debugfs_fopen("i915_sink_crc_eDP1", "r");
 	igt_require(file);
 
 	ret = fscanf(file, "%s\n", crc);
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 03/12] tests/kms_sink_crc_basic: Simplify test by using igt_kms functions
  2014-09-04  1:29 [PATCH 01/12] tests/pm_psr: Update pm_psr for new psr debug interface Rodrigo Vivi
  2014-09-04  1:29 ` [PATCH 02/12] tests/kms_sink_crc_basic: Use igt_debugfs_fopen Rodrigo Vivi
@ 2014-09-04  1:29 ` Rodrigo Vivi
  2014-09-09 23:09   ` [PATCH] " Rodrigo Vivi
  2014-09-09 23:09   ` [PATCH] tests/kms_sink_crc_basic: Wait 2 vblanks before grabing the new crc Rodrigo Vivi
  2014-09-04  1:29 ` [PATCH 04/12] tests/kms_psr_sink_crc: Fix edp_psr debugfs interface Rodrigo Vivi
                   ` (9 subsequent siblings)
  11 siblings, 2 replies; 19+ messages in thread
From: Rodrigo Vivi @ 2014-09-04  1:29 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 tests/kms_sink_crc_basic.c | 150 +++++++++++++++------------------------------
 1 file changed, 48 insertions(+), 102 deletions(-)

diff --git a/tests/kms_sink_crc_basic.c b/tests/kms_sink_crc_basic.c
index 3703dc1..e24220e 100644
--- a/tests/kms_sink_crc_basic.c
+++ b/tests/kms_sink_crc_basic.c
@@ -34,20 +34,15 @@
 #include "igt_debugfs.h"
 #include "igt_kms.h"
 
-enum color {
-	WHITE,
-	BLACK,
-	NUM_COLORS,
-};
-
-typedef struct {
-	struct kmstest_connector_config config;
-	struct igt_fb fb;
-} connector_t;
+#define CRC_BLACK "000000000000"
+#define CRC_RED   "c10100000000"
+#define CRC_GREEN "0000c1010000"
 
 typedef struct {
 	int drm_fd;
-	drmModeRes *resources;
+	igt_display_t display;
+	struct igt_fb fb_green, fb_red;
+	igt_plane_t *primary;
 } data_t;
 
 static void get_crc(char *crc) {
@@ -59,111 +54,64 @@ static void get_crc(char *crc) {
 	igt_require(ret > 0);
 
 	fclose(file);
-}
-
-static uint32_t create_fb(data_t *data,
-			  int w, int h,
-			  double r, double g, double b,
-			  struct igt_fb *fb)
-{
-	cairo_t *cr;
-	uint32_t fb_id;
-
-	fb_id = igt_create_fb(data->drm_fd, w, h,
-			      DRM_FORMAT_XRGB8888, I915_TILING_NONE, fb);
-	igt_assert(fb_id);
-
-	cr = igt_get_cairo_ctx(data->drm_fd, fb);
-	igt_paint_color(cr, 0, 0, w, h, r, g, b);
-	igt_assert(cairo_status(cr) == 0);
 
-	return fb_id;
+	/* Black screen is always invalid */
+	igt_assert(strcmp(crc, CRC_BLACK) != 0);
 }
 
-static bool
-connector_set_mode(data_t *data, connector_t *connector, drmModeModeInfo *mode,
-		   enum color crtc_color)
+static void basic_sink_crc_check(data_t *data)
 {
-	struct kmstest_connector_config *config = &connector->config;
-	unsigned int fb_id;
-	int ret;
-
-	if (crtc_color == WHITE)
-		fb_id = create_fb(data, mode->hdisplay, mode->vdisplay,
-				  1.0, 1.0, 1.0, &connector->fb);
-	else
-		fb_id = create_fb(data, mode->hdisplay, mode->vdisplay,
-				  0.0, 0.0, 0.0, &connector->fb);
-	igt_assert(fb_id);
-
-	ret = drmModeSetCrtc(data->drm_fd,
-			     config->crtc->crtc_id,
-			     connector->fb.fb_id,
-			     0, 0, /* x, y */
-			     &config->connector->connector_id,
-			     1,
-			     mode);
-	igt_assert(ret == 0);
-
-	return 0;
-}
-
-static void basic_sink_crc_check(data_t *data, uint32_t connector_id)
-{
-	connector_t connector;
-	char ref_crc_white[12];
-	char ref_crc_black[12];
-	char crc_check[12];
-
-	igt_require(kmstest_get_connector_config(data->drm_fd,
-						 connector_id,
-						 1 << 0,
-						 &connector.config));
+	char crc[12];
 
-	/*Go White*/
-	connector_set_mode(data, &connector, &connector.config.default_mode, WHITE);
+	/* Go Green */
+	igt_plane_set_fb(data->primary, &data->fb_green);
+	igt_display_commit(&data->display);
 
-	/* get reference crc for white color */
-	get_crc(ref_crc_white);
+	/* It should be Green */
+	get_crc(crc);
+	igt_assert(strcmp(crc, CRC_GREEN) == 0);
 
-	/* Go Black */
-	connector_set_mode(data, &connector, &connector.config.default_mode, BLACK);
+	/* Go Red */
+	igt_plane_set_fb(data->primary, &data->fb_red);
+	igt_display_commit(&data->display);
 
-	/* get reference crc for black color */
-	get_crc(ref_crc_black);
-
-	igt_assert(strcmp(ref_crc_black, ref_crc_white) != 0);
-
-	/*Go White again*/
-	connector_set_mode(data, &connector, &connector.config.default_mode, WHITE);
-
-	get_crc(crc_check);
-	igt_assert(strcmp(crc_check, ref_crc_white) == 0);
-
-	/* Go Black again */
-	connector_set_mode(data, &connector, &connector.config.default_mode, BLACK);
-
-	get_crc(crc_check);
-	igt_assert(strcmp(crc_check, ref_crc_black) == 0);
-
-	kmstest_free_connector_config(&connector.config);
+	/* It should be Red */
+	get_crc(crc);
+	igt_assert(strcmp(crc, CRC_RED) == 0);
 }
 
 static void run_test(data_t *data)
 {
-	int i;
-	drmModeConnectorPtr c;
-	uint32_t connector_id = 0;
+	igt_display_t *display = &data->display;
+	igt_output_t *output;
+	drmModeModeInfo *mode;
 
-	for (i = 0; i < data->resources->count_connectors; i++) {
-		connector_id = data->resources->connectors[i];
-		c = drmModeGetConnector(data->drm_fd, connector_id);
+	for_each_connected_output(display, output) {
+		drmModeConnectorPtr c = output->config.connector;
 
 		if (c->connector_type != DRM_MODE_CONNECTOR_eDP ||
 		    c->connection != DRM_MODE_CONNECTED)
 			continue;
 
-		basic_sink_crc_check(data, connector_id);
+		igt_output_set_pipe(output, PIPE_ANY);
+
+		mode = igt_output_get_mode(output);
+
+		igt_create_color_fb(data->drm_fd,
+				    mode->hdisplay, mode->vdisplay,
+				    DRM_FORMAT_XRGB8888, I915_TILING_X,
+				    0.0, 1.0, 0.0,
+				    &data->fb_green);
+
+		igt_create_color_fb(data->drm_fd,
+				    mode->hdisplay, mode->vdisplay,
+				    DRM_FORMAT_XRGB8888, I915_TILING_X,
+				    1.0, 0.0, 0.0,
+				    &data->fb_red);
+
+		data->primary = igt_output_get_plane(output, IGT_PLANE_PRIMARY);
+
+		basic_sink_crc_check(data);
 		return;
 	}
 
@@ -179,11 +127,9 @@ igt_simple_main
 	data.drm_fd = drm_open_any();
 
 	kmstest_set_vt_graphics_mode();
-
-	data.resources = drmModeGetResources(data.drm_fd);
-	igt_assert(data.resources);
+	igt_display_init(&data.display, data.drm_fd);
 
 	run_test(&data);
 
-	drmModeFreeResources(data.resources);
+	igt_display_fini(&data.display);
 }
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 04/12] tests/kms_psr_sink_crc: Fix edp_psr debugfs interface
  2014-09-04  1:29 [PATCH 01/12] tests/pm_psr: Update pm_psr for new psr debug interface Rodrigo Vivi
  2014-09-04  1:29 ` [PATCH 02/12] tests/kms_sink_crc_basic: Use igt_debugfs_fopen Rodrigo Vivi
  2014-09-04  1:29 ` [PATCH 03/12] tests/kms_sink_crc_basic: Simplify test by using igt_kms functions Rodrigo Vivi
@ 2014-09-04  1:29 ` Rodrigo Vivi
  2014-09-04  1:29 ` [PATCH 05/12] tests/kms_psr_sink_crc: Adding test debug options Rodrigo Vivi
                   ` (8 subsequent siblings)
  11 siblings, 0 replies; 19+ messages in thread
From: Rodrigo Vivi @ 2014-09-04  1:29 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi

Tests were broken on platforms that doesn't have psr or on new kernel that contains new interface.
A lot more need to be done to get these tests really useful, but for now lets avoid it breaking
tests framework.

v2: Doesn't duplicate kernel's HAS_PSR. skip based on debugfs output.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 tests/kms_psr_sink_crc.c | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/tests/kms_psr_sink_crc.c b/tests/kms_psr_sink_crc.c
index 49f9549..0917a7f 100644
--- a/tests/kms_psr_sink_crc.c
+++ b/tests/kms_psr_sink_crc.c
@@ -258,7 +258,7 @@ static void fill_render(data_t *data, uint32_t handle,
 	gem_bo_busy(data->drm_fd, handle);
 }
 
-static bool psr_sink_support(data_t *data)
+static bool psr_enabled(data_t *data)
 {
 	int ret;
 	FILE *file;
@@ -268,14 +268,17 @@ static bool psr_sink_support(data_t *data)
 	igt_require(file);
 
 	ret = fscanf(file, "Sink_Support: %s\n", str);
-	igt_skip_on_f(ret == 0,
-		      "i915_edp_psr_status format not supported by this test case\n");
+	igt_assert(ret != 0);
+	ret = fscanf(file, "Source_OK: %s\n", str);
+	igt_assert(ret != 0);
+	ret = fscanf(file, "Enabled: %s\n", str);
+	igt_assert(ret != 0);
 
 	fclose(file);
 	return strcmp(str, "yes") == 0;
 }
 
-static bool psr_enabled(data_t *data)
+static bool psr_active(data_t *data)
 {
 	int ret;
 	FILE *file;
@@ -286,12 +289,18 @@ static bool psr_enabled(data_t *data)
 
 	ret = fscanf(file, "Sink_Support: %s\n", str);
 	igt_assert(ret != 0);
-
 	ret = fscanf(file, "Source_OK: %s\n", str);
 	igt_assert(ret != 0);
-
 	ret = fscanf(file, "Enabled: %s\n", str);
 	igt_assert(ret != 0);
+	ret = fscanf(file, "Active: %s\n", str);
+	igt_assert(ret != 0);
+	ret = fscanf(file, "Busy frontbuffer bits: %s\n", str);
+	igt_assert(ret != 0);
+	ret = fscanf(file, "Re-enable work scheduled: %s\n", str);
+	igt_assert(ret != 0);
+	ret = fscanf(file, "HW Enabled & Active bit: %s\n", str);
+	igt_assert(ret != 0);
 
 	fclose(file);
 	return strcmp(str, "yes") == 0;
@@ -300,7 +309,7 @@ static bool psr_enabled(data_t *data)
 static bool wait_psr_entry(data_t *data, int timeout)
 {
 	while (timeout--) {
-		if (psr_enabled(data))
+		if (psr_active(data))
 			return true;
 		sleep(1);
 	}
@@ -512,8 +521,6 @@ static void test_sprite(data_t *data)
 	igt_output_t *output;
 	drmModeModeInfo *mode;
 
-	igt_skip_on(IS_HASWELL(data->devid));
-
 	for_each_connected_output(display, output) {
 		drmModeConnectorPtr c = output->config.connector;
 
@@ -592,7 +599,7 @@ igt_main
 
 		data.devid = intel_get_drm_devid(data.drm_fd);
 
-		igt_require(psr_sink_support(&data));
+		igt_skip_on(!psr_enabled(&data));
 
 		data.bufmgr = drm_intel_bufmgr_gem_init(data.drm_fd, 4096);
 		igt_assert(data.bufmgr);
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 05/12] tests/kms_psr_sink_crc: Adding test debug options
  2014-09-04  1:29 [PATCH 01/12] tests/pm_psr: Update pm_psr for new psr debug interface Rodrigo Vivi
                   ` (2 preceding siblings ...)
  2014-09-04  1:29 ` [PATCH 04/12] tests/kms_psr_sink_crc: Fix edp_psr debugfs interface Rodrigo Vivi
@ 2014-09-04  1:29 ` Rodrigo Vivi
  2014-09-04  1:30 ` [PATCH 06/12] tests/kms_psr_sink_crc: Removing context tests Rodrigo Vivi
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 19+ messages in thread
From: Rodrigo Vivi @ 2014-09-04  1:29 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi

Just to make life easier and be eable to easily test with
PSR disabled to know exactly what to expect when running it
for real

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 tests/kms_psr_sink_crc.c | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/tests/kms_psr_sink_crc.c b/tests/kms_psr_sink_crc.c
index 0917a7f..01521bb 100644
--- a/tests/kms_psr_sink_crc.c
+++ b/tests/kms_psr_sink_crc.c
@@ -57,6 +57,11 @@ enum tests {
 	TEST_SPRITE,
 };
 
+#define DEBUG_CRC 0
+
+/* This is usefull to debug and know what should be expected */
+#define RUNNING_WITH_PSR_DISABLED 0
+
 typedef struct {
 	int drm_fd;
 	enum tests test;
@@ -264,6 +269,9 @@ static bool psr_enabled(data_t *data)
 	FILE *file;
 	char str[4];
 
+	if (RUNNING_WITH_PSR_DISABLED)
+		return true;
+
 	file = igt_debugfs_fopen("i915_edp_psr_status", "r");
 	igt_require(file);
 
@@ -284,6 +292,9 @@ static bool psr_active(data_t *data)
 	FILE *file;
 	char str[4];
 
+	if (RUNNING_WITH_PSR_DISABLED)
+		return true;
+
 	file = igt_debugfs_fopen("i915_edp_psr_status", "r");
 	igt_require(file);
 
@@ -327,6 +338,16 @@ static void get_sink_crc(data_t *data, char *crc) {
 	igt_require(ret > 0);
 
 	fclose(file);
+
+	if (DEBUG_CRC) {
+		fprintf(stderr, "%s\n", crc);
+		sleep(1);
+	}
+
+	/* The important value was already taken.
+	 * Now give a time for human eyes
+	 */
+	usleep(300000);
 }
 
 static void test_crc(data_t *data)
@@ -342,7 +363,6 @@ static void test_crc(data_t *data)
 					     1, 1) == 0);
 	}
 
-	usleep(300000);
 	igt_assert(wait_psr_entry(data, 10));
 	get_sink_crc(data, ref_crc);
 
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 06/12] tests/kms_psr_sink_crc: Removing context tests.
  2014-09-04  1:29 [PATCH 01/12] tests/pm_psr: Update pm_psr for new psr debug interface Rodrigo Vivi
                   ` (3 preceding siblings ...)
  2014-09-04  1:29 ` [PATCH 05/12] tests/kms_psr_sink_crc: Adding test debug options Rodrigo Vivi
@ 2014-09-04  1:30 ` Rodrigo Vivi
  2014-09-04  1:30 ` [PATCH 07/12] tests/kms_psr_sink_crc: Cleaning up tests a bit Rodrigo Vivi
                   ` (6 subsequent siblings)
  11 siblings, 0 replies; 19+ messages in thread
From: Rodrigo Vivi @ 2014-09-04  1:30 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi

This tests are unecessary. Mainly now with the software tracking for PSR.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 tests/kms_psr_sink_crc.c | 69 +++---------------------------------------------
 1 file changed, 3 insertions(+), 66 deletions(-)

diff --git a/tests/kms_psr_sink_crc.c b/tests/kms_psr_sink_crc.c
index 01521bb..ee5ad81 100644
--- a/tests/kms_psr_sink_crc.c
+++ b/tests/kms_psr_sink_crc.c
@@ -47,12 +47,10 @@ enum tests {
 	TEST_SETDOMAIN_WAIT_WRITE_CPU,
 	TEST_BLT,
 	TEST_RENDER,
-	TEST_CONTEXT,
 	TEST_PAGE_FLIP_AND_MMAP_CPU,
 	TEST_PAGE_FLIP_AND_MMAP_GTT,
 	TEST_PAGE_FLIP_AND_BLT,
 	TEST_PAGE_FLIP_AND_RENDER,
-	TEST_PAGE_FLIP_AND_CONTEXT,
 	TEST_CURSOR_MOVE,
 	TEST_SPRITE,
 };
@@ -67,7 +65,6 @@ typedef struct {
 	enum tests test;
 	drmModeRes *resources;
 	drm_intel_bufmgr *bufmgr;
-	drm_intel_context *ctx[2];
 	uint32_t devid;
 	uint32_t handle[2];
 	uint32_t crtc_id;
@@ -91,12 +88,10 @@ static const char *tests_str(enum tests test)
 		[TEST_SETDOMAIN_WAIT_WRITE_CPU] = "setdomain_wait_write_cpu",
 		[TEST_BLT] = "blt",
 		[TEST_RENDER] = "render",
-		[TEST_CONTEXT] = "context",
 		[TEST_PAGE_FLIP_AND_MMAP_CPU] = "page_flip_and_mmap_cpu",
 		[TEST_PAGE_FLIP_AND_MMAP_GTT] = "page_flip_and_mmap_gtt",
 		[TEST_PAGE_FLIP_AND_BLT] = "page_flip_and_blt",
 		[TEST_PAGE_FLIP_AND_RENDER] = "page_flip_and_render",
-		[TEST_PAGE_FLIP_AND_CONTEXT] = "page_flip_and_context",
 		[TEST_CURSOR_MOVE] = "cursor_move",
 		[TEST_SPRITE] = "sprite",
 	};
@@ -206,31 +201,7 @@ static void scratch_buf_init(struct igt_buf *buf, drm_intel_bo *bo)
 	buf->size = 4096;
 }
 
-static void exec_nop(data_t *data, uint32_t handle, drm_intel_context *context)
-{
-	drm_intel_bo *dst;
-	struct intel_batchbuffer *batch;
-
-	dst = gem_handle_to_libdrm_bo(data->bufmgr, data->drm_fd, "", handle);
-	igt_assert(dst);
-
-	batch = intel_batchbuffer_alloc(data->bufmgr, data->devid);
-	igt_assert(batch);
-
-	/* add the reloc to make sure the kernel will think we write to dst */
-	BEGIN_BATCH(4, 1);
-	OUT_BATCH(MI_BATCH_BUFFER_END);
-	OUT_BATCH(MI_NOOP);
-	OUT_RELOC(dst, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0);
-	OUT_BATCH(MI_NOOP);
-	ADVANCE_BATCH();
-
-	intel_batchbuffer_flush_with_context(batch, context);
-	intel_batchbuffer_free(batch);
-}
-
-static void fill_render(data_t *data, uint32_t handle,
-			drm_intel_context *context, unsigned char color)
+static void fill_render(data_t *data, uint32_t handle, unsigned char color)
 {
 	drm_intel_bo *src, *dst;
 	struct intel_batchbuffer *batch;
@@ -254,7 +225,7 @@ static void fill_render(data_t *data, uint32_t handle,
 	batch = intel_batchbuffer_alloc(data->bufmgr, data->devid);
 	igt_assert(batch);
 
-	rendercopy(batch, context,
+	rendercopy(batch, NULL,
 		   &src_buf, 0, 0, 1, 1,
 		   &dst_buf, 0, 0);
 
@@ -444,13 +415,8 @@ static void test_crc(data_t *data)
 		fill_blt(data, handle, 0xff);
 		break;
 	case TEST_RENDER:
-	case TEST_CONTEXT:
 	case TEST_PAGE_FLIP_AND_RENDER:
-	case TEST_PAGE_FLIP_AND_CONTEXT:
-		fill_render(data, handle,
-			    (data->test == TEST_CONTEXT ||
-			     data->test == TEST_PAGE_FLIP_AND_CONTEXT) ?
-			    data->ctx[1] : NULL, 0xff);
+		fill_render(data, handle, 0xff);
 		break;
 	case TEST_CURSOR_MOVE:
 		igt_assert(drmModeMoveCursor(data->drm_fd, data->crtc_id, 1, 2) == 0);
@@ -499,42 +465,15 @@ static bool prepare_crtc(data_t *data, uint32_t connector_id)
 	connector_set_mode(data, &data->config.default_mode,
 			   data->fb_id[1]);
 
-	if (data->test == TEST_CONTEXT ||
-	    data->test == TEST_PAGE_FLIP_AND_CONTEXT) {
-		data->ctx[0] = drm_intel_gem_context_create(data->bufmgr);
-		igt_require(data->ctx[0]);
-		data->ctx[1] = drm_intel_gem_context_create(data->bufmgr);
-		igt_require(data->ctx[1]);
-
-		exec_nop(data, data->handle[0], data->ctx[1]);
-		exec_nop(data, data->handle[0], data->ctx[0]);
-		exec_nop(data, data->handle[0], data->ctx[1]);
-		exec_nop(data, data->handle[0], data->ctx[0]);
-	}
-
 	/* scanout = fb[0] */
 	connector_set_mode(data, &data->config.default_mode,
 			   data->fb_id[0]);
 
-	if (data->test == TEST_CONTEXT ||
-	    data->test == TEST_PAGE_FLIP_AND_CONTEXT) {
-		exec_nop(data, data->fb[0].gem_handle, data->ctx[0]);
-	}
-
 	kmstest_free_connector_config(&data->config);
 
 	return true;
 }
 
-static void finish_crtc(data_t *data)
-{
-	if (data->test == TEST_CONTEXT ||
-	    data->test == TEST_PAGE_FLIP_AND_CONTEXT) {
-		drm_intel_gem_context_destroy(data->ctx[0]);
-		drm_intel_gem_context_destroy(data->ctx[1]);
-	}
-}
-
 static void test_sprite(data_t *data)
 {
 	igt_display_t *display = &data->display;
@@ -600,8 +539,6 @@ static void run_test(data_t *data)
 				continue;
 
 			test_crc(data);
-
-			finish_crtc(data);
 		}
 	}
 }
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 07/12] tests/kms_psr_sink_crc: Cleaning up tests a bit
  2014-09-04  1:29 [PATCH 01/12] tests/pm_psr: Update pm_psr for new psr debug interface Rodrigo Vivi
                   ` (4 preceding siblings ...)
  2014-09-04  1:30 ` [PATCH 06/12] tests/kms_psr_sink_crc: Removing context tests Rodrigo Vivi
@ 2014-09-04  1:30 ` Rodrigo Vivi
  2014-09-04  1:30 ` [PATCH 08/12] tests/kms_psr_sink_crc: Start splitting tests in test_planes and operations Rodrigo Vivi
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 19+ messages in thread
From: Rodrigo Vivi @ 2014-09-04  1:30 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi

This is needed to be able to split tests in a matrix that tests different
input/write methods and operations for different type of planes.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 tests/kms_psr_sink_crc.c | 67 ------------------------------------------------
 1 file changed, 67 deletions(-)

diff --git a/tests/kms_psr_sink_crc.c b/tests/kms_psr_sink_crc.c
index ee5ad81..5da6137 100644
--- a/tests/kms_psr_sink_crc.c
+++ b/tests/kms_psr_sink_crc.c
@@ -41,16 +41,8 @@ enum tests {
 	TEST_PAGE_FLIP,
 	TEST_MMAP_CPU,
 	TEST_MMAP_GTT,
-	TEST_MMAP_GTT_NO_BUSY,
-	TEST_MMAP_GTT_WAITING_NO_BUSY,
-	TEST_SETDOMAIN_WAIT_WRITE_GTT,
-	TEST_SETDOMAIN_WAIT_WRITE_CPU,
 	TEST_BLT,
 	TEST_RENDER,
-	TEST_PAGE_FLIP_AND_MMAP_CPU,
-	TEST_PAGE_FLIP_AND_MMAP_GTT,
-	TEST_PAGE_FLIP_AND_BLT,
-	TEST_PAGE_FLIP_AND_RENDER,
 	TEST_CURSOR_MOVE,
 	TEST_SPRITE,
 };
@@ -82,16 +74,8 @@ static const char *tests_str(enum tests test)
 		[TEST_PAGE_FLIP] = "page_flip",
 		[TEST_MMAP_CPU] = "mmap_cpu",
 		[TEST_MMAP_GTT] = "mmap_gtt",
-		[TEST_MMAP_GTT_NO_BUSY] = "mmap_gtt_no_busy",
-		[TEST_MMAP_GTT_WAITING_NO_BUSY] = "mmap_gtt_waiting_no_busy",
-		[TEST_SETDOMAIN_WAIT_WRITE_GTT] = "setdomain_wait_write_gtt",
-		[TEST_SETDOMAIN_WAIT_WRITE_CPU] = "setdomain_wait_write_cpu",
 		[TEST_BLT] = "blt",
 		[TEST_RENDER] = "render",
-		[TEST_PAGE_FLIP_AND_MMAP_CPU] = "page_flip_and_mmap_cpu",
-		[TEST_PAGE_FLIP_AND_MMAP_GTT] = "page_flip_and_mmap_gtt",
-		[TEST_PAGE_FLIP_AND_BLT] = "page_flip_and_blt",
-		[TEST_PAGE_FLIP_AND_RENDER] = "page_flip_and_render",
 		[TEST_CURSOR_MOVE] = "cursor_move",
 		[TEST_SPRITE] = "sprite",
 	};
@@ -343,10 +327,6 @@ static void test_crc(data_t *data)
 		igt_assert(drmModePageFlip(data->drm_fd, data->crtc_id,
 					   data->fb_id[1], 0, NULL) == 0);
 		break;
-	case TEST_PAGE_FLIP_AND_MMAP_CPU:
-		handle = data->handle[1];
-		igt_assert(drmModePageFlip(data->drm_fd, data->crtc_id,
-					   data->fb_id[1], 0, NULL) == 0);
 	case TEST_MMAP_CPU:
 		ptr = gem_mmap__cpu(data->drm_fd, handle, 4096, PROT_WRITE);
 		gem_set_domain(data->drm_fd, handle,
@@ -357,10 +337,6 @@ static void test_crc(data_t *data)
 		sleep(1);
 		gem_sw_finish(data->drm_fd, handle);
 		break;
-	case TEST_PAGE_FLIP_AND_MMAP_GTT:
-		handle = data->handle[1];
-		igt_assert(drmModePageFlip(data->drm_fd, data->crtc_id,
-					   data->fb_id[1], 0, NULL) == 0);
 	case TEST_MMAP_GTT:
 		ptr = gem_mmap__gtt(data->drm_fd, handle, 4096, PROT_WRITE);
 		gem_set_domain(data->drm_fd, handle,
@@ -369,53 +345,10 @@ static void test_crc(data_t *data)
 		munmap(ptr, 4096);
 		gem_bo_busy(data->drm_fd, handle);
 		break;
-	case TEST_MMAP_GTT_NO_BUSY:
-		ptr = gem_mmap__gtt(data->drm_fd, handle, 4096, PROT_WRITE);
-		gem_set_domain(data->drm_fd, handle,
-			       I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
-		memset(ptr, 0xff, 4);
-		munmap(ptr, 4096);
-		break;
-	case TEST_MMAP_GTT_WAITING_NO_BUSY:
-		ptr = gem_mmap__gtt(data->drm_fd, handle, 4096, PROT_WRITE);
-		gem_set_domain(data->drm_fd, handle,
-			       I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
-		igt_info("Sleeping for 10 sec...\n");
-                sleep(10);
-		memset(ptr, 0xff, 4);
-		munmap(ptr, 4096);
-		break;
-	case TEST_SETDOMAIN_WAIT_WRITE_GTT:
-		ptr = gem_mmap__gtt(data->drm_fd, handle, 4096, PROT_WRITE);
-		fill_blt(data, handle, 0xff);
-		igt_assert(wait_psr_entry(data, 10));
-		get_sink_crc(data, ref_crc);
-		gem_set_domain(data->drm_fd, handle,
-			       I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
-		igt_info("Sleeping for 10 sec...\n");
-		sleep(10);
-		memset(ptr, 0xff, 4);
-		munmap(ptr, 4096);
-		break;
-	case TEST_SETDOMAIN_WAIT_WRITE_CPU:
-		ptr = gem_mmap__cpu(data->drm_fd, handle, 4096, PROT_WRITE);
-		fill_blt(data, handle, 0xff);
-		igt_assert(wait_psr_entry(data, 10));
-		get_sink_crc(data, ref_crc);
-		gem_set_domain(data->drm_fd, handle,
-			       I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
-		igt_info("Sleeping for 10 sec...\n");
-		sleep(10);
-		memset(ptr, 0xff, 4);
-		munmap(ptr, 4096);
-		gem_sw_finish(data->drm_fd, handle);
-		break;
 	case TEST_BLT:
-	case TEST_PAGE_FLIP_AND_BLT:
 		fill_blt(data, handle, 0xff);
 		break;
 	case TEST_RENDER:
-	case TEST_PAGE_FLIP_AND_RENDER:
 		fill_render(data, handle, 0xff);
 		break;
 	case TEST_CURSOR_MOVE:
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 08/12] tests/kms_psr_sink_crc: Start splitting tests in test_planes and operations.
  2014-09-04  1:29 [PATCH 01/12] tests/pm_psr: Update pm_psr for new psr debug interface Rodrigo Vivi
                   ` (5 preceding siblings ...)
  2014-09-04  1:30 ` [PATCH 07/12] tests/kms_psr_sink_crc: Cleaning up tests a bit Rodrigo Vivi
@ 2014-09-04  1:30 ` Rodrigo Vivi
  2014-09-04  1:30 ` [PATCH 09/12] tests/kms_psr_sink_crc: Fix all testcases Rodrigo Vivi
                   ` (4 subsequent siblings)
  11 siblings, 0 replies; 19+ messages in thread
From: Rodrigo Vivi @ 2014-09-04  1:30 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi

This will allow us to test input/write oprations on any kind of plane.

At this point PLANE_ONOF is just the new name of TEST_SPRITE and
PLANE_MOVE is the one for TEST_CURSOR_MOVE. They will be extended and fixed
on the following patche(s).

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 tests/kms_psr_sink_crc.c | 110 +++++++++++++++++++++++++++++------------------
 1 file changed, 69 insertions(+), 41 deletions(-)

diff --git a/tests/kms_psr_sink_crc.c b/tests/kms_psr_sink_crc.c
index 5da6137..4358889 100644
--- a/tests/kms_psr_sink_crc.c
+++ b/tests/kms_psr_sink_crc.c
@@ -37,24 +37,48 @@
 #include "igt_debugfs.h"
 #include "igt_kms.h"
 
-enum tests {
-	TEST_PAGE_FLIP,
-	TEST_MMAP_CPU,
-	TEST_MMAP_GTT,
-	TEST_BLT,
-	TEST_RENDER,
-	TEST_CURSOR_MOVE,
-	TEST_SPRITE,
-};
-
 #define DEBUG_CRC 0
 
 /* This is usefull to debug and know what should be expected */
 #define RUNNING_WITH_PSR_DISABLED 0
 
+enum planes {
+	PRIMARY,
+	SPRITE,
+	CURSOR,
+};
+
+enum operations {
+	PAGE_FLIP,
+	MMAP_GTT,
+	MMAP_GTT_WAITING,
+	MMAP_CPU,
+	BLT,
+	RENDER,
+	PLANE_MOVE,
+	PLANE_ONOFF,
+};
+
+static const char *op_str(enum operations op)
+{
+	static const char * const name[] = {
+		[PAGE_FLIP] = "page_flip",
+		[MMAP_GTT] = "mmap_gtt",
+		[MMAP_GTT_WAITING] = "mmap_gtt_waiting",
+		[MMAP_CPU] = "mmap_cpu",
+		[BLT] = "blt",
+		[RENDER] = "render",
+		[PLANE_MOVE] = "plane_move",
+		[PLANE_ONOFF] = "plane_onoff",
+	};
+
+	return name[op];
+}
+
 typedef struct {
 	int drm_fd;
-	enum tests test;
+	enum planes test_plane;
+	enum operations op;
 	drmModeRes *resources;
 	drm_intel_bufmgr *bufmgr;
 	uint32_t devid;
@@ -68,21 +92,6 @@ typedef struct {
 	igt_plane_t *plane[2];
 } data_t;
 
-static const char *tests_str(enum tests test)
-{
-	static const char * const testss[] = {
-		[TEST_PAGE_FLIP] = "page_flip",
-		[TEST_MMAP_CPU] = "mmap_cpu",
-		[TEST_MMAP_GTT] = "mmap_gtt",
-		[TEST_BLT] = "blt",
-		[TEST_RENDER] = "render",
-		[TEST_CURSOR_MOVE] = "cursor_move",
-		[TEST_SPRITE] = "sprite",
-	};
-
-	return testss[test];
-}
-
 static uint32_t create_fb(data_t *data,
 			  int w, int h,
 			  double r, double g, double b,
@@ -311,7 +320,7 @@ static void test_crc(data_t *data)
 	char ref_crc[12];
 	char crc[12];
 
-	if (data->test == TEST_CURSOR_MOVE) {
+	if (data->op == PLANE_MOVE) {
 		igt_assert(drmModeSetCursor(data->drm_fd, data->crtc_id,
 					    handle, 64, 64) == 0);
 		igt_assert(drmModeMoveCursor(data->drm_fd, data->crtc_id,
@@ -321,13 +330,13 @@ static void test_crc(data_t *data)
 	igt_assert(wait_psr_entry(data, 10));
 	get_sink_crc(data, ref_crc);
 
-	switch (data->test) {
+	switch (data->op) {
 		void *ptr;
-	case TEST_PAGE_FLIP:
+	case PAGE_FLIP:
 		igt_assert(drmModePageFlip(data->drm_fd, data->crtc_id,
 					   data->fb_id[1], 0, NULL) == 0);
 		break;
-	case TEST_MMAP_CPU:
+	case MMAP_CPU:
 		ptr = gem_mmap__cpu(data->drm_fd, handle, 4096, PROT_WRITE);
 		gem_set_domain(data->drm_fd, handle,
 			       I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
@@ -337,7 +346,8 @@ static void test_crc(data_t *data)
 		sleep(1);
 		gem_sw_finish(data->drm_fd, handle);
 		break;
-	case TEST_MMAP_GTT:
+	case MMAP_GTT:
+	case MMAP_GTT_WAITING:
 		ptr = gem_mmap__gtt(data->drm_fd, handle, 4096, PROT_WRITE);
 		gem_set_domain(data->drm_fd, handle,
 			       I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
@@ -345,16 +355,16 @@ static void test_crc(data_t *data)
 		munmap(ptr, 4096);
 		gem_bo_busy(data->drm_fd, handle);
 		break;
-	case TEST_BLT:
+	case BLT:
 		fill_blt(data, handle, 0xff);
 		break;
-	case TEST_RENDER:
+	case RENDER:
 		fill_render(data, handle, 0xff);
 		break;
-	case TEST_CURSOR_MOVE:
+	case PLANE_MOVE:
 		igt_assert(drmModeMoveCursor(data->drm_fd, data->crtc_id, 1, 2) == 0);
 		break;
-	case TEST_SPRITE:
+	case PLANE_ONOFF:
 		igt_plane_set_fb(data->plane[0], &data->fb[0]);
 		igt_display_commit(&data->display);
 		igt_plane_set_fb(data->plane[1], &data->fb[1]);
@@ -382,7 +392,7 @@ static bool prepare_crtc(data_t *data, uint32_t connector_id)
 				   0.0, 1.0, 0.0, &data->fb[0]);
 	igt_assert(data->fb_id[0]);
 
-	if (data->test == TEST_CURSOR_MOVE)
+	if (data->op == PLANE_MOVE)
 		create_cursor_fb(data, &data->fb[0]);
 
 	data->fb_id[1] = create_fb(data,
@@ -452,7 +462,7 @@ static void run_test(data_t *data)
 	 * crtcs = IS_VALLEYVIEW(data->devid)? 2 : 1; */
 	int crtcs = 1;
 
-	if (data->test == TEST_SPRITE) {
+	if (data->op == PLANE_ONOFF) {
 		test_sprite(data);
 		return;
 	}
@@ -477,7 +487,7 @@ static void run_test(data_t *data)
 }
 
 data_t data = {};
-enum tests test;
+enum operations op;
 
 igt_main
 {
@@ -498,9 +508,27 @@ igt_main
 		display_init(&data);
 	}
 
-	for (test = TEST_PAGE_FLIP; test <= TEST_SPRITE; test++) {
-		igt_subtest_f("%s", tests_str(test)) {
-			data.test = test;
+
+	for (op = PAGE_FLIP; op <= RENDER; op++) {
+		igt_subtest_f("primary_%s", op_str(op)) {
+			data.test_plane = PRIMARY;
+			data.op = op;
+			run_test(&data);
+		}
+	}
+
+	for (op = PLANE_ONOFF; op <= PLANE_ONOFF; op++) {
+		igt_subtest_f("sprite_%s", op_str(op)) {
+			data.test_plane = SPRITE;
+			data.op = op;
+			run_test(&data);
+		}
+	}
+
+	for (op = PLANE_MOVE; op <= PLANE_MOVE; op++) {
+		igt_subtest_f("cursor_%s", op_str(op)) {
+			data.test_plane = CURSOR;
+			data.op = op;
 			run_test(&data);
 		}
 	}
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 09/12] tests/kms_psr_sink_crc: Fix all testcases.
  2014-09-04  1:29 [PATCH 01/12] tests/pm_psr: Update pm_psr for new psr debug interface Rodrigo Vivi
                   ` (6 preceding siblings ...)
  2014-09-04  1:30 ` [PATCH 08/12] tests/kms_psr_sink_crc: Start splitting tests in test_planes and operations Rodrigo Vivi
@ 2014-09-04  1:30 ` Rodrigo Vivi
       [not found]   ` <20140904090413.GC15520@phenom.ffwll.local>
  2014-09-04  1:30 ` [PATCH 10/12] tests/kms_psr_sink_crc: Check color ref CRC Rodrigo Vivi
                   ` (3 subsequent siblings)
  11 siblings, 1 reply; 19+ messages in thread
From: Rodrigo Vivi @ 2014-09-04  1:30 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi

In order to get all test cases fixed and the matrix planes-operations working
it was needed to use the common new igt kms functions for all cases.
Previously only sprite testcase was using it.

Fixed the fb colors in a way to make tests more clear and be impossible to see
black screen during the tests.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 tests/kms_psr_sink_crc.c | 269 ++++++++++++++++++-----------------------------
 1 file changed, 101 insertions(+), 168 deletions(-)

diff --git a/tests/kms_psr_sink_crc.c b/tests/kms_psr_sink_crc.c
index 4358889..27f3df9 100644
--- a/tests/kms_psr_sink_crc.c
+++ b/tests/kms_psr_sink_crc.c
@@ -27,8 +27,6 @@
 #include <stdio.h>
 #include <string.h>
 
-#include "drm_fourcc.h"
-
 #include "ioctl_wrappers.h"
 #include "drmtest.h"
 #include "intel_bufmgr.h"
@@ -79,88 +77,37 @@ typedef struct {
 	int drm_fd;
 	enum planes test_plane;
 	enum operations op;
-	drmModeRes *resources;
-	drm_intel_bufmgr *bufmgr;
 	uint32_t devid;
-	uint32_t handle[2];
 	uint32_t crtc_id;
-	uint32_t crtc_idx;
-	uint32_t fb_id[3];
-	struct kmstest_connector_config config;
 	igt_display_t display;
-	struct igt_fb fb[2];
-	igt_plane_t *plane[2];
+	drm_intel_bufmgr *bufmgr;
+	struct igt_fb fb_green, fb_white;
+	igt_plane_t *primary, *sprite, *cursor;
 } data_t;
 
-static uint32_t create_fb(data_t *data,
-			  int w, int h,
-			  double r, double g, double b,
-			  struct igt_fb *fb)
+static void create_cursor_fb(data_t *data)
 {
-	uint32_t fb_id;
 	cairo_t *cr;
+	uint32_t fb_id;
 
-	fb_id = igt_create_fb(data->drm_fd, w, h,
-			      DRM_FORMAT_XRGB8888, I915_TILING_X, fb);
+	fb_id = igt_create_fb(data->drm_fd, 64, 64,
+			      DRM_FORMAT_ARGB8888, I915_TILING_NONE,
+			      &data->fb_white);
 	igt_assert(fb_id);
 
-	cr = igt_get_cairo_ctx(data->drm_fd, fb);
-	igt_paint_color(cr, 0, 0, w, h, r, g, b);
-	igt_assert(cairo_status(cr) == 0);
-	cairo_destroy(cr);
-
-	return fb_id;
-}
-
-static void create_cursor_fb(data_t *data, struct igt_fb *fb)
-{
-	cairo_t *cr;
-
-	data->fb_id[2] = igt_create_fb(data->drm_fd, 64, 64,
-				       DRM_FORMAT_ARGB8888, I915_TILING_NONE,
-				       fb);
-	igt_assert(data->fb_id[2]);
-
-	cr = igt_get_cairo_ctx(data->drm_fd, fb);
+	cr = igt_get_cairo_ctx(data->drm_fd, &data->fb_white);
 	igt_paint_color_alpha(cr, 0, 0, 64, 64, 1.0, 1.0, 1.0, 1.0);
 	igt_assert(cairo_status(cr) == 0);
 }
 
-static bool
-connector_set_mode(data_t *data, drmModeModeInfo *mode, uint32_t fb_id)
-{
-	struct kmstest_connector_config *config = &data->config;
-	int ret;
-
-#if 0
-	fprintf(stdout, "Using pipe %s, %dx%d\n", kmstest_pipe_name(config->pipe),
-		mode->hdisplay, mode->vdisplay);
-#endif
-
-	ret = drmModeSetCrtc(data->drm_fd,
-			     config->crtc->crtc_id,
-			     fb_id,
-			     0, 0, /* x, y */
-			     &config->connector->connector_id,
-			     1,
-			     mode);
-	igt_assert(ret == 0);
-
-	return 0;
-}
-
 static void display_init(data_t *data)
 {
 	igt_display_init(&data->display, data->drm_fd);
-	data->resources = drmModeGetResources(data->drm_fd);
-	igt_assert(data->resources);
 }
 
 static void display_fini(data_t *data)
 {
 	igt_display_fini(&data->display);
-	drmModeSetCursor(data->drm_fd, data->crtc_id, 0, 0, 0);
-	drmModeFreeResources(data->resources);
 }
 
 static void fill_blt(data_t *data, uint32_t handle, unsigned char color)
@@ -316,112 +263,105 @@ static void get_sink_crc(data_t *data, char *crc) {
 
 static void test_crc(data_t *data)
 {
-	uint32_t handle = data->handle[0];
+	uint32_t handle = data->fb_white.gem_handle;
+	igt_plane_t *test_plane;
+	void *ptr;
 	char ref_crc[12];
 	char crc[12];
 
-	if (data->op == PLANE_MOVE) {
-		igt_assert(drmModeSetCursor(data->drm_fd, data->crtc_id,
-					    handle, 64, 64) == 0);
-		igt_assert(drmModeMoveCursor(data->drm_fd, data->crtc_id,
-					     1, 1) == 0);
+	igt_plane_set_fb(data->primary, &data->fb_green);
+	igt_display_commit(&data->display);
+
+	/* Setting a secondary fb/plane */
+	switch (data->test_plane) {
+	case PRIMARY: default: test_plane = data->primary; break;
+	case SPRITE: test_plane = data->sprite; break;
+	case CURSOR: test_plane = data->cursor; break;
 	}
+	igt_plane_set_fb(test_plane, &data->fb_white);
+	igt_display_commit(&data->display);
 
 	igt_assert(wait_psr_entry(data, 10));
 	get_sink_crc(data, ref_crc);
 
 	switch (data->op) {
-		void *ptr;
 	case PAGE_FLIP:
+		/* Only in use when testing primary plane */
 		igt_assert(drmModePageFlip(data->drm_fd, data->crtc_id,
-					   data->fb_id[1], 0, NULL) == 0);
+					   data->fb_green.fb_id, 0, NULL) == 0);
 		break;
-	case MMAP_CPU:
-		ptr = gem_mmap__cpu(data->drm_fd, handle, 4096, PROT_WRITE);
+	case MMAP_GTT:
+		ptr = gem_mmap__gtt(data->drm_fd, handle, 4096, PROT_WRITE);
 		gem_set_domain(data->drm_fd, handle,
-			       I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
-		sleep(1);
+			       I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
 		memset(ptr, 0, 4);
 		munmap(ptr, 4096);
-		sleep(1);
-		gem_sw_finish(data->drm_fd, handle);
 		break;
-	case MMAP_GTT:
 	case MMAP_GTT_WAITING:
 		ptr = gem_mmap__gtt(data->drm_fd, handle, 4096, PROT_WRITE);
 		gem_set_domain(data->drm_fd, handle,
 			       I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
+
+		/* Printing white on white so the screen shouldn't change */
 		memset(ptr, 0xff, 4);
+		get_sink_crc(data, crc);
+		igt_assert(strcmp(ref_crc, crc) == 0);
+
+		fprintf(stdout, "Waiting 10s...\n");
+		sleep(10);
+
+		/* Now lets print black to change the screen */
+		memset(ptr, 0, 4);
 		munmap(ptr, 4096);
-		gem_bo_busy(data->drm_fd, handle);
+		break;
+	case MMAP_CPU:
+		ptr = gem_mmap__cpu(data->drm_fd, handle, 4096, PROT_WRITE);
+		gem_set_domain(data->drm_fd, handle,
+			       I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
+		memset(ptr, 0, 4);
+		munmap(ptr, 4096);
+		gem_sw_finish(data->drm_fd, handle);
 		break;
 	case BLT:
-		fill_blt(data, handle, 0xff);
+		fill_blt(data, handle, 0);
 		break;
 	case RENDER:
-		fill_render(data, handle, 0xff);
+		fill_render(data, handle, 0);
 		break;
 	case PLANE_MOVE:
-		igt_assert(drmModeMoveCursor(data->drm_fd, data->crtc_id, 1, 2) == 0);
+		/* Only in use when testing Sprite and Cursor */
+		igt_plane_set_position(test_plane, 1, 1);
+		igt_display_commit(&data->display);
 		break;
 	case PLANE_ONOFF:
-		igt_plane_set_fb(data->plane[0], &data->fb[0]);
-		igt_display_commit(&data->display);
-		igt_plane_set_fb(data->plane[1], &data->fb[1]);
+		/* Only in use when testing Sprite and Cursor */
+		igt_plane_set_fb(test_plane, NULL);
 		igt_display_commit(&data->display);
 		break;
 	}
-
-	igt_wait_for_vblank(data->drm_fd, data->crtc_idx);
-
 	get_sink_crc(data, crc);
 	igt_assert(strcmp(ref_crc, crc) != 0);
 }
 
-static bool prepare_crtc(data_t *data, uint32_t connector_id)
-{
-	if (!kmstest_get_connector_config(data->drm_fd,
-					  connector_id,
-					  1 << data->crtc_idx,
-					  &data->config))
-		return false;
-
-	data->fb_id[0] = create_fb(data,
-				   data->config.default_mode.hdisplay,
-				   data->config.default_mode.vdisplay,
-				   0.0, 1.0, 0.0, &data->fb[0]);
-	igt_assert(data->fb_id[0]);
-
-	if (data->op == PLANE_MOVE)
-		create_cursor_fb(data, &data->fb[0]);
-
-	data->fb_id[1] = create_fb(data,
-				   data->config.default_mode.hdisplay,
-				   data->config.default_mode.vdisplay,
-				   1.0, 0.0, 0.0, &data->fb[1]);
-	igt_assert(data->fb_id[1]);
-
-	data->handle[0] = data->fb[0].gem_handle;
-	data->handle[1] = data->fb[1].gem_handle;
-
-	/* scanout = fb[1] */
-	connector_set_mode(data, &data->config.default_mode,
-			   data->fb_id[1]);
+static void test_cleanup(data_t *data) {
+	igt_plane_set_fb(data->primary, NULL);
+	if (data->test_plane == SPRITE)
+		igt_plane_set_fb(data->sprite, NULL);
+	if (data->test_plane == CURSOR)
+		igt_plane_set_fb(data->cursor, NULL);
 
-	/* scanout = fb[0] */
-	connector_set_mode(data, &data->config.default_mode,
-			   data->fb_id[0]);
+	igt_display_commit(&data->display);
 
-	kmstest_free_connector_config(&data->config);
-
-	return true;
+	igt_remove_fb(data->drm_fd, &data->fb_green);
+	igt_remove_fb(data->drm_fd, &data->fb_white);
 }
 
-static void test_sprite(data_t *data)
+static void run_test(data_t *data)
 {
 	igt_display_t *display = &data->display;
 	igt_output_t *output;
 	drmModeModeInfo *mode;
+	uint32_t white_h, white_v;
 
 	for_each_connected_output(display, output) {
 		drmModeConnectorPtr c = output->config.connector;
@@ -431,6 +371,7 @@ static void test_sprite(data_t *data)
 			continue;
 
 		igt_output_set_pipe(output, PIPE_ANY);
+		data->crtc_id = output->config.crtc->crtc_id;
 
 		mode = igt_output_get_mode(output);
 
@@ -438,51 +379,45 @@ static void test_sprite(data_t *data)
 				    mode->hdisplay, mode->vdisplay,
 				    DRM_FORMAT_XRGB8888, I915_TILING_X,
 				    0.0, 1.0, 0.0,
-				    &data->fb[0]);
-
-		igt_create_color_fb(data->drm_fd,
-				    mode->hdisplay/2, mode->vdisplay/2,
-				    DRM_FORMAT_XRGB8888, I915_TILING_X,
-				    1.0, 0.0, 0.0,
-				    &data->fb[1]);
+				    &data->fb_green);
+
+		data->primary = igt_output_get_plane(output, IGT_PLANE_PRIMARY);
+		igt_plane_set_fb(data->primary, NULL);
+
+		white_h = mode->hdisplay;
+		white_v = mode->vdisplay;
+
+		switch (data->test_plane) {
+		case SPRITE:
+			data->sprite = igt_output_get_plane(output,
+							    IGT_PLANE_2);
+			igt_plane_set_fb(data->sprite, NULL);
+			/* To make it different for human eyes let's make
+			 * sprite visible in only one quarter of the primary
+			 */
+			white_h = white_h/2;
+			white_v = white_v/2;
+		case PRIMARY:
+			igt_create_color_fb(data->drm_fd,
+					    white_h, white_v,
+					    DRM_FORMAT_XRGB8888, I915_TILING_X,
+					    1.0, 1.0, 1.0,
+					    &data->fb_white);
+			break;
+		case CURSOR:
+			data->cursor = igt_output_get_plane(output,
+							    IGT_PLANE_CURSOR);
+			igt_plane_set_fb(data->cursor, NULL);
+			create_cursor_fb(data);
+			igt_plane_set_position(data->cursor, 0, 0);
+			break;
+		}
 
-		data->plane[0] = igt_output_get_plane(output, 0);
-		data->plane[1] = igt_output_get_plane(output, 1);
+		igt_display_commit(&data->display);
 
 		test_crc(data);
-	}
-}
-
-static void run_test(data_t *data)
-{
-	int i, n;
-	drmModeConnectorPtr c;
-	/* Baytrail supports per-pipe PSR configuration, however PSR on
-	 * PIPE_B isn't working properly. So let's keep it disabled for now.
-	 * crtcs = IS_VALLEYVIEW(data->devid)? 2 : 1; */
-	int crtcs = 1;
-
-	if (data->op == PLANE_ONOFF) {
-		test_sprite(data);
-		return;
-	}
 
-	for (i = 0; i < data->resources->count_connectors; i++) {
-		uint32_t connector_id = data->resources->connectors[i];
-		c = drmModeGetConnector(data->drm_fd, connector_id);
-
-		if (c->connector_type != DRM_MODE_CONNECTOR_eDP ||
-		    c->connection != DRM_MODE_CONNECTED)
-			continue;
-		for (n = 0; n < crtcs; n++) {
-			data->crtc_idx = n;
-			data->crtc_id = data->resources->crtcs[n];
-
-			if (!prepare_crtc(data, connector_id))
-				continue;
-
-			test_crc(data);
-		}
+		test_cleanup(data);
 	}
 }
 
@@ -496,7 +431,6 @@ igt_main
 	igt_fixture {
 		data.drm_fd = drm_open_any();
 		kmstest_set_vt_graphics_mode();
-
 		data.devid = intel_get_drm_devid(data.drm_fd);
 
 		igt_skip_on(!psr_enabled(&data));
@@ -508,7 +442,6 @@ igt_main
 		display_init(&data);
 	}
 
-
 	for (op = PAGE_FLIP; op <= RENDER; op++) {
 		igt_subtest_f("primary_%s", op_str(op)) {
 			data.test_plane = PRIMARY;
@@ -517,7 +450,7 @@ igt_main
 		}
 	}
 
-	for (op = PLANE_ONOFF; op <= PLANE_ONOFF; op++) {
+	for (op = MMAP_GTT; op <= PLANE_ONOFF; op++) {
 		igt_subtest_f("sprite_%s", op_str(op)) {
 			data.test_plane = SPRITE;
 			data.op = op;
@@ -525,7 +458,7 @@ igt_main
 		}
 	}
 
-	for (op = PLANE_MOVE; op <= PLANE_MOVE; op++) {
+	for (op = MMAP_GTT; op <= PLANE_ONOFF; op++) {
 		igt_subtest_f("cursor_%s", op_str(op)) {
 			data.test_plane = CURSOR;
 			data.op = op;
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 10/12] tests/kms_psr_sink_crc: Check color ref CRC
  2014-09-04  1:29 [PATCH 01/12] tests/pm_psr: Update pm_psr for new psr debug interface Rodrigo Vivi
                   ` (7 preceding siblings ...)
  2014-09-04  1:30 ` [PATCH 09/12] tests/kms_psr_sink_crc: Fix all testcases Rodrigo Vivi
@ 2014-09-04  1:30 ` Rodrigo Vivi
  2014-09-04  1:30 ` [PATCH 11/12] tests/kms_psr_sink_crc: Fix blt submission Rodrigo Vivi
                   ` (2 subsequent siblings)
  11 siblings, 0 replies; 19+ messages in thread
From: Rodrigo Vivi @ 2014-09-04  1:30 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi

Black screen is forbidden on this test. So let's fail if sink crc shows
it is back.

Also there are many cases where we know for shure it should be all green,
so let's check for them.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 tests/kms_psr_sink_crc.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/tests/kms_psr_sink_crc.c b/tests/kms_psr_sink_crc.c
index 27f3df9..45d2dd9 100644
--- a/tests/kms_psr_sink_crc.c
+++ b/tests/kms_psr_sink_crc.c
@@ -35,6 +35,9 @@
 #include "igt_debugfs.h"
 #include "igt_kms.h"
 
+#define CRC_BLACK "000000000000"
+#define CRC_GREEN "0000c1010000"
+
 #define DEBUG_CRC 0
 
 /* This is usefull to debug and know what should be expected */
@@ -259,6 +262,9 @@ static void get_sink_crc(data_t *data, char *crc) {
 	 * Now give a time for human eyes
 	 */
 	usleep(300000);
+
+	/* Black screen is always invalid */
+	igt_assert(strcmp(crc, CRC_BLACK) != 0);
 }
 
 static void test_crc(data_t *data)
@@ -272,6 +278,15 @@ static void test_crc(data_t *data)
 	igt_plane_set_fb(data->primary, &data->fb_green);
 	igt_display_commit(&data->display);
 
+	/* Confirm that screen became Green */
+	get_sink_crc(data, ref_crc);
+	igt_assert(strcmp(ref_crc, CRC_GREEN) == 0);
+
+	/* Confirm screen stays Green after PSR got active */
+	igt_assert(wait_psr_entry(data, 10));
+	get_sink_crc(data, ref_crc);
+	igt_assert(strcmp(ref_crc, CRC_GREEN) == 0);
+
 	/* Setting a secondary fb/plane */
 	switch (data->test_plane) {
 	case PRIMARY: default: test_plane = data->primary; break;
@@ -281,14 +296,18 @@ static void test_crc(data_t *data)
 	igt_plane_set_fb(test_plane, &data->fb_white);
 	igt_display_commit(&data->display);
 
+	/* Confirm it is not Green anymore */
 	igt_assert(wait_psr_entry(data, 10));
 	get_sink_crc(data, ref_crc);
+	igt_assert(strcmp(ref_crc, CRC_GREEN) != 0);
 
 	switch (data->op) {
 	case PAGE_FLIP:
 		/* Only in use when testing primary plane */
 		igt_assert(drmModePageFlip(data->drm_fd, data->crtc_id,
 					   data->fb_green.fb_id, 0, NULL) == 0);
+		get_sink_crc(data, crc);
+		igt_assert(strcmp(crc, CRC_GREEN) == 0);
 		break;
 	case MMAP_GTT:
 		ptr = gem_mmap__gtt(data->drm_fd, handle, 4096, PROT_WRITE);
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 11/12] tests/kms_psr_sink_crc: Fix blt submission
  2014-09-04  1:29 [PATCH 01/12] tests/pm_psr: Update pm_psr for new psr debug interface Rodrigo Vivi
                   ` (8 preceding siblings ...)
  2014-09-04  1:30 ` [PATCH 10/12] tests/kms_psr_sink_crc: Check color ref CRC Rodrigo Vivi
@ 2014-09-04  1:30 ` Rodrigo Vivi
  2014-09-04  1:30 ` [PATCH 12/12] tests/kms_psr_sink_crc: Wait 2 vblanks before grabing the new crc Rodrigo Vivi
       [not found] ` <20140904084707.GA15520@phenom.ffwll.local>
  11 siblings, 0 replies; 19+ messages in thread
From: Rodrigo Vivi @ 2014-09-04  1:30 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi

Putting back a missing dword.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 tests/kms_psr_sink_crc.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tests/kms_psr_sink_crc.c b/tests/kms_psr_sink_crc.c
index 45d2dd9..c265f3a 100644
--- a/tests/kms_psr_sink_crc.c
+++ b/tests/kms_psr_sink_crc.c
@@ -125,6 +125,7 @@ static void fill_blt(data_t *data, uint32_t handle, unsigned char color)
 
 	COLOR_BLIT_COPY_BATCH_START(0);
 	OUT_BATCH((1 << 24) | (0xf0 << 16) | 0);
+	OUT_BATCH(0);
 	OUT_BATCH(1 << 16 | 4);
 	OUT_RELOC(dst, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0);
 	OUT_BATCH(color);
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 12/12] tests/kms_psr_sink_crc: Wait 2 vblanks before grabing the new crc.
  2014-09-04  1:29 [PATCH 01/12] tests/pm_psr: Update pm_psr for new psr debug interface Rodrigo Vivi
                   ` (9 preceding siblings ...)
  2014-09-04  1:30 ` [PATCH 11/12] tests/kms_psr_sink_crc: Fix blt submission Rodrigo Vivi
@ 2014-09-04  1:30 ` Rodrigo Vivi
       [not found] ` <20140904084707.GA15520@phenom.ffwll.local>
  11 siblings, 0 replies; 19+ messages in thread
From: Rodrigo Vivi @ 2014-09-04  1:30 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 tests/kms_psr_sink_crc.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/tests/kms_psr_sink_crc.c b/tests/kms_psr_sink_crc.c
index c265f3a..59c99ec 100644
--- a/tests/kms_psr_sink_crc.c
+++ b/tests/kms_psr_sink_crc.c
@@ -246,6 +246,9 @@ static void get_sink_crc(data_t *data, char *crc) {
 	int ret;
 	FILE *file;
 
+	igt_wait_for_vblank(data->drm_fd, 0);
+	igt_wait_for_vblank(data->drm_fd, 0);
+
 	file = igt_debugfs_fopen("i915_sink_crc_eDP1", "r");
 	igt_require(file);
 
@@ -390,7 +393,7 @@ static void run_test(data_t *data)
 		    c->connection != DRM_MODE_CONNECTED)
 			continue;
 
-		igt_output_set_pipe(output, PIPE_ANY);
+		igt_output_set_pipe(output, 0);
 		data->crtc_id = output->config.crtc->crtc_id;
 
 		mode = igt_output_get_mode(output);
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH 01/12] tests/pm_psr: Update pm_psr for new psr debug interface.
       [not found] ` <20140904084707.GA15520@phenom.ffwll.local>
@ 2014-09-04 20:03   ` Rodrigo Vivi
  2014-09-09 23:12   ` [PATCH] tests: Kill pm_psr Rodrigo Vivi
  1 sibling, 0 replies; 19+ messages in thread
From: Rodrigo Vivi @ 2014-09-04 20:03 UTC (permalink / raw)
  To: Daniel Vetter; +Cc: intel-gfx, Rodrigo Vivi


[-- Attachment #1.1: Type: text/plain, Size: 3550 bytes --]

On Thu, Sep 4, 2014 at 1:47 AM, Daniel Vetter <daniel@ffwll.ch> wrote:

> On Wed, Sep 03, 2014 at 09:29:55PM -0400, Rodrigo Vivi wrote:
> > v2: Doesn't duplicate kernel's HAS_PSR. skip based on debugfs output.
> >
> > Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
>
> I'm not sure whether we should still keep this one here around given that
> we have the full-blown crc based testcase, which also checks residency.
> But your call.
>

Agree. I'm going to kill this test.



> -Daniel
>
> > ---
> >  tests/pm_psr.c | 30 +++++++++++++++++++++---------
> >  1 file changed, 21 insertions(+), 9 deletions(-)
> >
> > diff --git a/tests/pm_psr.c b/tests/pm_psr.c
> > index 3ab7e7a..16ec3fa 100644
> > --- a/tests/pm_psr.c
> > +++ b/tests/pm_psr.c
> > @@ -32,6 +32,8 @@
> >  #include <errno.h>
> >
> >  #include "drmtest.h"
> > +#include "intel_chipset.h"
> > +#include "igt_debugfs.h"
> >
> >  #define SLEEP_DURATION 5000 // in milliseconds
> >
> > @@ -41,22 +43,34 @@ static int get_perf(const char *path)
> >       FILE *file;
> >       char str[4];
> >
> > -     file = fopen(path, "r");
> > -     igt_assert(file);
> > +     file = igt_debugfs_fopen("i915_edp_psr_status", "r");
> > +     igt_require(file);
> >
> >       ret = fscanf(file, "Sink_Support: %s\n", str);
> >       igt_skip_on_f(ret == 0,
> >                     "i915_edp_psr_status format not supported by this
> test case\n");
> > -     igt_require(strcmp(str, "yes") == 0);
> > +     igt_skip_on_f(strcmp(str, "yes") != 0,
> > +                   "PSR not supported on this platform\n");
> > +
> >       ret = fscanf(file, "Source_OK: %s\n", str);
> >       igt_assert(ret != 0);
> > -
> >       igt_require(strcmp(str, "yes") == 0);
> >
> >       ret = fscanf(file, "Enabled: %s\n", str);
> >       igt_assert(ret != 0);
> >       igt_assert(strcmp(str, "yes") == 0);
> >
> > +     ret = fscanf(file, "Active: %s\n", str);
> > +     igt_skip_on_f(ret == 0,
> > +                   "i915_edp_psr_status format not supported by this
> test case\n");
> > +
> > +     ret = fscanf(file, "Busy frontbuffer bits: %s\n", str);
> > +     igt_assert(ret != 0);
> > +     ret = fscanf(file, "Re-enable work scheduled: %s\n", str);
> > +     igt_assert(ret != 0);
> > +     ret = fscanf(file, "HW Enabled & Active bit: %s\n", str);
> > +     igt_assert(ret != 0);
> > +
> >       ret = fscanf(file, "Performance_Counter: %i", &perf);
> >       igt_assert(ret != 0);
> >
> > @@ -68,15 +82,13 @@ static int get_perf(const char *path)
> >
> >  igt_simple_main
> >  {
> > -     int ret, perf1, perf2;
> > -     int device = drm_get_card();
> > +     int perf1, perf2;
> > +     int drm_fd = drm_open_any();
> > +     uint32_t devid = intel_get_drm_devid(drm_fd);
> >       char *path;
> >
> >       igt_skip_on_simulation();
> >
> > -     ret = asprintf(&path,
> "/sys/kernel/debug/dri/%d/i915_edp_psr_status", device);
> > -     igt_assert(ret != -1);
> > -
> >       perf1 = get_perf(path);
> >       sleep(SLEEP_DURATION / 1000);
> >       perf2 = get_perf(path);
> > --
> > 1.9.3
> >
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
> --
> Daniel Vetter
> Software Engineer, Intel Corporation
> +41 (0) 79 365 57 48 - http://blog.ffwll.ch
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>



-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br

[-- Attachment #1.2: Type: text/html, Size: 5741 bytes --]

[-- Attachment #2: Type: text/plain, Size: 159 bytes --]

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 09/12] tests/kms_psr_sink_crc: Fix all testcases.
       [not found]   ` <20140904090413.GC15520@phenom.ffwll.local>
@ 2014-09-04 20:24     ` Rodrigo Vivi
  2014-09-05  0:55       ` Rodrigo Vivi
  0 siblings, 1 reply; 19+ messages in thread
From: Rodrigo Vivi @ 2014-09-04 20:24 UTC (permalink / raw)
  To: Daniel Vetter; +Cc: intel-gfx, Rodrigo Vivi


[-- Attachment #1.1: Type: text/plain, Size: 18655 bytes --]

On Thu, Sep 4, 2014 at 2:04 AM, Daniel Vetter <daniel@ffwll.ch> wrote:

> On Wed, Sep 03, 2014 at 09:30:03PM -0400, Rodrigo Vivi wrote:
> > In order to get all test cases fixed and the matrix planes-operations
> working
> > it was needed to use the common new igt kms functions for all cases.
> > Previously only sprite testcase was using it.
> >
> > Fixed the fb colors in a way to make tests more clear and be impossible
> to see
> > black screen during the tests.
> >
> > Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
>
> Ok, everything changed ;-) So a bit hard to review just as a patch and so
> just a few comments on top:
>

I'm sorry about that.... I got surprised I could split all in 9 patches,
but I know this one staid ugly.


> - Looks good overall, but the gold standard is whether it'll catch bugs.
>   So if you remove some of the frontbuffer tracking (as little as possible
>   in each test) and the new testcase catches it all, then I think we're
>   good.
>

It is already catching something, what is good! :)
and not broken anymore!


>
> - I think we should have a residency check before we grab a new crc, to
>   make sure that we're really again (or if the kernel is buggy, still) in
>   psr mode.
>

yeah, but residency check is bad for vlv/chv.


>
> - Checking for mismatching crc is risky, see the comment in a different
>   reply in this thread.
>
> But overall looks good so probably best to just push these patches and
> then fixup anything missing afterwards. I'll read through the entire test
> again once it all landed to double-check we haven't missed anything really
> important.
>

cool. Thanks!


>
> Aside: A suspend/resume testcase might be useful, if it can reliably
> reproduce the issue you're working on. But again, follow-up.
>

For sure. I just saw we have igt_system_suspend_autoresume. I'll definetely
add another test using it.



> -Daniel
>
> > ---
> >  tests/kms_psr_sink_crc.c | 269
> ++++++++++++++++++-----------------------------
> >  1 file changed, 101 insertions(+), 168 deletions(-)
> >
> > diff --git a/tests/kms_psr_sink_crc.c b/tests/kms_psr_sink_crc.c
> > index 4358889..27f3df9 100644
> > --- a/tests/kms_psr_sink_crc.c
> > +++ b/tests/kms_psr_sink_crc.c
> > @@ -27,8 +27,6 @@
> >  #include <stdio.h>
> >  #include <string.h>
> >
> > -#include "drm_fourcc.h"
> > -
> >  #include "ioctl_wrappers.h"
> >  #include "drmtest.h"
> >  #include "intel_bufmgr.h"
> > @@ -79,88 +77,37 @@ typedef struct {
> >       int drm_fd;
> >       enum planes test_plane;
> >       enum operations op;
> > -     drmModeRes *resources;
> > -     drm_intel_bufmgr *bufmgr;
> >       uint32_t devid;
> > -     uint32_t handle[2];
> >       uint32_t crtc_id;
> > -     uint32_t crtc_idx;
> > -     uint32_t fb_id[3];
> > -     struct kmstest_connector_config config;
> >       igt_display_t display;
> > -     struct igt_fb fb[2];
> > -     igt_plane_t *plane[2];
> > +     drm_intel_bufmgr *bufmgr;
> > +     struct igt_fb fb_green, fb_white;
> > +     igt_plane_t *primary, *sprite, *cursor;
> >  } data_t;
> >
> > -static uint32_t create_fb(data_t *data,
> > -                       int w, int h,
> > -                       double r, double g, double b,
> > -                       struct igt_fb *fb)
> > +static void create_cursor_fb(data_t *data)
> >  {
> > -     uint32_t fb_id;
> >       cairo_t *cr;
> > +     uint32_t fb_id;
> >
> > -     fb_id = igt_create_fb(data->drm_fd, w, h,
> > -                           DRM_FORMAT_XRGB8888, I915_TILING_X, fb);
> > +     fb_id = igt_create_fb(data->drm_fd, 64, 64,
> > +                           DRM_FORMAT_ARGB8888, I915_TILING_NONE,
> > +                           &data->fb_white);
> >       igt_assert(fb_id);
> >
> > -     cr = igt_get_cairo_ctx(data->drm_fd, fb);
> > -     igt_paint_color(cr, 0, 0, w, h, r, g, b);
> > -     igt_assert(cairo_status(cr) == 0);
> > -     cairo_destroy(cr);
> > -
> > -     return fb_id;
> > -}
> > -
> > -static void create_cursor_fb(data_t *data, struct igt_fb *fb)
> > -{
> > -     cairo_t *cr;
> > -
> > -     data->fb_id[2] = igt_create_fb(data->drm_fd, 64, 64,
> > -                                    DRM_FORMAT_ARGB8888,
> I915_TILING_NONE,
> > -                                    fb);
> > -     igt_assert(data->fb_id[2]);
> > -
> > -     cr = igt_get_cairo_ctx(data->drm_fd, fb);
> > +     cr = igt_get_cairo_ctx(data->drm_fd, &data->fb_white);
> >       igt_paint_color_alpha(cr, 0, 0, 64, 64, 1.0, 1.0, 1.0, 1.0);
> >       igt_assert(cairo_status(cr) == 0);
> >  }
> >
> > -static bool
> > -connector_set_mode(data_t *data, drmModeModeInfo *mode, uint32_t fb_id)
> > -{
> > -     struct kmstest_connector_config *config = &data->config;
> > -     int ret;
> > -
> > -#if 0
> > -     fprintf(stdout, "Using pipe %s, %dx%d\n",
> kmstest_pipe_name(config->pipe),
> > -             mode->hdisplay, mode->vdisplay);
> > -#endif
> > -
> > -     ret = drmModeSetCrtc(data->drm_fd,
> > -                          config->crtc->crtc_id,
> > -                          fb_id,
> > -                          0, 0, /* x, y */
> > -                          &config->connector->connector_id,
> > -                          1,
> > -                          mode);
> > -     igt_assert(ret == 0);
> > -
> > -     return 0;
> > -}
> > -
> >  static void display_init(data_t *data)
> >  {
> >       igt_display_init(&data->display, data->drm_fd);
> > -     data->resources = drmModeGetResources(data->drm_fd);
> > -     igt_assert(data->resources);
> >  }
> >
> >  static void display_fini(data_t *data)
> >  {
> >       igt_display_fini(&data->display);
> > -     drmModeSetCursor(data->drm_fd, data->crtc_id, 0, 0, 0);
> > -     drmModeFreeResources(data->resources);
> >  }
> >
> >  static void fill_blt(data_t *data, uint32_t handle, unsigned char color)
> > @@ -316,112 +263,105 @@ static void get_sink_crc(data_t *data, char
> *crc) {
> >
> >  static void test_crc(data_t *data)
> >  {
> > -     uint32_t handle = data->handle[0];
> > +     uint32_t handle = data->fb_white.gem_handle;
> > +     igt_plane_t *test_plane;
> > +     void *ptr;
> >       char ref_crc[12];
> >       char crc[12];
> >
> > -     if (data->op == PLANE_MOVE) {
> > -             igt_assert(drmModeSetCursor(data->drm_fd, data->crtc_id,
> > -                                         handle, 64, 64) == 0);
> > -             igt_assert(drmModeMoveCursor(data->drm_fd, data->crtc_id,
> > -                                          1, 1) == 0);
> > +     igt_plane_set_fb(data->primary, &data->fb_green);
> > +     igt_display_commit(&data->display);
> > +
> > +     /* Setting a secondary fb/plane */
> > +     switch (data->test_plane) {
> > +     case PRIMARY: default: test_plane = data->primary; break;
> > +     case SPRITE: test_plane = data->sprite; break;
> > +     case CURSOR: test_plane = data->cursor; break;
> >       }
> > +     igt_plane_set_fb(test_plane, &data->fb_white);
> > +     igt_display_commit(&data->display);
> >
> >       igt_assert(wait_psr_entry(data, 10));
> >       get_sink_crc(data, ref_crc);
> >
> >       switch (data->op) {
> > -             void *ptr;
> >       case PAGE_FLIP:
> > +             /* Only in use when testing primary plane */
> >               igt_assert(drmModePageFlip(data->drm_fd, data->crtc_id,
> > -                                        data->fb_id[1], 0, NULL) == 0);
> > +                                        data->fb_green.fb_id, 0, NULL)
> == 0);
> >               break;
> > -     case MMAP_CPU:
> > -             ptr = gem_mmap__cpu(data->drm_fd, handle, 4096,
> PROT_WRITE);
> > +     case MMAP_GTT:
> > +             ptr = gem_mmap__gtt(data->drm_fd, handle, 4096,
> PROT_WRITE);
> >               gem_set_domain(data->drm_fd, handle,
> > -                            I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
> > -             sleep(1);
> > +                            I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
> >               memset(ptr, 0, 4);
> >               munmap(ptr, 4096);
> > -             sleep(1);
> > -             gem_sw_finish(data->drm_fd, handle);
> >               break;
> > -     case MMAP_GTT:
> >       case MMAP_GTT_WAITING:
> >               ptr = gem_mmap__gtt(data->drm_fd, handle, 4096,
> PROT_WRITE);
> >               gem_set_domain(data->drm_fd, handle,
> >                              I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
> > +
> > +             /* Printing white on white so the screen shouldn't change
> */
> >               memset(ptr, 0xff, 4);
> > +             get_sink_crc(data, crc);
> > +             igt_assert(strcmp(ref_crc, crc) == 0);
> > +
> > +             fprintf(stdout, "Waiting 10s...\n");
> > +             sleep(10);
> > +
> > +             /* Now lets print black to change the screen */
> > +             memset(ptr, 0, 4);
> >               munmap(ptr, 4096);
> > -             gem_bo_busy(data->drm_fd, handle);
> > +             break;
> > +     case MMAP_CPU:
> > +             ptr = gem_mmap__cpu(data->drm_fd, handle, 4096,
> PROT_WRITE);
> > +             gem_set_domain(data->drm_fd, handle,
> > +                            I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
> > +             memset(ptr, 0, 4);
> > +             munmap(ptr, 4096);
> > +             gem_sw_finish(data->drm_fd, handle);
> >               break;
> >       case BLT:
> > -             fill_blt(data, handle, 0xff);
> > +             fill_blt(data, handle, 0);
> >               break;
> >       case RENDER:
> > -             fill_render(data, handle, 0xff);
> > +             fill_render(data, handle, 0);
> >               break;
> >       case PLANE_MOVE:
> > -             igt_assert(drmModeMoveCursor(data->drm_fd, data->crtc_id,
> 1, 2) == 0);
> > +             /* Only in use when testing Sprite and Cursor */
> > +             igt_plane_set_position(test_plane, 1, 1);
> > +             igt_display_commit(&data->display);
> >               break;
> >       case PLANE_ONOFF:
> > -             igt_plane_set_fb(data->plane[0], &data->fb[0]);
> > -             igt_display_commit(&data->display);
> > -             igt_plane_set_fb(data->plane[1], &data->fb[1]);
> > +             /* Only in use when testing Sprite and Cursor */
> > +             igt_plane_set_fb(test_plane, NULL);
> >               igt_display_commit(&data->display);
> >               break;
> >       }
> > -
> > -     igt_wait_for_vblank(data->drm_fd, data->crtc_idx);
> > -
> >       get_sink_crc(data, crc);
> >       igt_assert(strcmp(ref_crc, crc) != 0);
> >  }
> >
> > -static bool prepare_crtc(data_t *data, uint32_t connector_id)
> > -{
> > -     if (!kmstest_get_connector_config(data->drm_fd,
> > -                                       connector_id,
> > -                                       1 << data->crtc_idx,
> > -                                       &data->config))
> > -             return false;
> > -
> > -     data->fb_id[0] = create_fb(data,
> > -                                data->config.default_mode.hdisplay,
> > -                                data->config.default_mode.vdisplay,
> > -                                0.0, 1.0, 0.0, &data->fb[0]);
> > -     igt_assert(data->fb_id[0]);
> > -
> > -     if (data->op == PLANE_MOVE)
> > -             create_cursor_fb(data, &data->fb[0]);
> > -
> > -     data->fb_id[1] = create_fb(data,
> > -                                data->config.default_mode.hdisplay,
> > -                                data->config.default_mode.vdisplay,
> > -                                1.0, 0.0, 0.0, &data->fb[1]);
> > -     igt_assert(data->fb_id[1]);
> > -
> > -     data->handle[0] = data->fb[0].gem_handle;
> > -     data->handle[1] = data->fb[1].gem_handle;
> > -
> > -     /* scanout = fb[1] */
> > -     connector_set_mode(data, &data->config.default_mode,
> > -                        data->fb_id[1]);
> > +static void test_cleanup(data_t *data) {
> > +     igt_plane_set_fb(data->primary, NULL);
> > +     if (data->test_plane == SPRITE)
> > +             igt_plane_set_fb(data->sprite, NULL);
> > +     if (data->test_plane == CURSOR)
> > +             igt_plane_set_fb(data->cursor, NULL);
> >
> > -     /* scanout = fb[0] */
> > -     connector_set_mode(data, &data->config.default_mode,
> > -                        data->fb_id[0]);
> > +     igt_display_commit(&data->display);
> >
> > -     kmstest_free_connector_config(&data->config);
> > -
> > -     return true;
> > +     igt_remove_fb(data->drm_fd, &data->fb_green);
> > +     igt_remove_fb(data->drm_fd, &data->fb_white);
> >  }
> >
> > -static void test_sprite(data_t *data)
> > +static void run_test(data_t *data)
> >  {
> >       igt_display_t *display = &data->display;
> >       igt_output_t *output;
> >       drmModeModeInfo *mode;
> > +     uint32_t white_h, white_v;
> >
> >       for_each_connected_output(display, output) {
> >               drmModeConnectorPtr c = output->config.connector;
> > @@ -431,6 +371,7 @@ static void test_sprite(data_t *data)
> >                       continue;
> >
> >               igt_output_set_pipe(output, PIPE_ANY);
> > +             data->crtc_id = output->config.crtc->crtc_id;
> >
> >               mode = igt_output_get_mode(output);
> >
> > @@ -438,51 +379,45 @@ static void test_sprite(data_t *data)
> >                                   mode->hdisplay, mode->vdisplay,
> >                                   DRM_FORMAT_XRGB8888, I915_TILING_X,
> >                                   0.0, 1.0, 0.0,
> > -                                 &data->fb[0]);
> > -
> > -             igt_create_color_fb(data->drm_fd,
> > -                                 mode->hdisplay/2, mode->vdisplay/2,
> > -                                 DRM_FORMAT_XRGB8888, I915_TILING_X,
> > -                                 1.0, 0.0, 0.0,
> > -                                 &data->fb[1]);
> > +                                 &data->fb_green);
> > +
> > +             data->primary = igt_output_get_plane(output,
> IGT_PLANE_PRIMARY);
> > +             igt_plane_set_fb(data->primary, NULL);
> > +
> > +             white_h = mode->hdisplay;
> > +             white_v = mode->vdisplay;
> > +
> > +             switch (data->test_plane) {
> > +             case SPRITE:
> > +                     data->sprite = igt_output_get_plane(output,
> > +                                                         IGT_PLANE_2);
> > +                     igt_plane_set_fb(data->sprite, NULL);
> > +                     /* To make it different for human eyes let's make
> > +                      * sprite visible in only one quarter of the
> primary
> > +                      */
> > +                     white_h = white_h/2;
> > +                     white_v = white_v/2;
> > +             case PRIMARY:
> > +                     igt_create_color_fb(data->drm_fd,
> > +                                         white_h, white_v,
> > +                                         DRM_FORMAT_XRGB8888,
> I915_TILING_X,
> > +                                         1.0, 1.0, 1.0,
> > +                                         &data->fb_white);
> > +                     break;
> > +             case CURSOR:
> > +                     data->cursor = igt_output_get_plane(output,
> > +
>  IGT_PLANE_CURSOR);
> > +                     igt_plane_set_fb(data->cursor, NULL);
> > +                     create_cursor_fb(data);
> > +                     igt_plane_set_position(data->cursor, 0, 0);
> > +                     break;
> > +             }
> >
> > -             data->plane[0] = igt_output_get_plane(output, 0);
> > -             data->plane[1] = igt_output_get_plane(output, 1);
> > +             igt_display_commit(&data->display);
> >
> >               test_crc(data);
> > -     }
> > -}
> > -
> > -static void run_test(data_t *data)
> > -{
> > -     int i, n;
> > -     drmModeConnectorPtr c;
> > -     /* Baytrail supports per-pipe PSR configuration, however PSR on
> > -      * PIPE_B isn't working properly. So let's keep it disabled for
> now.
> > -      * crtcs = IS_VALLEYVIEW(data->devid)? 2 : 1; */
> > -     int crtcs = 1;
> > -
> > -     if (data->op == PLANE_ONOFF) {
> > -             test_sprite(data);
> > -             return;
> > -     }
> >
> > -     for (i = 0; i < data->resources->count_connectors; i++) {
> > -             uint32_t connector_id = data->resources->connectors[i];
> > -             c = drmModeGetConnector(data->drm_fd, connector_id);
> > -
> > -             if (c->connector_type != DRM_MODE_CONNECTOR_eDP ||
> > -                 c->connection != DRM_MODE_CONNECTED)
> > -                     continue;
> > -             for (n = 0; n < crtcs; n++) {
> > -                     data->crtc_idx = n;
> > -                     data->crtc_id = data->resources->crtcs[n];
> > -
> > -                     if (!prepare_crtc(data, connector_id))
> > -                             continue;
> > -
> > -                     test_crc(data);
> > -             }
> > +             test_cleanup(data);
> >       }
> >  }
> >
> > @@ -496,7 +431,6 @@ igt_main
> >       igt_fixture {
> >               data.drm_fd = drm_open_any();
> >               kmstest_set_vt_graphics_mode();
> > -
> >               data.devid = intel_get_drm_devid(data.drm_fd);
> >
> >               igt_skip_on(!psr_enabled(&data));
> > @@ -508,7 +442,6 @@ igt_main
> >               display_init(&data);
> >       }
> >
> > -
> >       for (op = PAGE_FLIP; op <= RENDER; op++) {
> >               igt_subtest_f("primary_%s", op_str(op)) {
> >                       data.test_plane = PRIMARY;
> > @@ -517,7 +450,7 @@ igt_main
> >               }
> >       }
> >
> > -     for (op = PLANE_ONOFF; op <= PLANE_ONOFF; op++) {
> > +     for (op = MMAP_GTT; op <= PLANE_ONOFF; op++) {
> >               igt_subtest_f("sprite_%s", op_str(op)) {
> >                       data.test_plane = SPRITE;
> >                       data.op = op;
> > @@ -525,7 +458,7 @@ igt_main
> >               }
> >       }
> >
> > -     for (op = PLANE_MOVE; op <= PLANE_MOVE; op++) {
> > +     for (op = MMAP_GTT; op <= PLANE_ONOFF; op++) {
> >               igt_subtest_f("cursor_%s", op_str(op)) {
> >                       data.test_plane = CURSOR;
> >                       data.op = op;
> > --
> > 1.9.3
> >
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
> --
> Daniel Vetter
> Software Engineer, Intel Corporation
> +41 (0) 79 365 57 48 - http://blog.ffwll.ch
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>



-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br

[-- Attachment #1.2: Type: text/html, Size: 26141 bytes --]

[-- Attachment #2: Type: text/plain, Size: 159 bytes --]

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 09/12] tests/kms_psr_sink_crc: Fix all testcases.
  2014-09-04 20:24     ` Rodrigo Vivi
@ 2014-09-05  0:55       ` Rodrigo Vivi
  2014-09-05  8:32         ` Daniel Vetter
  0 siblings, 1 reply; 19+ messages in thread
From: Rodrigo Vivi @ 2014-09-05  0:55 UTC (permalink / raw)
  To: Daniel Vetter; +Cc: intel-gfx, Rodrigo Vivi


[-- Attachment #1.1: Type: text/plain, Size: 20879 bytes --]

adding suspend_autoresume on primary tests like this:
@ -470,6 +472,8 @@ igt_main
                        data.test_plane = PRIMARY;
                        data.op = op;
                        run_test(&data);
+                       igt_system_suspend_autoresume();
+                       run_test(&data);

on BDW I got these results:


vivijim rdvivi-seattle tests$ sudo ./kms_psr_sink_crc
IGT-Version: 1.7-gd4b43f0 (x86_64) (Linux: 3.17.0-rc2+ x86_64)
rtcwake: wakeup from "mem" using /dev/rtc0 at Fri Sep  5 00:44:03 2014
Subtest primary_page_flip: SUCCESS
rtcwake: wakeup from "mem" using /dev/rtc0 at Fri Sep  5 00:44:40 2014
Subtest primary_mmap_gtt: SUCCESS
Waiting 10s...
rtcwake: wakeup from "mem" using /dev/rtc0 at Fri Sep  5 00:45:27 2014
Waiting 10s...
Subtest primary_mmap_gtt_waiting: SUCCESS
rtcwake: wakeup from "mem" using /dev/rtc0 at Fri Sep  5 00:46:13 2014
Subtest primary_mmap_cpu: SUCCESS
rtcwake: wakeup from "mem" using /dev/rtc0 at Fri Sep  5 00:46:50 2014
Subtest primary_blt: SUCCESS
rtcwake: wakeup from "mem" using /dev/rtc0 at Fri Sep  5 00:47:27 2014
Subtest primary_render: SUCCESS

on HSW I couldn't test because suspend/resume breaks even with psr disabled.
I'm going to check more tomorrow..

But regarding the suspend resume test, how do you suggest to organize it?
Extra loops for all current cases?
suspend_{primary, sprite, cursor}_{page_flip, mmap_gtt, etc}? I believe the
test will take so long to finish on this case what is bad for qa alghouth
it is the complete one. What do you think?




















On Thu, Sep 4, 2014 at 1:24 PM, Rodrigo Vivi <rodrigo.vivi@gmail.com> wrote:

>
>
>
> On Thu, Sep 4, 2014 at 2:04 AM, Daniel Vetter <daniel@ffwll.ch> wrote:
>
>> On Wed, Sep 03, 2014 at 09:30:03PM -0400, Rodrigo Vivi wrote:
>> > In order to get all test cases fixed and the matrix planes-operations
>> working
>> > it was needed to use the common new igt kms functions for all cases.
>> > Previously only sprite testcase was using it.
>> >
>> > Fixed the fb colors in a way to make tests more clear and be impossible
>> to see
>> > black screen during the tests.
>> >
>> > Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
>>
>> Ok, everything changed ;-) So a bit hard to review just as a patch and so
>> just a few comments on top:
>>
>
> I'm sorry about that.... I got surprised I could split all in 9 patches,
> but I know this one staid ugly.
>
>
>> - Looks good overall, but the gold standard is whether it'll catch bugs.
>>   So if you remove some of the frontbuffer tracking (as little as possible
>>   in each test) and the new testcase catches it all, then I think we're
>>   good.
>>
>
> It is already catching something, what is good! :)
> and not broken anymore!
>
>
>>
>> - I think we should have a residency check before we grab a new crc, to
>>   make sure that we're really again (or if the kernel is buggy, still) in
>>   psr mode.
>>
>
> yeah, but residency check is bad for vlv/chv.
>
>
>>
>> - Checking for mismatching crc is risky, see the comment in a different
>>   reply in this thread.
>>
>> But overall looks good so probably best to just push these patches and
>> then fixup anything missing afterwards. I'll read through the entire test
>> again once it all landed to double-check we haven't missed anything really
>> important.
>>
>
> cool. Thanks!
>
>
>>
>> Aside: A suspend/resume testcase might be useful, if it can reliably
>> reproduce the issue you're working on. But again, follow-up.
>>
>
> For sure. I just saw we have igt_system_suspend_autoresume. I'll
> definetely add another test using it.
>
>
>
>> -Daniel
>>
>> > ---
>> >  tests/kms_psr_sink_crc.c | 269
>> ++++++++++++++++++-----------------------------
>> >  1 file changed, 101 insertions(+), 168 deletions(-)
>> >
>> > diff --git a/tests/kms_psr_sink_crc.c b/tests/kms_psr_sink_crc.c
>> > index 4358889..27f3df9 100644
>> > --- a/tests/kms_psr_sink_crc.c
>> > +++ b/tests/kms_psr_sink_crc.c
>> > @@ -27,8 +27,6 @@
>> >  #include <stdio.h>
>> >  #include <string.h>
>> >
>> > -#include "drm_fourcc.h"
>> > -
>> >  #include "ioctl_wrappers.h"
>> >  #include "drmtest.h"
>> >  #include "intel_bufmgr.h"
>> > @@ -79,88 +77,37 @@ typedef struct {
>> >       int drm_fd;
>> >       enum planes test_plane;
>> >       enum operations op;
>> > -     drmModeRes *resources;
>> > -     drm_intel_bufmgr *bufmgr;
>> >       uint32_t devid;
>> > -     uint32_t handle[2];
>> >       uint32_t crtc_id;
>> > -     uint32_t crtc_idx;
>> > -     uint32_t fb_id[3];
>> > -     struct kmstest_connector_config config;
>> >       igt_display_t display;
>> > -     struct igt_fb fb[2];
>> > -     igt_plane_t *plane[2];
>> > +     drm_intel_bufmgr *bufmgr;
>> > +     struct igt_fb fb_green, fb_white;
>> > +     igt_plane_t *primary, *sprite, *cursor;
>> >  } data_t;
>> >
>> > -static uint32_t create_fb(data_t *data,
>> > -                       int w, int h,
>> > -                       double r, double g, double b,
>> > -                       struct igt_fb *fb)
>> > +static void create_cursor_fb(data_t *data)
>> >  {
>> > -     uint32_t fb_id;
>> >       cairo_t *cr;
>> > +     uint32_t fb_id;
>> >
>> > -     fb_id = igt_create_fb(data->drm_fd, w, h,
>> > -                           DRM_FORMAT_XRGB8888, I915_TILING_X, fb);
>> > +     fb_id = igt_create_fb(data->drm_fd, 64, 64,
>> > +                           DRM_FORMAT_ARGB8888, I915_TILING_NONE,
>> > +                           &data->fb_white);
>> >       igt_assert(fb_id);
>> >
>> > -     cr = igt_get_cairo_ctx(data->drm_fd, fb);
>> > -     igt_paint_color(cr, 0, 0, w, h, r, g, b);
>> > -     igt_assert(cairo_status(cr) == 0);
>> > -     cairo_destroy(cr);
>> > -
>> > -     return fb_id;
>> > -}
>> > -
>> > -static void create_cursor_fb(data_t *data, struct igt_fb *fb)
>> > -{
>> > -     cairo_t *cr;
>> > -
>> > -     data->fb_id[2] = igt_create_fb(data->drm_fd, 64, 64,
>> > -                                    DRM_FORMAT_ARGB8888,
>> I915_TILING_NONE,
>> > -                                    fb);
>> > -     igt_assert(data->fb_id[2]);
>> > -
>> > -     cr = igt_get_cairo_ctx(data->drm_fd, fb);
>> > +     cr = igt_get_cairo_ctx(data->drm_fd, &data->fb_white);
>> >       igt_paint_color_alpha(cr, 0, 0, 64, 64, 1.0, 1.0, 1.0, 1.0);
>> >       igt_assert(cairo_status(cr) == 0);
>> >  }
>> >
>> > -static bool
>> > -connector_set_mode(data_t *data, drmModeModeInfo *mode, uint32_t fb_id)
>> > -{
>> > -     struct kmstest_connector_config *config = &data->config;
>> > -     int ret;
>> > -
>> > -#if 0
>> > -     fprintf(stdout, "Using pipe %s, %dx%d\n",
>> kmstest_pipe_name(config->pipe),
>> > -             mode->hdisplay, mode->vdisplay);
>> > -#endif
>> > -
>> > -     ret = drmModeSetCrtc(data->drm_fd,
>> > -                          config->crtc->crtc_id,
>> > -                          fb_id,
>> > -                          0, 0, /* x, y */
>> > -                          &config->connector->connector_id,
>> > -                          1,
>> > -                          mode);
>> > -     igt_assert(ret == 0);
>> > -
>> > -     return 0;
>> > -}
>> > -
>> >  static void display_init(data_t *data)
>> >  {
>> >       igt_display_init(&data->display, data->drm_fd);
>> > -     data->resources = drmModeGetResources(data->drm_fd);
>> > -     igt_assert(data->resources);
>> >  }
>> >
>> >  static void display_fini(data_t *data)
>> >  {
>> >       igt_display_fini(&data->display);
>> > -     drmModeSetCursor(data->drm_fd, data->crtc_id, 0, 0, 0);
>> > -     drmModeFreeResources(data->resources);
>> >  }
>> >
>> >  static void fill_blt(data_t *data, uint32_t handle, unsigned char
>> color)
>> > @@ -316,112 +263,105 @@ static void get_sink_crc(data_t *data, char
>> *crc) {
>> >
>> >  static void test_crc(data_t *data)
>> >  {
>> > -     uint32_t handle = data->handle[0];
>> > +     uint32_t handle = data->fb_white.gem_handle;
>> > +     igt_plane_t *test_plane;
>> > +     void *ptr;
>> >       char ref_crc[12];
>> >       char crc[12];
>> >
>> > -     if (data->op == PLANE_MOVE) {
>> > -             igt_assert(drmModeSetCursor(data->drm_fd, data->crtc_id,
>> > -                                         handle, 64, 64) == 0);
>> > -             igt_assert(drmModeMoveCursor(data->drm_fd, data->crtc_id,
>> > -                                          1, 1) == 0);
>> > +     igt_plane_set_fb(data->primary, &data->fb_green);
>> > +     igt_display_commit(&data->display);
>> > +
>> > +     /* Setting a secondary fb/plane */
>> > +     switch (data->test_plane) {
>> > +     case PRIMARY: default: test_plane = data->primary; break;
>> > +     case SPRITE: test_plane = data->sprite; break;
>> > +     case CURSOR: test_plane = data->cursor; break;
>> >       }
>> > +     igt_plane_set_fb(test_plane, &data->fb_white);
>> > +     igt_display_commit(&data->display);
>> >
>> >       igt_assert(wait_psr_entry(data, 10));
>> >       get_sink_crc(data, ref_crc);
>> >
>> >       switch (data->op) {
>> > -             void *ptr;
>> >       case PAGE_FLIP:
>> > +             /* Only in use when testing primary plane */
>> >               igt_assert(drmModePageFlip(data->drm_fd, data->crtc_id,
>> > -                                        data->fb_id[1], 0, NULL) == 0);
>> > +                                        data->fb_green.fb_id, 0, NULL)
>> == 0);
>> >               break;
>> > -     case MMAP_CPU:
>> > -             ptr = gem_mmap__cpu(data->drm_fd, handle, 4096,
>> PROT_WRITE);
>> > +     case MMAP_GTT:
>> > +             ptr = gem_mmap__gtt(data->drm_fd, handle, 4096,
>> PROT_WRITE);
>> >               gem_set_domain(data->drm_fd, handle,
>> > -                            I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
>> > -             sleep(1);
>> > +                            I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
>> >               memset(ptr, 0, 4);
>> >               munmap(ptr, 4096);
>> > -             sleep(1);
>> > -             gem_sw_finish(data->drm_fd, handle);
>> >               break;
>> > -     case MMAP_GTT:
>> >       case MMAP_GTT_WAITING:
>> >               ptr = gem_mmap__gtt(data->drm_fd, handle, 4096,
>> PROT_WRITE);
>> >               gem_set_domain(data->drm_fd, handle,
>> >                              I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
>> > +
>> > +             /* Printing white on white so the screen shouldn't change
>> */
>> >               memset(ptr, 0xff, 4);
>> > +             get_sink_crc(data, crc);
>> > +             igt_assert(strcmp(ref_crc, crc) == 0);
>> > +
>> > +             fprintf(stdout, "Waiting 10s...\n");
>> > +             sleep(10);
>> > +
>> > +             /* Now lets print black to change the screen */
>> > +             memset(ptr, 0, 4);
>> >               munmap(ptr, 4096);
>> > -             gem_bo_busy(data->drm_fd, handle);
>> > +             break;
>> > +     case MMAP_CPU:
>> > +             ptr = gem_mmap__cpu(data->drm_fd, handle, 4096,
>> PROT_WRITE);
>> > +             gem_set_domain(data->drm_fd, handle,
>> > +                            I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
>> > +             memset(ptr, 0, 4);
>> > +             munmap(ptr, 4096);
>> > +             gem_sw_finish(data->drm_fd, handle);
>> >               break;
>> >       case BLT:
>> > -             fill_blt(data, handle, 0xff);
>> > +             fill_blt(data, handle, 0);
>> >               break;
>> >       case RENDER:
>> > -             fill_render(data, handle, 0xff);
>> > +             fill_render(data, handle, 0);
>> >               break;
>> >       case PLANE_MOVE:
>> > -             igt_assert(drmModeMoveCursor(data->drm_fd, data->crtc_id,
>> 1, 2) == 0);
>> > +             /* Only in use when testing Sprite and Cursor */
>> > +             igt_plane_set_position(test_plane, 1, 1);
>> > +             igt_display_commit(&data->display);
>> >               break;
>> >       case PLANE_ONOFF:
>> > -             igt_plane_set_fb(data->plane[0], &data->fb[0]);
>> > -             igt_display_commit(&data->display);
>> > -             igt_plane_set_fb(data->plane[1], &data->fb[1]);
>> > +             /* Only in use when testing Sprite and Cursor */
>> > +             igt_plane_set_fb(test_plane, NULL);
>> >               igt_display_commit(&data->display);
>> >               break;
>> >       }
>> > -
>> > -     igt_wait_for_vblank(data->drm_fd, data->crtc_idx);
>> > -
>> >       get_sink_crc(data, crc);
>> >       igt_assert(strcmp(ref_crc, crc) != 0);
>> >  }
>> >
>> > -static bool prepare_crtc(data_t *data, uint32_t connector_id)
>> > -{
>> > -     if (!kmstest_get_connector_config(data->drm_fd,
>> > -                                       connector_id,
>> > -                                       1 << data->crtc_idx,
>> > -                                       &data->config))
>> > -             return false;
>> > -
>> > -     data->fb_id[0] = create_fb(data,
>> > -                                data->config.default_mode.hdisplay,
>> > -                                data->config.default_mode.vdisplay,
>> > -                                0.0, 1.0, 0.0, &data->fb[0]);
>> > -     igt_assert(data->fb_id[0]);
>> > -
>> > -     if (data->op == PLANE_MOVE)
>> > -             create_cursor_fb(data, &data->fb[0]);
>> > -
>> > -     data->fb_id[1] = create_fb(data,
>> > -                                data->config.default_mode.hdisplay,
>> > -                                data->config.default_mode.vdisplay,
>> > -                                1.0, 0.0, 0.0, &data->fb[1]);
>> > -     igt_assert(data->fb_id[1]);
>> > -
>> > -     data->handle[0] = data->fb[0].gem_handle;
>> > -     data->handle[1] = data->fb[1].gem_handle;
>> > -
>> > -     /* scanout = fb[1] */
>> > -     connector_set_mode(data, &data->config.default_mode,
>> > -                        data->fb_id[1]);
>> > +static void test_cleanup(data_t *data) {
>> > +     igt_plane_set_fb(data->primary, NULL);
>> > +     if (data->test_plane == SPRITE)
>> > +             igt_plane_set_fb(data->sprite, NULL);
>> > +     if (data->test_plane == CURSOR)
>> > +             igt_plane_set_fb(data->cursor, NULL);
>> >
>> > -     /* scanout = fb[0] */
>> > -     connector_set_mode(data, &data->config.default_mode,
>> > -                        data->fb_id[0]);
>> > +     igt_display_commit(&data->display);
>> >
>> > -     kmstest_free_connector_config(&data->config);
>> > -
>> > -     return true;
>> > +     igt_remove_fb(data->drm_fd, &data->fb_green);
>> > +     igt_remove_fb(data->drm_fd, &data->fb_white);
>> >  }
>> >
>> > -static void test_sprite(data_t *data)
>> > +static void run_test(data_t *data)
>> >  {
>> >       igt_display_t *display = &data->display;
>> >       igt_output_t *output;
>> >       drmModeModeInfo *mode;
>> > +     uint32_t white_h, white_v;
>> >
>> >       for_each_connected_output(display, output) {
>> >               drmModeConnectorPtr c = output->config.connector;
>> > @@ -431,6 +371,7 @@ static void test_sprite(data_t *data)
>> >                       continue;
>> >
>> >               igt_output_set_pipe(output, PIPE_ANY);
>> > +             data->crtc_id = output->config.crtc->crtc_id;
>> >
>> >               mode = igt_output_get_mode(output);
>> >
>> > @@ -438,51 +379,45 @@ static void test_sprite(data_t *data)
>> >                                   mode->hdisplay, mode->vdisplay,
>> >                                   DRM_FORMAT_XRGB8888, I915_TILING_X,
>> >                                   0.0, 1.0, 0.0,
>> > -                                 &data->fb[0]);
>> > -
>> > -             igt_create_color_fb(data->drm_fd,
>> > -                                 mode->hdisplay/2, mode->vdisplay/2,
>> > -                                 DRM_FORMAT_XRGB8888, I915_TILING_X,
>> > -                                 1.0, 0.0, 0.0,
>> > -                                 &data->fb[1]);
>> > +                                 &data->fb_green);
>> > +
>> > +             data->primary = igt_output_get_plane(output,
>> IGT_PLANE_PRIMARY);
>> > +             igt_plane_set_fb(data->primary, NULL);
>> > +
>> > +             white_h = mode->hdisplay;
>> > +             white_v = mode->vdisplay;
>> > +
>> > +             switch (data->test_plane) {
>> > +             case SPRITE:
>> > +                     data->sprite = igt_output_get_plane(output,
>> > +                                                         IGT_PLANE_2);
>> > +                     igt_plane_set_fb(data->sprite, NULL);
>> > +                     /* To make it different for human eyes let's make
>> > +                      * sprite visible in only one quarter of the
>> primary
>> > +                      */
>> > +                     white_h = white_h/2;
>> > +                     white_v = white_v/2;
>> > +             case PRIMARY:
>> > +                     igt_create_color_fb(data->drm_fd,
>> > +                                         white_h, white_v,
>> > +                                         DRM_FORMAT_XRGB8888,
>> I915_TILING_X,
>> > +                                         1.0, 1.0, 1.0,
>> > +                                         &data->fb_white);
>> > +                     break;
>> > +             case CURSOR:
>> > +                     data->cursor = igt_output_get_plane(output,
>> > +
>>  IGT_PLANE_CURSOR);
>> > +                     igt_plane_set_fb(data->cursor, NULL);
>> > +                     create_cursor_fb(data);
>> > +                     igt_plane_set_position(data->cursor, 0, 0);
>> > +                     break;
>> > +             }
>> >
>> > -             data->plane[0] = igt_output_get_plane(output, 0);
>> > -             data->plane[1] = igt_output_get_plane(output, 1);
>> > +             igt_display_commit(&data->display);
>> >
>> >               test_crc(data);
>> > -     }
>> > -}
>> > -
>> > -static void run_test(data_t *data)
>> > -{
>> > -     int i, n;
>> > -     drmModeConnectorPtr c;
>> > -     /* Baytrail supports per-pipe PSR configuration, however PSR on
>> > -      * PIPE_B isn't working properly. So let's keep it disabled for
>> now.
>> > -      * crtcs = IS_VALLEYVIEW(data->devid)? 2 : 1; */
>> > -     int crtcs = 1;
>> > -
>> > -     if (data->op == PLANE_ONOFF) {
>> > -             test_sprite(data);
>> > -             return;
>> > -     }
>> >
>> > -     for (i = 0; i < data->resources->count_connectors; i++) {
>> > -             uint32_t connector_id = data->resources->connectors[i];
>> > -             c = drmModeGetConnector(data->drm_fd, connector_id);
>> > -
>> > -             if (c->connector_type != DRM_MODE_CONNECTOR_eDP ||
>> > -                 c->connection != DRM_MODE_CONNECTED)
>> > -                     continue;
>> > -             for (n = 0; n < crtcs; n++) {
>> > -                     data->crtc_idx = n;
>> > -                     data->crtc_id = data->resources->crtcs[n];
>> > -
>> > -                     if (!prepare_crtc(data, connector_id))
>> > -                             continue;
>> > -
>> > -                     test_crc(data);
>> > -             }
>> > +             test_cleanup(data);
>> >       }
>> >  }
>> >
>> > @@ -496,7 +431,6 @@ igt_main
>> >       igt_fixture {
>> >               data.drm_fd = drm_open_any();
>> >               kmstest_set_vt_graphics_mode();
>> > -
>> >               data.devid = intel_get_drm_devid(data.drm_fd);
>> >
>> >               igt_skip_on(!psr_enabled(&data));
>> > @@ -508,7 +442,6 @@ igt_main
>> >               display_init(&data);
>> >       }
>> >
>> > -
>> >       for (op = PAGE_FLIP; op <= RENDER; op++) {
>> >               igt_subtest_f("primary_%s", op_str(op)) {
>> >                       data.test_plane = PRIMARY;
>> > @@ -517,7 +450,7 @@ igt_main
>> >               }
>> >       }
>> >
>> > -     for (op = PLANE_ONOFF; op <= PLANE_ONOFF; op++) {
>> > +     for (op = MMAP_GTT; op <= PLANE_ONOFF; op++) {
>> >               igt_subtest_f("sprite_%s", op_str(op)) {
>> >                       data.test_plane = SPRITE;
>> >                       data.op = op;
>> > @@ -525,7 +458,7 @@ igt_main
>> >               }
>> >       }
>> >
>> > -     for (op = PLANE_MOVE; op <= PLANE_MOVE; op++) {
>> > +     for (op = MMAP_GTT; op <= PLANE_ONOFF; op++) {
>> >               igt_subtest_f("cursor_%s", op_str(op)) {
>> >                       data.test_plane = CURSOR;
>> >                       data.op = op;
>> > --
>> > 1.9.3
>> >
>> > _______________________________________________
>> > Intel-gfx mailing list
>> > Intel-gfx@lists.freedesktop.org
>> > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>>
>> --
>> Daniel Vetter
>> Software Engineer, Intel Corporation
>> +41 (0) 79 365 57 48 - http://blog.ffwll.ch
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx@lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>>
>
>
>
> --
> Rodrigo Vivi
> Blog: http://blog.vivi.eng.br
>
>



-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br

[-- Attachment #1.2: Type: text/html, Size: 29207 bytes --]

[-- Attachment #2: Type: text/plain, Size: 159 bytes --]

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 09/12] tests/kms_psr_sink_crc: Fix all testcases.
  2014-09-05  0:55       ` Rodrigo Vivi
@ 2014-09-05  8:32         ` Daniel Vetter
  0 siblings, 0 replies; 19+ messages in thread
From: Daniel Vetter @ 2014-09-05  8:32 UTC (permalink / raw)
  To: Rodrigo Vivi; +Cc: intel-gfx, Rodrigo Vivi

On Thu, Sep 04, 2014 at 05:55:24PM -0700, Rodrigo Vivi wrote:
> adding suspend_autoresume on primary tests like this:
> @ -470,6 +472,8 @@ igt_main
>                         data.test_plane = PRIMARY;
>                         data.op = op;
>                         run_test(&data);
> +                       igt_system_suspend_autoresume();
> +                       run_test(&data);
> 
> on BDW I got these results:
> 
> 
> vivijim rdvivi-seattle tests$ sudo ./kms_psr_sink_crc
> IGT-Version: 1.7-gd4b43f0 (x86_64) (Linux: 3.17.0-rc2+ x86_64)
> rtcwake: wakeup from "mem" using /dev/rtc0 at Fri Sep  5 00:44:03 2014
> Subtest primary_page_flip: SUCCESS
> rtcwake: wakeup from "mem" using /dev/rtc0 at Fri Sep  5 00:44:40 2014
> Subtest primary_mmap_gtt: SUCCESS
> Waiting 10s...
> rtcwake: wakeup from "mem" using /dev/rtc0 at Fri Sep  5 00:45:27 2014
> Waiting 10s...
> Subtest primary_mmap_gtt_waiting: SUCCESS
> rtcwake: wakeup from "mem" using /dev/rtc0 at Fri Sep  5 00:46:13 2014
> Subtest primary_mmap_cpu: SUCCESS
> rtcwake: wakeup from "mem" using /dev/rtc0 at Fri Sep  5 00:46:50 2014
> Subtest primary_blt: SUCCESS
> rtcwake: wakeup from "mem" using /dev/rtc0 at Fri Sep  5 00:47:27 2014
> Subtest primary_render: SUCCESS
> 
> on HSW I couldn't test because suspend/resume breaks even with psr disabled.
> I'm going to check more tomorrow..
> 
> But regarding the suspend resume test, how do you suggest to organize it?
> Extra loops for all current cases?
> suspend_{primary, sprite, cursor}_{page_flip, mmap_gtt, etc}? I believe the
> test will take so long to finish on this case what is bad for qa alghouth
> it is the complete one. What do you think?

I think we don't need the full set of tests also with system suspend. I
think just one test which catches the current bug is good enough, after
all if psr is set up correctly it should work the same at runtime than
over s/r. And since this is a test I'd just copypaste the relevant subtest
(if it doesn't integrate quickly into the existing code), not worth at all
to make a big fuzz.

And we have lots of resume tests already, they "only" take about
30 second. Only important to have "suspend" somewhere in the subtest name
so that all system suspend tests can easily be filtered out/selected.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch

^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH] tests/kms_sink_crc_basic: Simplify test by using igt_kms functions
  2014-09-04  1:29 ` [PATCH 03/12] tests/kms_sink_crc_basic: Simplify test by using igt_kms functions Rodrigo Vivi
@ 2014-09-09 23:09   ` Rodrigo Vivi
  2014-09-09 23:09   ` [PATCH] tests/kms_sink_crc_basic: Wait 2 vblanks before grabing the new crc Rodrigo Vivi
  1 sibling, 0 replies; 19+ messages in thread
From: Rodrigo Vivi @ 2014-09-09 23:09 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi

v2: sink CRC R, G and B might change depending on display. So let's split the
colors and bitwise them.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 tests/kms_sink_crc_basic.c | 175 +++++++++++++++++++++------------------------
 1 file changed, 82 insertions(+), 93 deletions(-)

diff --git a/tests/kms_sink_crc_basic.c b/tests/kms_sink_crc_basic.c
index 3703dc1..a7febe8 100644
--- a/tests/kms_sink_crc_basic.c
+++ b/tests/kms_sink_crc_basic.c
@@ -34,20 +34,18 @@
 #include "igt_debugfs.h"
 #include "igt_kms.h"
 
+#define CRC_BLACK "000000000000"
+
 enum color {
-	WHITE,
-	BLACK,
-	NUM_COLORS,
+	RED,
+	GREEN,
 };
 
 typedef struct {
-	struct kmstest_connector_config config;
-	struct igt_fb fb;
-} connector_t;
-
-typedef struct {
 	int drm_fd;
-	drmModeRes *resources;
+	igt_display_t display;
+	struct igt_fb fb_green, fb_red;
+	igt_plane_t *primary;
 } data_t;
 
 static void get_crc(char *crc) {
@@ -59,111 +57,104 @@ static void get_crc(char *crc) {
 	igt_require(ret > 0);
 
 	fclose(file);
-}
-
-static uint32_t create_fb(data_t *data,
-			  int w, int h,
-			  double r, double g, double b,
-			  struct igt_fb *fb)
-{
-	cairo_t *cr;
-	uint32_t fb_id;
-
-	fb_id = igt_create_fb(data->drm_fd, w, h,
-			      DRM_FORMAT_XRGB8888, I915_TILING_NONE, fb);
-	igt_assert(fb_id);
 
-	cr = igt_get_cairo_ctx(data->drm_fd, fb);
-	igt_paint_color(cr, 0, 0, w, h, r, g, b);
-	igt_assert(cairo_status(cr) == 0);
-
-	return fb_id;
+	/* Black screen is always invalid */
+	igt_assert(strcmp(crc, CRC_BLACK) != 0);
 }
 
-static bool
-connector_set_mode(data_t *data, connector_t *connector, drmModeModeInfo *mode,
-		   enum color crtc_color)
+static void assert_color(char *crc, enum color color)
 {
-	struct kmstest_connector_config *config = &connector->config;
-	unsigned int fb_id;
+	char color_mask[5] = "FFFF\0";
+	char rs[5], gs[5], bs[5];
+	unsigned int rh, gh, bh, mask;
 	int ret;
 
-	if (crtc_color == WHITE)
-		fb_id = create_fb(data, mode->hdisplay, mode->vdisplay,
-				  1.0, 1.0, 1.0, &connector->fb);
-	else
-		fb_id = create_fb(data, mode->hdisplay, mode->vdisplay,
-				  0.0, 0.0, 0.0, &connector->fb);
-	igt_assert(fb_id);
-
-	ret = drmModeSetCrtc(data->drm_fd,
-			     config->crtc->crtc_id,
-			     connector->fb.fb_id,
-			     0, 0, /* x, y */
-			     &config->connector->connector_id,
-			     1,
-			     mode);
-	igt_assert(ret == 0);
-
-	return 0;
-}
-
-static void basic_sink_crc_check(data_t *data, uint32_t connector_id)
-{
-	connector_t connector;
-	char ref_crc_white[12];
-	char ref_crc_black[12];
-	char crc_check[12];
-
-	igt_require(kmstest_get_connector_config(data->drm_fd,
-						 connector_id,
-						 1 << 0,
-						 &connector.config));
-
-	/*Go White*/
-	connector_set_mode(data, &connector, &connector.config.default_mode, WHITE);
+	sscanf(color_mask, "%4x", &mask);
 
-	/* get reference crc for white color */
-	get_crc(ref_crc_white);
+	memcpy(rs, &crc[0], 4);
+	rs[4] = '\0';
+	ret = sscanf(rs, "%4x", &rh);
+	igt_require(ret > 0);
 
-	/* Go Black */
-	connector_set_mode(data, &connector, &connector.config.default_mode, BLACK);
+	memcpy(gs, &crc[4], 4);
+	gs[4] = '\0';
+	ret = sscanf(gs, "%4x", &gh);
+	igt_require(ret > 0);
 
-	/* get reference crc for black color */
-	get_crc(ref_crc_black);
+	memcpy(bs, &crc[8], 4);
+	bs[4] = '\0';
+	ret = sscanf(bs, "%4x", &bh);
+	igt_require(ret > 0);
 
-	igt_assert(strcmp(ref_crc_black, ref_crc_white) != 0);
+	switch (color) {
+	case RED:
+		igt_assert((rh & mask) != 0 &&
+			   (gh & mask) == 0 &&
+			   (bh & mask) == 0);
+		break;
+	case GREEN:
+		igt_assert((rh & mask) == 0 &&
+			   (gh & mask) != 0 &&
+			   (bh & mask) == 0);
+		break;
+	default:
+		igt_fail(-1);
+	}
+}
 
-	/*Go White again*/
-	connector_set_mode(data, &connector, &connector.config.default_mode, WHITE);
+static void basic_sink_crc_check(data_t *data)
+{
+	char crc[13];
 
-	get_crc(crc_check);
-	igt_assert(strcmp(crc_check, ref_crc_white) == 0);
+	/* Go Green */
+	igt_plane_set_fb(data->primary, &data->fb_green);
+	igt_display_commit(&data->display);
 
-	/* Go Black again */
-	connector_set_mode(data, &connector, &connector.config.default_mode, BLACK);
+	/* It should be Green */
+	get_crc(crc);
+	assert_color(crc, GREEN);
 
-	get_crc(crc_check);
-	igt_assert(strcmp(crc_check, ref_crc_black) == 0);
+	/* Go Red */
+	igt_plane_set_fb(data->primary, &data->fb_red);
+	igt_display_commit(&data->display);
 
-	kmstest_free_connector_config(&connector.config);
+	/* It should be Red */
+	get_crc(crc);
+	assert_color(crc, RED);
 }
 
 static void run_test(data_t *data)
 {
-	int i;
-	drmModeConnectorPtr c;
-	uint32_t connector_id = 0;
+	igt_display_t *display = &data->display;
+	igt_output_t *output;
+	drmModeModeInfo *mode;
 
-	for (i = 0; i < data->resources->count_connectors; i++) {
-		connector_id = data->resources->connectors[i];
-		c = drmModeGetConnector(data->drm_fd, connector_id);
+	for_each_connected_output(display, output) {
+		drmModeConnectorPtr c = output->config.connector;
 
 		if (c->connector_type != DRM_MODE_CONNECTOR_eDP ||
 		    c->connection != DRM_MODE_CONNECTED)
 			continue;
 
-		basic_sink_crc_check(data, connector_id);
+		igt_output_set_pipe(output, PIPE_ANY);
+
+		mode = igt_output_get_mode(output);
+
+		igt_create_color_fb(data->drm_fd,
+				    mode->hdisplay, mode->vdisplay,
+				    DRM_FORMAT_XRGB8888, I915_TILING_X,
+				    0.0, 1.0, 0.0,
+				    &data->fb_green);
+
+		igt_create_color_fb(data->drm_fd,
+				    mode->hdisplay, mode->vdisplay,
+				    DRM_FORMAT_XRGB8888, I915_TILING_X,
+				    1.0, 0.0, 0.0,
+				    &data->fb_red);
+
+		data->primary = igt_output_get_plane(output, IGT_PLANE_PRIMARY);
+
+		basic_sink_crc_check(data);
 		return;
 	}
 
@@ -179,11 +170,9 @@ igt_simple_main
 	data.drm_fd = drm_open_any();
 
 	kmstest_set_vt_graphics_mode();
-
-	data.resources = drmModeGetResources(data.drm_fd);
-	igt_assert(data.resources);
+	igt_display_init(&data.display, data.drm_fd);
 
 	run_test(&data);
 
-	drmModeFreeResources(data.resources);
+	igt_display_fini(&data.display);
 }
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH] tests/kms_sink_crc_basic: Wait 2 vblanks before grabing the new crc.
  2014-09-04  1:29 ` [PATCH 03/12] tests/kms_sink_crc_basic: Simplify test by using igt_kms functions Rodrigo Vivi
  2014-09-09 23:09   ` [PATCH] " Rodrigo Vivi
@ 2014-09-09 23:09   ` Rodrigo Vivi
  1 sibling, 0 replies; 19+ messages in thread
From: Rodrigo Vivi @ 2014-09-09 23:09 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 tests/kms_sink_crc_basic.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/tests/kms_sink_crc_basic.c b/tests/kms_sink_crc_basic.c
index a7febe8..69329bd 100644
--- a/tests/kms_sink_crc_basic.c
+++ b/tests/kms_sink_crc_basic.c
@@ -48,9 +48,14 @@ typedef struct {
 	igt_plane_t *primary;
 } data_t;
 
-static void get_crc(char *crc) {
+static void get_crc(data_t *data, char *crc) {
 	int ret;
-	FILE *file = igt_debugfs_fopen("i915_sink_crc_eDP1", "r");
+	FILE *file;
+
+	igt_wait_for_vblank(data->drm_fd, 0);
+	igt_wait_for_vblank(data->drm_fd, 0);
+
+	file = igt_debugfs_fopen("i915_sink_crc_eDP1", "r");
 	igt_require(file);
 
 	ret = fscanf(file, "%s\n", crc);
@@ -111,7 +116,7 @@ static void basic_sink_crc_check(data_t *data)
 	igt_display_commit(&data->display);
 
 	/* It should be Green */
-	get_crc(crc);
+	get_crc(data, crc);
 	assert_color(crc, GREEN);
 
 	/* Go Red */
@@ -119,7 +124,7 @@ static void basic_sink_crc_check(data_t *data)
 	igt_display_commit(&data->display);
 
 	/* It should be Red */
-	get_crc(crc);
+	get_crc(data, crc);
 	assert_color(crc, RED);
 }
 
@@ -136,7 +141,7 @@ static void run_test(data_t *data)
 		    c->connection != DRM_MODE_CONNECTED)
 			continue;
 
-		igt_output_set_pipe(output, PIPE_ANY);
+		igt_output_set_pipe(output, 0);
 
 		mode = igt_output_get_mode(output);
 
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH] tests: Kill pm_psr
       [not found] ` <20140904084707.GA15520@phenom.ffwll.local>
  2014-09-04 20:03   ` [PATCH 01/12] tests/pm_psr: Update pm_psr for new psr debug interface Rodrigo Vivi
@ 2014-09-09 23:12   ` Rodrigo Vivi
  1 sibling, 0 replies; 19+ messages in thread
From: Rodrigo Vivi @ 2014-09-09 23:12 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi

kms_psr_sink_crc check psr activity, residency and exit for screen updates.
So this test is useless.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 tests/Makefile.sources |  1 -
 tests/pm_psr.c         | 86 --------------------------------------------------
 2 files changed, 87 deletions(-)
 delete mode 100644 tests/pm_psr.c

diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index a6677dd..4dc508f 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -146,7 +146,6 @@ TESTS_progs = \
 	kms_force_connector \
 	kms_sink_crc_basic \
 	kms_fence_pin_leak \
-	pm_psr \
 	prime_udl \
 	$(NULL)
 
diff --git a/tests/pm_psr.c b/tests/pm_psr.c
deleted file mode 100644
index 3ab7e7a..0000000
--- a/tests/pm_psr.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) 2013 Intel Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- *
- * Authors:
- *    Rodrigo Vivi <rodrigo.vivi@intel.com>
- */
-
-#define _GNU_SOURCE
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include "drmtest.h"
-
-#define SLEEP_DURATION 5000 // in milliseconds
-
-static int get_perf(const char *path)
-{
-	int ret, perf;
-	FILE *file;
-	char str[4];
-
-	file = fopen(path, "r");
-	igt_assert(file);
-
-	ret = fscanf(file, "Sink_Support: %s\n", str);
-	igt_skip_on_f(ret == 0,
-		      "i915_edp_psr_status format not supported by this test case\n");
-	igt_require(strcmp(str, "yes") == 0);
-	ret = fscanf(file, "Source_OK: %s\n", str);
-	igt_assert(ret != 0);
-
-	igt_require(strcmp(str, "yes") == 0);
-
-	ret = fscanf(file, "Enabled: %s\n", str);
-	igt_assert(ret != 0);
-	igt_assert(strcmp(str, "yes") == 0);
-
-	ret = fscanf(file, "Performance_Counter: %i", &perf);
-	igt_assert(ret != 0);
-
-	igt_assert(perf);
-
-	fclose(file);
-	return perf;
-}
-
-igt_simple_main
-{
-	int ret, perf1, perf2;
-	int device = drm_get_card();
-	char *path;
-
-	igt_skip_on_simulation();
-
-	ret = asprintf(&path, "/sys/kernel/debug/dri/%d/i915_edp_psr_status", device);
-	igt_assert(ret != -1);
-
-	perf1 = get_perf(path);
-	sleep(SLEEP_DURATION / 1000);
-	perf2 = get_perf(path);
-
-	igt_assert_f(perf1 != perf2,
-		     "Unable to enter PSR state again\n");
-}
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2014-09-09 23:12 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-09-04  1:29 [PATCH 01/12] tests/pm_psr: Update pm_psr for new psr debug interface Rodrigo Vivi
2014-09-04  1:29 ` [PATCH 02/12] tests/kms_sink_crc_basic: Use igt_debugfs_fopen Rodrigo Vivi
2014-09-04  1:29 ` [PATCH 03/12] tests/kms_sink_crc_basic: Simplify test by using igt_kms functions Rodrigo Vivi
2014-09-09 23:09   ` [PATCH] " Rodrigo Vivi
2014-09-09 23:09   ` [PATCH] tests/kms_sink_crc_basic: Wait 2 vblanks before grabing the new crc Rodrigo Vivi
2014-09-04  1:29 ` [PATCH 04/12] tests/kms_psr_sink_crc: Fix edp_psr debugfs interface Rodrigo Vivi
2014-09-04  1:29 ` [PATCH 05/12] tests/kms_psr_sink_crc: Adding test debug options Rodrigo Vivi
2014-09-04  1:30 ` [PATCH 06/12] tests/kms_psr_sink_crc: Removing context tests Rodrigo Vivi
2014-09-04  1:30 ` [PATCH 07/12] tests/kms_psr_sink_crc: Cleaning up tests a bit Rodrigo Vivi
2014-09-04  1:30 ` [PATCH 08/12] tests/kms_psr_sink_crc: Start splitting tests in test_planes and operations Rodrigo Vivi
2014-09-04  1:30 ` [PATCH 09/12] tests/kms_psr_sink_crc: Fix all testcases Rodrigo Vivi
     [not found]   ` <20140904090413.GC15520@phenom.ffwll.local>
2014-09-04 20:24     ` Rodrigo Vivi
2014-09-05  0:55       ` Rodrigo Vivi
2014-09-05  8:32         ` Daniel Vetter
2014-09-04  1:30 ` [PATCH 10/12] tests/kms_psr_sink_crc: Check color ref CRC Rodrigo Vivi
2014-09-04  1:30 ` [PATCH 11/12] tests/kms_psr_sink_crc: Fix blt submission Rodrigo Vivi
2014-09-04  1:30 ` [PATCH 12/12] tests/kms_psr_sink_crc: Wait 2 vblanks before grabing the new crc Rodrigo Vivi
     [not found] ` <20140904084707.GA15520@phenom.ffwll.local>
2014-09-04 20:03   ` [PATCH 01/12] tests/pm_psr: Update pm_psr for new psr debug interface Rodrigo Vivi
2014-09-09 23:12   ` [PATCH] tests: Kill pm_psr Rodrigo Vivi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).