summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/kms_psr_sink_crc.c46
1 files changed, 39 insertions, 7 deletions
diff --git a/tests/kms_psr_sink_crc.c b/tests/kms_psr_sink_crc.c
index 3d8a41e8..7f0b989a 100644
--- a/tests/kms_psr_sink_crc.c
+++ b/tests/kms_psr_sink_crc.c
@@ -259,11 +259,14 @@ static void get_sink_crc(data_t *data, char *crc) {
int ret;
FILE *file;
+ if (igt_interactive_debug)
+ return;
+
file = igt_debugfs_fopen("i915_sink_crc_eDP1", "r");
igt_require(file);
ret = fscanf(file, "%s\n", crc);
- igt_require(ret > 0);
+ igt_require_f(ret > 0, "Sink CRC is unreliable on this machine. Try manual debug with --interactive-debug=manual\n");
fclose(file);
@@ -286,6 +289,9 @@ static bool is_green(char *crc)
unsigned int rh, gh, bh, mask;
int ret;
+ if (igt_interactive_debug)
+ return false;
+
sscanf(color_mask, "%4x", &mask);
memcpy(rs, &crc[0], 4);
@@ -308,6 +314,16 @@ static bool is_green(char *crc)
(bh & mask) == 0);
}
+static void assert_or_manual(bool condition, const char *expected)
+{
+ if (igt_interactive_debug)
+ igt_info("Is %s?\n", expected);
+ else
+ igt_debug("%s\n", expected);
+ igt_debug_wait_for_keypress("manual");
+ igt_assert(igt_interactive_debug || condition);
+}
+
static void test_crc(data_t *data)
{
uint32_t handle = data->fb_white.gem_handle;
@@ -315,18 +331,19 @@ static void test_crc(data_t *data)
void *ptr;
char ref_crc[12];
char crc[12];
+ const char *expected = "";
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(is_green(ref_crc));
+ assert_or_manual(is_green(ref_crc), "screen GREEN");
/* Confirm screen stays Green after PSR got active */
igt_assert(wait_psr_entry(data, 10));
get_sink_crc(data, ref_crc);
- igt_assert(is_green(ref_crc));
+ assert_or_manual(is_green(ref_crc), "screen GREEN");
/* Setting a secondary fb/plane */
switch (data->test_plane) {
@@ -340,7 +357,10 @@ static void test_crc(data_t *data)
/* Confirm it is not Green anymore */
igt_assert(wait_psr_entry(data, 10));
get_sink_crc(data, ref_crc);
- igt_assert(!is_green(ref_crc));
+ if (data->test_plane == PRIMARY)
+ assert_or_manual(!is_green(ref_crc), "screen WHITE");
+ else
+ assert_or_manual(!is_green(ref_crc), "GREEN background with WHITE box");
switch (data->op) {
case PAGE_FLIP:
@@ -348,7 +368,8 @@ static void test_crc(data_t *data)
igt_assert(drmModePageFlip(data->drm_fd, data->crtc_id,
data->fb_green.fb_id, 0, NULL) == 0);
get_sink_crc(data, crc);
- igt_assert(is_green(crc));
+ assert_or_manual(is_green(crc), "screen GREEN");
+ expected = "still GREEN";
break;
case MMAP_GTT:
ptr = gem_mmap__gtt(data->drm_fd, handle, data->mod_size,
@@ -357,6 +378,7 @@ static void test_crc(data_t *data)
I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
memset(ptr, 0xcc, data->mod_size);
munmap(ptr, data->mod_size);
+ expected = "BLACK or TRANSPARENT mark on top of plane in test";
break;
case MMAP_GTT_WAITING:
ptr = gem_mmap__gtt(data->drm_fd, handle, data->mod_size,
@@ -367,7 +389,11 @@ static void test_crc(data_t *data)
/* Printing white on white so the screen shouldn't change */
memset(ptr, 0xff, data->mod_size);
get_sink_crc(data, crc);
- igt_assert(strcmp(ref_crc, crc) == 0);
+ if (data->test_plane == PRIMARY)
+ assert_or_manual(strcmp(ref_crc, crc) == 0, "screen WHITE");
+ else
+ assert_or_manual(strcmp(ref_crc, crc) == 0,
+ "GREEN background with WHITE box");
igt_info("Waiting 10s...\n");
sleep(10);
@@ -375,6 +401,7 @@ static void test_crc(data_t *data)
/* Now lets print black to change the screen */
memset(ptr, 0, data->mod_size);
munmap(ptr, data->mod_size);
+ expected = "BLACK or TRANSPARENT mark on top of plane in test";
break;
case MMAP_CPU:
ptr = gem_mmap__cpu(data->drm_fd, handle, 0, data->mod_size, PROT_WRITE);
@@ -383,26 +410,31 @@ static void test_crc(data_t *data)
memset(ptr, 0, data->mod_size);
munmap(ptr, data->mod_size);
gem_sw_finish(data->drm_fd, handle);
+ expected = "BLACK or TRANSPARENT mark on top of plane in test";
break;
case BLT:
fill_blt(data, handle, 0);
+ expected = "BLACK or TRANSPARENT mark on top of plane in test";
break;
case RENDER:
fill_render(data, handle, 0);
+ expected = "BLACK or TRANSPARENT mark on top of plane in test";
break;
case PLANE_MOVE:
/* Only in use when testing Sprite and Cursor */
igt_plane_set_position(test_plane, 500, 500);
igt_display_commit(&data->display);
+ expected = "White box moved to 500x500";
break;
case PLANE_ONOFF:
/* Only in use when testing Sprite and Cursor */
igt_plane_set_fb(test_plane, NULL);
igt_display_commit(&data->display);
+ expected = "screen GREEN";
break;
}
get_sink_crc(data, crc);
- igt_assert(strcmp(ref_crc, crc) != 0);
+ assert_or_manual(strcmp(ref_crc, crc) != 0, expected);
}
static void test_cleanup(data_t *data) {