All of lore.kernel.org
 help / color / mirror / Atom feed
* [igt-dev] [PATCH i-g-t] tests/kms_available_modes_crc: Test all modes on all planes
@ 2018-03-20 16:13 Juha-Pekka Heikkila
  2018-03-20 18:06 ` [igt-dev] ✗ Fi.CI.BAT: warning for tests/kms_available_modes_crc: Test all modes on all planes (rev3) Patchwork
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Juha-Pekka Heikkila @ 2018-03-20 16:13 UTC (permalink / raw)
  To: igt-dev

Ask from kernel about supported modes for each plane and try setting
them on display and verify functionality with crc.

DRM_FORMAT_ARGB8888 and DRM_FORMAT_ABGR8888 skip crc testing on
primary and overlay planes because they produce incorrect crcs from
hardware. DRM_FORMAT_ARGB8888 is tested on cursor plane.

v2: Added support for planar formats.

v3: Address review comments from Mika Kahola.
Keep crc running for all tests while on same pipe, set tile height
to 16 and read only one crc per test.

Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
---
 tests/Makefile.sources          |   1 +
 tests/kms_available_modes_crc.c | 541 ++++++++++++++++++++++++++++++++++++++++
 tests/meson.build               |   1 +
 3 files changed, 543 insertions(+)
 create mode 100644 tests/kms_available_modes_crc.c

diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index f1d1cba..0622048 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -173,6 +173,7 @@ TESTS_progs = \
 	kms_atomic \
 	kms_atomic_interruptible \
 	kms_atomic_transition \
+	kms_available_modes_crc \
 	kms_busy \
 	kms_ccs \
 	kms_chv_cursor_fail \
diff --git a/tests/kms_available_modes_crc.c b/tests/kms_available_modes_crc.c
new file mode 100644
index 0000000..18c3685
--- /dev/null
+++ b/tests/kms_available_modes_crc.c
@@ -0,0 +1,541 @@
+/*
+ * Copyright © 2018 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.
+ *
+ */
+
+#include "drm_mode.h"
+#include "drm_fourcc.h"
+#include "igt.h"
+#include <sys/ioctl.h>
+
+IGT_TEST_DESCRIPTION("CRC test all different plane modes which kernel advertises.");
+
+typedef struct {
+	int gfx_fd;
+	igt_display_t display;
+	enum igt_commit_style commit;
+
+	struct igt_fb fb;
+	struct igt_fb primary_fb;
+
+	char format_name[5];
+	bool separateprimaryplane;
+
+	uint32_t gem_handle;
+	uint32_t gem_handle_yuv;
+	unsigned int size;
+	unsigned char* buf;
+
+	/*
+	 * comparison crcs
+	 */
+	igt_pipe_crc_t *pipe_crc;
+
+	igt_crc_t cursor_crc;
+	igt_crc_t fullscreen_crc;
+} data_t;
+
+
+static int do_write(int fd, int handle, void *buf, int size)
+{
+	struct drm_i915_gem_pwrite write;
+	memset(&write, 0x00, sizeof(write));
+	write.handle = handle;
+	write.data_ptr = (uintptr_t)buf;
+	write.size = size;
+	write.offset = 0;
+	return ioctl(fd, DRM_IOCTL_I915_GEM_PWRITE, &write);
+}
+
+
+static void generate_comparison_crc_list(data_t *data, igt_output_t *output)
+{
+	drmModeModeInfo *mode;
+	uint64_t w, h;
+	int fbid;
+	cairo_t *cr;
+	igt_plane_t *primary;
+
+	mode = igt_output_get_mode(output);
+	fbid = igt_create_color_fb(data->gfx_fd,
+				   mode->hdisplay,
+				   mode->vdisplay,
+				   intel_gen(intel_get_drm_devid(data->gfx_fd)) < 9 ? DRM_FORMAT_XRGB8888 : DRM_FORMAT_ARGB8888,
+				   LOCAL_DRM_FORMAT_MOD_NONE,
+				   0, 0, 0,
+				   &data->primary_fb);
+
+	igt_assert(fbid);
+
+	drmGetCap(data->gfx_fd, DRM_CAP_CURSOR_WIDTH, &w);
+	drmGetCap(data->gfx_fd, DRM_CAP_CURSOR_HEIGHT, &h);
+
+	cr = igt_get_cairo_ctx(data->gfx_fd, &data->primary_fb);
+	igt_paint_color(cr, 0, 0, mode->hdisplay, mode->vdisplay,
+			    0.0, 0.0, 0.0);
+	igt_paint_color(cr, 0, 0, w, h, 1.0, 1.0, 1.0);
+	igt_assert(cairo_status(cr) == 0);
+
+	primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
+	igt_plane_set_fb(primary, &data->primary_fb);
+	igt_display_commit2(&data->display, data->commit);
+
+	igt_pipe_crc_drain(data->pipe_crc);
+	igt_pipe_crc_get_single(data->pipe_crc, &data->cursor_crc);
+	igt_plane_set_fb(primary, NULL);
+	igt_display_commit2(&data->display, data->commit);
+
+	intel_gen(intel_get_drm_devid(data->gfx_fd)) < 9 ?
+		  igt_paint_color(cr, 0, 0, mode->hdisplay, mode->vdisplay, 1.0, 1.0, 1.0) :
+		  igt_paint_color_alpha(cr, 0, 0, mode->hdisplay, mode->vdisplay, 1.0, 1.0, 1.0, 1.0);
+
+	igt_plane_set_fb(primary, &data->primary_fb);
+	igt_display_commit2(&data->display, data->commit);
+
+	igt_pipe_crc_drain(data->pipe_crc);
+	igt_pipe_crc_get_single(data->pipe_crc, &data->fullscreen_crc);
+
+	cairo_destroy(cr);
+	igt_remove_fb(data->gfx_fd, &data->primary_fb);
+}
+
+/*
+ * fill_in_fb tell in return value if selected mode should be
+ * proceed to crc check
+ */
+static bool fill_in_fb(data_t *data, igt_output_t *output, igt_plane_t *plane,
+		       uint32_t format)
+{
+	signed i, c, writesize;
+	unsigned short* ptemp_16_buf;
+	unsigned int* ptemp_32_buf;
+
+	const struct {
+		uint32_t	fourcc;
+		char		zeropadding;
+		enum		{ BYTES_PP_1=1,
+				  BYTES_PP_2=2,
+				  BYTES_PP_4=4,
+				  NV12,
+#if defined(DRM_FORMAT_P010) || defined(DRM_FORMAT_P012) || defined(DRM_FORMAT_P016)
+				  P010,
+#endif
+				  SKIP } bpp;
+		uint32_t	value;
+	} fillers[] = {
+		{ DRM_FORMAT_C8, 0, BYTES_PP_1, 0xff},
+		{ DRM_FORMAT_RGB565, 0, BYTES_PP_2, 0xffff},
+		{ DRM_FORMAT_XRGB8888, 0, BYTES_PP_4, 0xffffffff},
+		{ DRM_FORMAT_XBGR8888, 0, BYTES_PP_4, 0xffffffff},
+
+		/*
+		 * following two are skipped because blending seems to work
+		 * incorrectly with exception of AR24 on cursor plane.
+		 * Test still creates the planes, just filling plane
+		 * and getting crc is skipped.
+		 */
+		{ DRM_FORMAT_ARGB8888, 0, SKIP, 0xffffffff},
+		{ DRM_FORMAT_ABGR8888, 0, SKIP, 0x00ffffff},
+
+		{ DRM_FORMAT_XRGB2101010, 0, BYTES_PP_4, 0xffffffff},
+		{ DRM_FORMAT_XBGR2101010, 0, BYTES_PP_4, 0xffffffff},
+
+		{ DRM_FORMAT_YUYV, 0, BYTES_PP_4, 0x80eb80eb},
+		{ DRM_FORMAT_YVYU, 0, BYTES_PP_4, 0x80eb80eb},
+		{ DRM_FORMAT_VYUY, 0, BYTES_PP_4, 0xeb80eb80},
+		{ DRM_FORMAT_UYVY, 0, BYTES_PP_4, 0xeb80eb80},
+
+		/*
+		 * (semi-)planar formats
+		 */
+		{ DRM_FORMAT_NV12, 0, NV12, 0x80eb},
+#ifdef DRM_FORMAT_P010
+		{ DRM_FORMAT_P010, 0, P010, 0x8000eb00},
+#endif
+#ifdef DRM_FORMAT_P012
+		{ DRM_FORMAT_P012, 0, P010, 0x8000eb00},
+#endif
+#ifdef DRM_FORMAT_P016
+		{ DRM_FORMAT_P016, 0, P010, 0x8000eb00},
+#endif
+		{ 0, 0, 0, 0 }
+	};
+
+	for( i = 0; fillers[i].fourcc != 0; i++ ) {
+		if( fillers[i].fourcc == format )
+			break;
+	}
+
+	switch (fillers[i].bpp) {
+	case BYTES_PP_4:
+		ptemp_32_buf = (unsigned int*)data->buf;
+		for (c = 0; c < data->size/4; c++)
+			ptemp_32_buf[c] = fillers[i].value;
+		writesize = data->size;
+		break;
+	case BYTES_PP_2:
+		ptemp_16_buf = (unsigned short*)data->buf;
+		for (c = 0; c < data->size/2; c++)
+			ptemp_16_buf[c] = (unsigned short)fillers[i].value;
+		writesize = data->size;
+		break;
+	case BYTES_PP_1:
+		memset((void*)data->buf, fillers[i].value, data->size);
+		writesize = data->size;
+		break;
+	case NV12:
+		memset((void*)data->buf, fillers[i].value&0xff,
+		       data->size);
+
+		memset((void*)(data->buf+data->size),
+		       (fillers[i].value>>8)&0xff, data->size/2);
+
+		writesize = data->size+data->size/2;
+		break;
+#if defined(DRM_FORMAT_P010) || defined(DRM_FORMAT_P012) || defined(DRM_FORMAT_P016)
+	case P010:
+		ptemp_16_buf = (unsigned short*)data->buf;
+		for (c = 0; c < data->size/2; c++)
+			ptemp_16_buf[c] = (unsigned short)fillers[i].value&0xffff;
+
+		ptemp_16_buf = (unsigned short*)(data->buf+data->size);
+		for (c = 0; c < data->size/2; c++)
+			ptemp_16_buf[c] = (unsigned short)(fillers[i].value>>16)&0xffff;
+
+		writesize = data->size+data->size/2;
+		break;
+#endif
+	case SKIP:
+		if (fillers[i].fourcc == DRM_FORMAT_ARGB8888 &&
+		    plane->type == DRM_PLANE_TYPE_CURSOR) {
+		/*
+		 * special for cursor plane where blending works correctly.
+		 */
+			ptemp_32_buf = (unsigned int*)data->buf;
+			for (c = 0; c < data->size/4; c++)
+				ptemp_32_buf[c] = fillers[i].value;
+			writesize = data->size;
+			break;
+		}
+		igt_info("Format %s CRC comparison skipped by design.\n",
+			 (char*)&fillers[i].fourcc);
+
+		return false;
+	default:
+		igt_info("Unsupported mode for test %s\n",
+			 (char*)&fillers[i].fourcc);
+		return false;
+	}
+
+	do_write(data->gfx_fd, data->gem_handle, (void*)data->buf, writesize);
+	return true;
+}
+
+
+static bool setup_fb(data_t *data, igt_output_t *output, igt_plane_t *plane,
+		     uint32_t format)
+{
+	drmModeModeInfo *mode;
+	uint64_t w, h;
+	signed ret, gemsize = 0;
+	unsigned tile_width, tile_height, stride;
+	uint32_t offsets[4] = {};
+	uint32_t* offsetpointer = NULL;
+
+	mode = igt_output_get_mode(output);
+	if (plane->type != DRM_PLANE_TYPE_CURSOR) {
+		w = mode->hdisplay ;
+		h = mode->vdisplay;
+	} else {
+		drmGetCap(data->gfx_fd, DRM_CAP_CURSOR_WIDTH, &w);
+		drmGetCap(data->gfx_fd, DRM_CAP_CURSOR_HEIGHT, &h);
+	}
+
+	switch(format) {
+#ifdef DRM_FORMAT_P010
+	case DRM_FORMAT_P010:
+#endif
+#ifdef DRM_FORMAT_P012
+	case DRM_FORMAT_P012:
+#endif
+#ifdef DRM_FORMAT_P016
+	case DRM_FORMAT_P016:
+#endif
+#if defined(DRM_FORMAT_P010) || defined(DRM_FORMAT_P012) || defined(DRM_FORMAT_P016)
+		tile_width = 512;
+		tile_height = 16;
+		stride = ALIGN(w*2, tile_width);
+		data->size = offsets[1] = stride*ALIGN(h, tile_height);
+		gemsize = data->size*2;
+		offsetpointer = (uint32_t*)&offsets;
+		break;
+#endif
+	case DRM_FORMAT_NV12:
+		tile_width = 512;
+		tile_height = 16;
+		stride = ALIGN(w, tile_width);
+		data->size = offsets[1] = stride*ALIGN(h, tile_height);
+		gemsize = data->size*2;
+		offsetpointer = (uint32_t*)&offsets;
+		break;
+	default:
+		tile_width = 512;
+		tile_height = 16;
+
+		/*
+		 * w*4 so there's enough space
+		 */
+		stride = ALIGN(w*4, tile_width);
+		data->size = stride*ALIGN(h, tile_height);
+		offsetpointer = NULL;
+		gemsize = data->size;
+		break;
+	}
+
+	data->gem_handle = gem_create(data->gfx_fd, gemsize);
+	ret = __gem_set_tiling(data->gfx_fd, data->gem_handle,
+			       I915_TILING_NONE, stride);
+
+	igt_assert_eq(ret, 0);
+
+	ret = __kms_addfb(data->gfx_fd, data->gem_handle, w, h,
+			  stride, format, LOCAL_DRM_FORMAT_MOD_NONE,
+			  offsetpointer, LOCAL_DRM_MODE_FB_MODIFIERS,
+			  &data->fb.fb_id);
+
+	if(ret < 0) {
+		igt_info("Creating fb for format %s failed, return code %d\n",
+			 (char*)&data->format_name, ret);
+
+		return false;
+	}
+
+	data->fb.width = w;
+	data->fb.height = h;
+	data->fb.gem_handle = data->gem_handle;
+	return true;
+}
+
+
+static void remove_fb(data_t* data, igt_output_t* output, igt_plane_t* plane)
+{
+	if (data->separateprimaryplane) {
+		igt_plane_t* primary = igt_output_get_plane_type(output,
+								 DRM_PLANE_TYPE_PRIMARY);
+		igt_plane_set_fb(primary, NULL);
+		igt_remove_fb(data->gfx_fd, &data->primary_fb);
+		data->separateprimaryplane = false;
+	}
+
+	igt_remove_fb(data->gfx_fd, &data->fb);
+	free(data->buf);
+	data->buf = NULL;
+}
+
+
+static bool prepare_crtc(data_t *data, igt_output_t *output,
+			 igt_plane_t *plane, uint32_t format)
+{
+	drmModeModeInfo *mode;
+	igt_plane_t *primary;
+
+	if (plane->type != DRM_PLANE_TYPE_PRIMARY) {
+		mode = igt_output_get_mode(output);
+		igt_create_color_fb(data->gfx_fd,
+				    mode->hdisplay, mode->vdisplay,
+				    DRM_FORMAT_XRGB8888,
+				    LOCAL_DRM_FORMAT_MOD_NONE,
+				    0, 0, 0,
+				    &data->primary_fb);
+
+		primary = igt_output_get_plane_type(output,
+						    DRM_PLANE_TYPE_PRIMARY);
+
+		igt_plane_set_fb(primary, &data->primary_fb);
+		igt_display_commit2(&data->display, data->commit);
+		data->separateprimaryplane = true;
+	}
+
+	if (!setup_fb(data, output, plane, format))
+		return false;
+
+	free((void*)data->buf);
+	data->buf = (unsigned char*)calloc(data->size*2, 1);
+	return true;
+}
+
+
+static int
+test_one_mode(data_t* data, igt_output_t *output, igt_plane_t* plane,
+	      int mode)
+{
+	igt_crc_t current_crc;
+	signed rVal = 0;
+	bool do_crc;
+	char* crccompare[2];
+
+	if (prepare_crtc(data, output, plane, mode)){
+		/*
+		 * we have fb from prepare_crtc(..) so now fill it in
+		 * correctly in fill_in_fb(..)
+		 */
+		do_crc = fill_in_fb(data, output, plane, mode);
+
+		igt_plane_set_fb(plane, &data->fb);
+		igt_fb_set_size(&data->fb, plane, data->fb.width, data->fb.height);
+		igt_plane_set_size(plane, data->fb.width, data->fb.height);
+		igt_fb_set_position(&data->fb, plane, 0, 0);
+		igt_display_commit2(&data->display, data->commit);
+
+		if (do_crc) {
+			igt_pipe_crc_drain(data->pipe_crc);
+			igt_pipe_crc_get_single(data->pipe_crc, &current_crc);
+
+			if (plane->type != DRM_PLANE_TYPE_CURSOR) {
+				if (!igt_check_crc_equal(&current_crc,
+					&data->fullscreen_crc)) {
+					crccompare[0] = igt_crc_to_string(&current_crc);
+					crccompare[1] = igt_crc_to_string(&data->fullscreen_crc);
+					igt_warn("crc mismatch. target %.8s, result %.8s.\n", crccompare[0], crccompare[1]);
+					free(crccompare[0]);
+					free(crccompare[1]);
+					rVal++;
+				}
+			} else {
+				if (!igt_check_crc_equal(&current_crc,
+					&data->cursor_crc)) {
+					crccompare[0] = igt_crc_to_string(&current_crc);
+					crccompare[1] = igt_crc_to_string(&data->cursor_crc);
+					igt_warn("crc mismatch. target %.8s, result %.8s.\n", crccompare[0], crccompare[1]);
+					free(crccompare[0]);
+					free(crccompare[1]);
+					rVal++;
+				}
+			}
+		}
+		remove_fb(data, output, plane);
+		return rVal;
+	}
+	return 1;
+}
+
+
+static void
+test_available_modes(data_t* data)
+{
+	igt_output_t *output;
+	igt_plane_t *plane;
+	int* u32ptr_formats;
+	int modeindex;
+	enum pipe pipe;
+	struct drm_mode_get_plane one_plane = {};
+	int invalids = 0;
+
+	char planetype[3][8] = {"OVERLAY\0", "PRIMARY\0", "CURSOR\0" };
+
+	for_each_pipe_with_valid_output(&data->display, pipe, output) {
+		igt_output_set_pipe(output, pipe);
+		igt_display_commit2(&data->display, data->commit);
+
+		data->pipe_crc = igt_pipe_crc_new(data->gfx_fd, pipe,
+						  INTEL_PIPE_CRC_SOURCE_AUTO);
+
+		igt_pipe_crc_start(data->pipe_crc);
+
+		/*
+		 * regenerate comparison crcs for each pipe just in case.
+		 */
+		generate_comparison_crc_list(data, output);
+
+		for_each_plane_on_pipe(&data->display, pipe, plane) {
+			memset((void*)&one_plane, 0,
+			       sizeof(struct drm_mode_get_plane));
+			one_plane.plane_id = plane->drm_plane->plane_id;
+			/*
+			 * first call to know how much space needed,
+			 * second call to get list of supported modes.
+			 */
+			igt_ioctl(data->gfx_fd, DRM_IOCTL_MODE_GETPLANE,
+				  &one_plane);
+			igt_assert(one_plane.count_format_types > 0);
+
+			u32ptr_formats = (int*)calloc(one_plane.count_format_types,
+						      sizeof(int));
+
+			one_plane.format_type_ptr = (__u64)u32ptr_formats;
+			igt_ioctl(data->gfx_fd, DRM_IOCTL_MODE_GETPLANE,
+				  &one_plane);
+
+			for (modeindex = 0;
+			     modeindex < one_plane.count_format_types;
+			     modeindex++) {
+				data->format_name[0] = u32ptr_formats[modeindex]&0xff;
+				data->format_name[1] = (u32ptr_formats[modeindex]>>8)&0xff;
+				data->format_name[2] = (u32ptr_formats[modeindex]>>16)&0xff;
+				data->format_name[3] = (u32ptr_formats[modeindex]>>24)&0xff;
+
+				igt_info("Testing connector %s using pipe %s" \
+					 " plane index %d type %s mode %s\n",
+					 igt_output_name(output),
+					 kmstest_pipe_name(pipe),
+					 plane->index,
+					 planetype[plane->type],
+					 (char*)&data->format_name);
+
+				invalids += test_one_mode(data, output,
+							  plane,
+							  u32ptr_formats[modeindex]);
+			}
+			free((void*)one_plane.format_type_ptr);
+		}
+
+		igt_pipe_crc_free(data->pipe_crc);
+		igt_display_commit2(&data->display, data->commit);
+	}
+	igt_assert(invalids == 0);
+}
+
+
+igt_main
+{
+	data_t data = {};
+
+	igt_skip_on_simulation();
+
+	igt_fixture {
+		data.gfx_fd = drm_open_driver_master(DRIVER_INTEL);
+		kmstest_set_vt_graphics_mode();
+		igt_display_init(&data.display, data.gfx_fd);
+		igt_require_pipe_crc(data.gfx_fd);
+	}
+
+	data.commit = data.display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY;
+
+	igt_subtest("available_mode_test_crc") {
+		test_available_modes(&data);
+	}
+
+	igt_fixture {
+		kmstest_restore_vt_mode();
+		igt_display_fini(&data.display);
+	}
+}
diff --git a/tests/meson.build b/tests/meson.build
index 22e4ac9..6a5bd96 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -150,6 +150,7 @@ test_progs = [
 	'kms_atomic',
 	'kms_atomic_interruptible',
 	'kms_atomic_transition',
+	'kms_available_modes_crc',
 	'kms_busy',
 	'kms_ccs',
 	'kms_chv_cursor_fail',
-- 
2.7.4

_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* [igt-dev] ✗ Fi.CI.BAT: warning for tests/kms_available_modes_crc: Test all modes on all planes (rev3)
  2018-03-20 16:13 [igt-dev] [PATCH i-g-t] tests/kms_available_modes_crc: Test all modes on all planes Juha-Pekka Heikkila
@ 2018-03-20 18:06 ` Patchwork
  2018-04-03 10:12 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Patchwork @ 2018-03-20 18:06 UTC (permalink / raw)
  To: Juha-Pekka Heikkila; +Cc: igt-dev

== Series Details ==

Series: tests/kms_available_modes_crc: Test all modes on all planes (rev3)
URL   : https://patchwork.freedesktop.org/series/38007/
State : warning

== Summary ==

IGT patchset tested on top of latest successful build
178e7f3da66cd02660a86257df75708a0efa3bbc tests/kms_frontbuffer_tracking: Update check for PSR status

with latest DRM-Tip kernel build CI_DRM_3958
9d737cebc219 drm-tip: 2018y-03m-20d-14h-56m-05s UTC integration manifest

Testlist changes:
+igt@kms_available_modes_crc@available_mode_test_crc

---- Possible new issues:

Test drv_module_reload:
        Subgroup basic-reload:
                pass       -> DMESG-WARN (fi-kbl-7500u)
Test gem_exec_suspend:
        Subgroup basic-s3:
                pass       -> DMESG-WARN (fi-kbl-7500u)
Test kms_pipe_crc_basic:
        Subgroup suspend-read-crc-pipe-a:
                incomplete -> PASS       (fi-cfl-s2)
                pass       -> DMESG-WARN (fi-kbl-7500u)
        Subgroup suspend-read-crc-pipe-b:
                pass       -> DMESG-WARN (fi-kbl-7500u)
        Subgroup suspend-read-crc-pipe-c:
                pass       -> DMESG-WARN (fi-kbl-7500u)
Test pm_rpm:
        Subgroup basic-pci-d3-state:
                pass       -> DMESG-WARN (fi-kbl-7500u)

---- Known issues:

Test gem_exec_suspend:
        Subgroup basic-s4-devices:
                pass       -> DMESG-WARN (fi-kbl-7500u) fdo#105128
Test gem_mmap_gtt:
        Subgroup basic-small-bo-tiledx:
                pass       -> FAIL       (fi-gdg-551) fdo#102575
Test kms_pipe_crc_basic:
        Subgroup suspend-read-crc-pipe-b:
                pass       -> INCOMPLETE (fi-snb-2520m) fdo#103713

fdo#105128 https://bugs.freedesktop.org/show_bug.cgi?id=105128
fdo#102575 https://bugs.freedesktop.org/show_bug.cgi?id=102575
fdo#103713 https://bugs.freedesktop.org/show_bug.cgi?id=103713

fi-bdw-5557u     total:285  pass:264  dwarn:0   dfail:0   fail:0   skip:21  time:430s
fi-bdw-gvtdvm    total:285  pass:261  dwarn:0   dfail:0   fail:0   skip:24  time:438s
fi-blb-e6850     total:285  pass:220  dwarn:1   dfail:0   fail:0   skip:64  time:382s
fi-bsw-n3050     total:285  pass:239  dwarn:0   dfail:0   fail:0   skip:46  time:546s
fi-bwr-2160      total:285  pass:180  dwarn:0   dfail:0   fail:0   skip:105 time:300s
fi-bxt-dsi       total:285  pass:255  dwarn:0   dfail:0   fail:0   skip:30  time:515s
fi-bxt-j4205     total:285  pass:256  dwarn:0   dfail:0   fail:0   skip:29  time:510s
fi-byt-j1900     total:285  pass:250  dwarn:0   dfail:0   fail:0   skip:35  time:515s
fi-byt-n2820     total:285  pass:246  dwarn:0   dfail:0   fail:0   skip:39  time:505s
fi-cfl-8700k     total:285  pass:257  dwarn:0   dfail:0   fail:0   skip:28  time:412s
fi-cfl-s2        total:285  pass:259  dwarn:0   dfail:0   fail:0   skip:26  time:583s
fi-cfl-u         total:285  pass:259  dwarn:0   dfail:0   fail:0   skip:26  time:511s
fi-cnl-drrs      total:285  pass:254  dwarn:3   dfail:0   fail:0   skip:28  time:533s
fi-elk-e7500     total:285  pass:225  dwarn:1   dfail:0   fail:0   skip:59  time:427s
fi-gdg-551       total:285  pass:176  dwarn:0   dfail:0   fail:1   skip:108 time:318s
fi-glk-1         total:285  pass:257  dwarn:0   dfail:0   fail:0   skip:28  time:540s
fi-hsw-4770      total:285  pass:258  dwarn:0   dfail:0   fail:0   skip:27  time:405s
fi-ilk-650       total:285  pass:225  dwarn:0   dfail:0   fail:0   skip:60  time:421s
fi-ivb-3520m     total:285  pass:256  dwarn:0   dfail:0   fail:0   skip:29  time:474s
fi-ivb-3770      total:285  pass:252  dwarn:0   dfail:0   fail:0   skip:33  time:430s
fi-kbl-7500u     total:285  pass:253  dwarn:8   dfail:0   fail:0   skip:24  time:478s
fi-kbl-7567u     total:285  pass:265  dwarn:0   dfail:0   fail:0   skip:20  time:473s
fi-kbl-r         total:285  pass:258  dwarn:0   dfail:0   fail:0   skip:27  time:514s
fi-pnv-d510      total:285  pass:219  dwarn:1   dfail:0   fail:0   skip:65  time:655s
fi-skl-6260u     total:285  pass:265  dwarn:0   dfail:0   fail:0   skip:20  time:438s
fi-skl-6600u     total:285  pass:258  dwarn:0   dfail:0   fail:0   skip:27  time:541s
fi-skl-6700hq    total:285  pass:259  dwarn:0   dfail:0   fail:0   skip:26  time:541s
fi-skl-6700k2    total:285  pass:261  dwarn:0   dfail:0   fail:0   skip:24  time:507s
fi-skl-6770hq    total:285  pass:265  dwarn:0   dfail:0   fail:0   skip:20  time:495s
fi-skl-guc       total:285  pass:257  dwarn:0   dfail:0   fail:0   skip:28  time:427s
fi-skl-gvtdvm    total:285  pass:262  dwarn:0   dfail:0   fail:0   skip:23  time:449s
fi-snb-2520m     total:242  pass:208  dwarn:0   dfail:0   fail:0   skip:33 
fi-snb-2600      total:285  pass:245  dwarn:0   dfail:0   fail:0   skip:40  time:400s

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_1171/issues.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* [igt-dev] ✓ Fi.CI.BAT: success for tests/kms_available_modes_crc: Test all modes on all planes (rev3)
  2018-03-20 16:13 [igt-dev] [PATCH i-g-t] tests/kms_available_modes_crc: Test all modes on all planes Juha-Pekka Heikkila
  2018-03-20 18:06 ` [igt-dev] ✗ Fi.CI.BAT: warning for tests/kms_available_modes_crc: Test all modes on all planes (rev3) Patchwork
@ 2018-04-03 10:12 ` Patchwork
  2018-04-03 11:01 ` [igt-dev] ✗ Fi.CI.IGT: warning " Patchwork
  2018-05-15  9:15 ` [igt-dev] [PATCH i-g-t] tests/kms_available_modes_crc: Test all modes on all planes Mika Kahola
  3 siblings, 0 replies; 5+ messages in thread
From: Patchwork @ 2018-04-03 10:12 UTC (permalink / raw)
  To: Juha-Pekka Heikkila; +Cc: igt-dev

== Series Details ==

Series: tests/kms_available_modes_crc: Test all modes on all planes (rev3)
URL   : https://patchwork.freedesktop.org/series/38007/
State : success

== Summary ==

IGT patchset tested on top of latest successful build
da00bf83aba3b516922efa1f338381189461aa4a tests/kms_plane_scaling: fb height to be min 16 for NV12

with latest DRM-Tip kernel build CI_DRM_4013
c46052cde6a5 drm-tip: 2018y-03m-30d-18h-56m-26s UTC integration manifest

Testlist changes:
+igt@kms_available_modes_crc@available_mode_test_crc

fi-bdw-5557u     total:285  pass:264  dwarn:0   dfail:0   fail:0   skip:21  time:431s
fi-bdw-gvtdvm    total:285  pass:261  dwarn:0   dfail:0   fail:0   skip:24  time:442s
fi-blb-e6850     total:285  pass:220  dwarn:1   dfail:0   fail:0   skip:64  time:380s
fi-bsw-n3050     total:285  pass:239  dwarn:0   dfail:0   fail:0   skip:46  time:538s
fi-bwr-2160      total:285  pass:180  dwarn:0   dfail:0   fail:0   skip:105 time:300s
fi-bxt-dsi       total:285  pass:255  dwarn:0   dfail:0   fail:0   skip:30  time:515s
fi-bxt-j4205     total:285  pass:256  dwarn:0   dfail:0   fail:0   skip:29  time:511s
fi-byt-j1900     total:285  pass:250  dwarn:0   dfail:0   fail:0   skip:35  time:522s
fi-byt-n2820     total:285  pass:246  dwarn:0   dfail:0   fail:0   skip:39  time:510s
fi-cfl-8700k     total:285  pass:257  dwarn:0   dfail:0   fail:0   skip:28  time:410s
fi-cfl-s3        total:285  pass:259  dwarn:0   dfail:0   fail:0   skip:26  time:562s
fi-cfl-u         total:285  pass:259  dwarn:0   dfail:0   fail:0   skip:26  time:516s
fi-cnl-y3        total:285  pass:259  dwarn:0   dfail:0   fail:0   skip:26  time:577s
fi-elk-e7500     total:285  pass:225  dwarn:1   dfail:0   fail:0   skip:59  time:431s
fi-gdg-551       total:285  pass:176  dwarn:0   dfail:0   fail:1   skip:108 time:322s
fi-glk-1         total:285  pass:257  dwarn:0   dfail:0   fail:0   skip:28  time:538s
fi-hsw-4770      total:285  pass:258  dwarn:0   dfail:0   fail:0   skip:27  time:405s
fi-ilk-650       total:285  pass:225  dwarn:0   dfail:0   fail:0   skip:60  time:423s
fi-ivb-3520m     total:285  pass:256  dwarn:0   dfail:0   fail:0   skip:29  time:459s
fi-ivb-3770      total:285  pass:252  dwarn:0   dfail:0   fail:0   skip:33  time:432s
fi-kbl-7500u     total:285  pass:260  dwarn:1   dfail:0   fail:0   skip:24  time:476s
fi-kbl-7567u     total:285  pass:265  dwarn:0   dfail:0   fail:0   skip:20  time:469s
fi-kbl-r         total:285  pass:258  dwarn:0   dfail:0   fail:0   skip:27  time:511s
fi-pnv-d510      total:285  pass:219  dwarn:1   dfail:0   fail:0   skip:65  time:661s
fi-skl-6260u     total:285  pass:265  dwarn:0   dfail:0   fail:0   skip:20  time:440s
fi-skl-6600u     total:285  pass:258  dwarn:0   dfail:0   fail:0   skip:27  time:542s
fi-skl-6700k2    total:285  pass:261  dwarn:0   dfail:0   fail:0   skip:24  time:507s
fi-skl-6770hq    total:285  pass:265  dwarn:0   dfail:0   fail:0   skip:20  time:497s
fi-skl-guc       total:285  pass:257  dwarn:0   dfail:0   fail:0   skip:28  time:429s
fi-skl-gvtdvm    total:285  pass:262  dwarn:0   dfail:0   fail:0   skip:23  time:445s
fi-snb-2520m     total:285  pass:245  dwarn:0   dfail:0   fail:0   skip:40  time:579s
fi-snb-2600      total:285  pass:245  dwarn:0   dfail:0   fail:0   skip:40  time:400s
Blacklisted hosts:
fi-cnl-psr       total:285  pass:256  dwarn:3   dfail:0   fail:0   skip:26  time:525s
fi-glk-j4005     total:285  pass:256  dwarn:0   dfail:0   fail:0   skip:29  time:485s

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_1215/issues.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* [igt-dev] ✗ Fi.CI.IGT: warning for tests/kms_available_modes_crc: Test all modes on all planes (rev3)
  2018-03-20 16:13 [igt-dev] [PATCH i-g-t] tests/kms_available_modes_crc: Test all modes on all planes Juha-Pekka Heikkila
  2018-03-20 18:06 ` [igt-dev] ✗ Fi.CI.BAT: warning for tests/kms_available_modes_crc: Test all modes on all planes (rev3) Patchwork
  2018-04-03 10:12 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
@ 2018-04-03 11:01 ` Patchwork
  2018-05-15  9:15 ` [igt-dev] [PATCH i-g-t] tests/kms_available_modes_crc: Test all modes on all planes Mika Kahola
  3 siblings, 0 replies; 5+ messages in thread
From: Patchwork @ 2018-04-03 11:01 UTC (permalink / raw)
  To: Juha-Pekka Heikkila; +Cc: igt-dev

== Series Details ==

Series: tests/kms_available_modes_crc: Test all modes on all planes (rev3)
URL   : https://patchwork.freedesktop.org/series/38007/
State : warning

== Summary ==

---- Possible new issues:

Test kms_draw_crc:
        Subgroup fill-fb:
                pass       -> SKIP       (shard-snb)

---- Known issues:

Test gem_softpin:
        Subgroup noreloc-s3:
                incomplete -> PASS       (shard-hsw) fdo#103540
Test kms_cursor_crc:
        Subgroup cursor-64x64-suspend:
                dmesg-warn -> PASS       (shard-snb) fdo#102365
Test kms_cursor_legacy:
        Subgroup flip-vs-cursor-legacy:
                pass       -> FAIL       (shard-hsw) fdo#102670
Test kms_frontbuffer_tracking:
        Subgroup fbc-1p-primscrn-shrfb-msflip-blt:
                dmesg-fail -> PASS       (shard-apl) fdo#104727
Test kms_rotation_crc:
        Subgroup sprite-rotation-180:
                fail       -> PASS       (shard-snb) fdo#103925

fdo#103540 https://bugs.freedesktop.org/show_bug.cgi?id=103540
fdo#102365 https://bugs.freedesktop.org/show_bug.cgi?id=102365
fdo#102670 https://bugs.freedesktop.org/show_bug.cgi?id=102670
fdo#104727 https://bugs.freedesktop.org/show_bug.cgi?id=104727
fdo#103925 https://bugs.freedesktop.org/show_bug.cgi?id=103925

shard-apl        total:3497 pass:1832 dwarn:1   dfail:0   fail:8   skip:1655 time:12816s
shard-hsw        total:3497 pass:1782 dwarn:1   dfail:0   fail:3   skip:1710 time:11560s
shard-snb        total:3497 pass:1375 dwarn:1   dfail:0   fail:2   skip:2119 time:7081s
Blacklisted hosts:
shard-kbl        total:3497 pass:1958 dwarn:1   dfail:1   fail:8   skip:1529 time:9256s

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_1215/shards.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* Re: [igt-dev] [PATCH i-g-t] tests/kms_available_modes_crc: Test all modes on all planes
  2018-03-20 16:13 [igt-dev] [PATCH i-g-t] tests/kms_available_modes_crc: Test all modes on all planes Juha-Pekka Heikkila
                   ` (2 preceding siblings ...)
  2018-04-03 11:01 ` [igt-dev] ✗ Fi.CI.IGT: warning " Patchwork
@ 2018-05-15  9:15 ` Mika Kahola
  3 siblings, 0 replies; 5+ messages in thread
From: Mika Kahola @ 2018-05-15  9:15 UTC (permalink / raw)
  To: Juha-Pekka Heikkila, igt-dev

On Tue, 2018-03-20 at 18:13 +0200, Juha-Pekka Heikkila wrote:
> Ask from kernel about supported modes for each plane and try setting
> them on display and verify functionality with crc.
> 
> DRM_FORMAT_ARGB8888 and DRM_FORMAT_ABGR8888 skip crc testing on
> primary and overlay planes because they produce incorrect crcs from
> hardware. DRM_FORMAT_ARGB8888 is tested on cursor plane.
> 
> v2: Added support for planar formats.
> 
> v3: Address review comments from Mika Kahola.
> Keep crc running for all tests while on same pipe, set tile height
> to 16 and read only one crc per test.
> 
> Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
> ---
>  tests/Makefile.sources          |   1 +
>  tests/kms_available_modes_crc.c | 541
> ++++++++++++++++++++++++++++++++++++++++
>  tests/meson.build               |   1 +
>  3 files changed, 543 insertions(+)
>  create mode 100644 tests/kms_available_modes_crc.c
> 
> diff --git a/tests/Makefile.sources b/tests/Makefile.sources
> index f1d1cba..0622048 100644
> --- a/tests/Makefile.sources
> +++ b/tests/Makefile.sources
> @@ -173,6 +173,7 @@ TESTS_progs = \
>  	kms_atomic \
>  	kms_atomic_interruptible \
>  	kms_atomic_transition \
> +	kms_available_modes_crc \
>  	kms_busy \
>  	kms_ccs \
>  	kms_chv_cursor_fail \
> diff --git a/tests/kms_available_modes_crc.c
> b/tests/kms_available_modes_crc.c
> new file mode 100644
> index 0000000..18c3685
> --- /dev/null
> +++ b/tests/kms_available_modes_crc.c
> @@ -0,0 +1,541 @@
> +/*
> + * Copyright © 2018 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.
> + *
> + */
> +
> +#include "drm_mode.h"
> +#include "drm_fourcc.h"
> +#include "igt.h"
> +#include <sys/ioctl.h>
> +
> +IGT_TEST_DESCRIPTION("CRC test all different plane modes which
> kernel advertises.");
> +
> +typedef struct {
> +	int gfx_fd;
> +	igt_display_t display;
> +	enum igt_commit_style commit;
> +
> +	struct igt_fb fb;
> +	struct igt_fb primary_fb;
> +
> +	char format_name[5];
> +	bool separateprimaryplane;
> +
> +	uint32_t gem_handle;
> +	uint32_t gem_handle_yuv;
> +	unsigned int size;
> +	unsigned char* buf;
> +
> +	/*
> +	 * comparison crcs
> +	 */
> +	igt_pipe_crc_t *pipe_crc;
> +
> +	igt_crc_t cursor_crc;
> +	igt_crc_t fullscreen_crc;
> +} data_t;
> +
> +
> +static int do_write(int fd, int handle, void *buf, int size)
> +{
> +	struct drm_i915_gem_pwrite write;
> +	memset(&write, 0x00, sizeof(write));
> +	write.handle = handle;
> +	write.data_ptr = (uintptr_t)buf;
> +	write.size = size;
> +	write.offset = 0;
> +	return ioctl(fd, DRM_IOCTL_I915_GEM_PWRITE, &write);
> +}
> +
> +
> +static void generate_comparison_crc_list(data_t *data, igt_output_t
> *output)
> +{
> +	drmModeModeInfo *mode;
> +	uint64_t w, h;
> +	int fbid;
> +	cairo_t *cr;
> +	igt_plane_t *primary;
> +
> +	mode = igt_output_get_mode(output);
> +	fbid = igt_create_color_fb(data->gfx_fd,
> +				   mode->hdisplay,
> +				   mode->vdisplay,
> +				   intel_gen(intel_get_drm_devid(dat
> a->gfx_fd)) < 9 ? DRM_FORMAT_XRGB8888 : DRM_FORMAT_ARGB8888,
> +				   LOCAL_DRM_FORMAT_MOD_NONE,
> +				   0, 0, 0,
> +				   &data->primary_fb);
> +
> +	igt_assert(fbid);
> +
> +	drmGetCap(data->gfx_fd, DRM_CAP_CURSOR_WIDTH, &w);
> +	drmGetCap(data->gfx_fd, DRM_CAP_CURSOR_HEIGHT, &h);
> +
> +	cr = igt_get_cairo_ctx(data->gfx_fd, &data->primary_fb);
> +	igt_paint_color(cr, 0, 0, mode->hdisplay, mode->vdisplay,
> +			    0.0, 0.0, 0.0);
> +	igt_paint_color(cr, 0, 0, w, h, 1.0, 1.0, 1.0);
> +	igt_assert(cairo_status(cr) == 0);
> +
> +	primary = igt_output_get_plane_type(output,
> DRM_PLANE_TYPE_PRIMARY);
> +	igt_plane_set_fb(primary, &data->primary_fb);
> +	igt_display_commit2(&data->display, data->commit);
> +
> +	igt_pipe_crc_drain(data->pipe_crc);
> +	igt_pipe_crc_get_single(data->pipe_crc, &data->cursor_crc);
> +	igt_plane_set_fb(primary, NULL);
> +	igt_display_commit2(&data->display, data->commit);
> +
> +	intel_gen(intel_get_drm_devid(data->gfx_fd)) < 9 ?
> +		  igt_paint_color(cr, 0, 0, mode->hdisplay, mode-
> >vdisplay, 1.0, 1.0, 1.0) :
> +		  igt_paint_color_alpha(cr, 0, 0, mode->hdisplay,
> mode->vdisplay, 1.0, 1.0, 1.0, 1.0);
> +
> +	igt_plane_set_fb(primary, &data->primary_fb);
> +	igt_display_commit2(&data->display, data->commit);
> +
> +	igt_pipe_crc_drain(data->pipe_crc);
> +	igt_pipe_crc_get_single(data->pipe_crc, &data-
> >fullscreen_crc);
> +
> +	cairo_destroy(cr);
> +	igt_remove_fb(data->gfx_fd, &data->primary_fb);
> +}
> +
> +/*
> + * fill_in_fb tell in return value if selected mode should be
> + * proceed to crc check
> + */
> +static bool fill_in_fb(data_t *data, igt_output_t *output,
> igt_plane_t *plane,
> +		       uint32_t format)
> +{
> +	signed i, c, writesize;
> +	unsigned short* ptemp_16_buf;
> +	unsigned int* ptemp_32_buf;
> +
> +	const struct {
> +		uint32_t	fourcc;
> +		char		zeropadding;
> +		enum		{ BYTES_PP_1=1,
> +				  BYTES_PP_2=2,
> +				  BYTES_PP_4=4,
> +				  NV12,
> +#if defined(DRM_FORMAT_P010) || defined(DRM_FORMAT_P012) ||
> defined(DRM_FORMAT_P016)
> +				  P010,
> +#endif
> +				  SKIP } bpp;
> +		uint32_t	value;
> +	} fillers[] = {
> +		{ DRM_FORMAT_C8, 0, BYTES_PP_1, 0xff},
> +		{ DRM_FORMAT_RGB565, 0, BYTES_PP_2, 0xffff},
> +		{ DRM_FORMAT_XRGB8888, 0, BYTES_PP_4, 0xffffffff},
> +		{ DRM_FORMAT_XBGR8888, 0, BYTES_PP_4, 0xffffffff},
> +
> +		/*
> +		 * following two are skipped because blending seems
> to work
> +		 * incorrectly with exception of AR24 on cursor
> plane.
> +		 * Test still creates the planes, just filling plane
> +		 * and getting crc is skipped.
> +		 */
> +		{ DRM_FORMAT_ARGB8888, 0, SKIP, 0xffffffff},
> +		{ DRM_FORMAT_ABGR8888, 0, SKIP, 0x00ffffff},
> +
> +		{ DRM_FORMAT_XRGB2101010, 0, BYTES_PP_4,
> 0xffffffff},
> +		{ DRM_FORMAT_XBGR2101010, 0, BYTES_PP_4,
> 0xffffffff},
> +
> +		{ DRM_FORMAT_YUYV, 0, BYTES_PP_4, 0x80eb80eb},
> +		{ DRM_FORMAT_YVYU, 0, BYTES_PP_4, 0x80eb80eb},
> +		{ DRM_FORMAT_VYUY, 0, BYTES_PP_4, 0xeb80eb80},
> +		{ DRM_FORMAT_UYVY, 0, BYTES_PP_4, 0xeb80eb80},
> +
> +		/*
> +		 * (semi-)planar formats
> +		 */
> +		{ DRM_FORMAT_NV12, 0, NV12, 0x80eb},
> +#ifdef DRM_FORMAT_P010
> +		{ DRM_FORMAT_P010, 0, P010, 0x8000eb00},
> +#endif
> +#ifdef DRM_FORMAT_P012
> +		{ DRM_FORMAT_P012, 0, P010, 0x8000eb00},
> +#endif
> +#ifdef DRM_FORMAT_P016
> +		{ DRM_FORMAT_P016, 0, P010, 0x8000eb00},
> +#endif
> +		{ 0, 0, 0, 0 }
> +	};
> +
> +	for( i = 0; fillers[i].fourcc != 0; i++ ) {
> +		if( fillers[i].fourcc == format )
> +			break;
> +	}
> +
> +	switch (fillers[i].bpp) {
> +	case BYTES_PP_4:
> +		ptemp_32_buf = (unsigned int*)data->buf;
> +		for (c = 0; c < data->size/4; c++)
> +			ptemp_32_buf[c] = fillers[i].value;
> +		writesize = data->size;
> +		break;
> +	case BYTES_PP_2:
> +		ptemp_16_buf = (unsigned short*)data->buf;
> +		for (c = 0; c < data->size/2; c++)
> +			ptemp_16_buf[c] = (unsigned
> short)fillers[i].value;
> +		writesize = data->size;
> +		break;
> +	case BYTES_PP_1:
> +		memset((void*)data->buf, fillers[i].value, data-
> >size);
> +		writesize = data->size;
> +		break;
> +	case NV12:
> +		memset((void*)data->buf, fillers[i].value&0xff,
> +		       data->size);
> +
> +		memset((void*)(data->buf+data->size),
> +		       (fillers[i].value>>8)&0xff, data->size/2);
> +
> +		writesize = data->size+data->size/2;
> +		break;
> +#if defined(DRM_FORMAT_P010) || defined(DRM_FORMAT_P012) ||
> defined(DRM_FORMAT_P016)
> +	case P010:
> +		ptemp_16_buf = (unsigned short*)data->buf;
> +		for (c = 0; c < data->size/2; c++)
> +			ptemp_16_buf[c] = (unsigned
> short)fillers[i].value&0xffff;
> +
> +		ptemp_16_buf = (unsigned short*)(data->buf+data-
> >size);
> +		for (c = 0; c < data->size/2; c++)
> +			ptemp_16_buf[c] = (unsigned
> short)(fillers[i].value>>16)&0xffff;
> +
> +		writesize = data->size+data->size/2;
> +		break;
> +#endif
> +	case SKIP:
> +		if (fillers[i].fourcc == DRM_FORMAT_ARGB8888 &&
> +		    plane->type == DRM_PLANE_TYPE_CURSOR) {
> +		/*
> +		 * special for cursor plane where blending works
> correctly.
> +		 */
> +			ptemp_32_buf = (unsigned int*)data->buf;
> +			for (c = 0; c < data->size/4; c++)
> +				ptemp_32_buf[c] = fillers[i].value;
> +			writesize = data->size;
> +			break;
> +		}
> +		igt_info("Format %s CRC comparison skipped by
> design.\n",
> +			 (char*)&fillers[i].fourcc);
> +
> +		return false;
> +	default:
> +		igt_info("Unsupported mode for test %s\n",
> +			 (char*)&fillers[i].fourcc);
> +		return false;
> +	}
> +
> +	do_write(data->gfx_fd, data->gem_handle, (void*)data->buf,
> writesize);
> +	return true;
> +}
> +
> +
> +static bool setup_fb(data_t *data, igt_output_t *output, igt_plane_t
> *plane,
> +		     uint32_t format)
> +{
> +	drmModeModeInfo *mode;
> +	uint64_t w, h;
> +	signed ret, gemsize = 0;
> +	unsigned tile_width, tile_height, stride;
> +	uint32_t offsets[4] = {};
> +	uint32_t* offsetpointer = NULL;
> +
> +	mode = igt_output_get_mode(output);
> +	if (plane->type != DRM_PLANE_TYPE_CURSOR) {
> +		w = mode->hdisplay ;
> +		h = mode->vdisplay;
> +	} else {
> +		drmGetCap(data->gfx_fd, DRM_CAP_CURSOR_WIDTH, &w);
> +		drmGetCap(data->gfx_fd, DRM_CAP_CURSOR_HEIGHT, &h);
> +	}
> +
> +	switch(format) {
> +#ifdef DRM_FORMAT_P010
> +	case DRM_FORMAT_P010:
> +#endif
> +#ifdef DRM_FORMAT_P012
> +	case DRM_FORMAT_P012:
> +#endif
> +#ifdef DRM_FORMAT_P016
> +	case DRM_FORMAT_P016:
> +#endif
> +#if defined(DRM_FORMAT_P010) || defined(DRM_FORMAT_P012) ||
> defined(DRM_FORMAT_P016)
> +		tile_width = 512;
> +		tile_height = 16;
> +		stride = ALIGN(w*2, tile_width);
> +		data->size = offsets[1] = stride*ALIGN(h,
> tile_height);
> +		gemsize = data->size*2;
> +		offsetpointer = (uint32_t*)&offsets;
> +		break;
> +#endif
> +	case DRM_FORMAT_NV12:
> +		tile_width = 512;
> +		tile_height = 16;
> +		stride = ALIGN(w, tile_width);
> +		data->size = offsets[1] = stride*ALIGN(h,
> tile_height);
> +		gemsize = data->size*2;
> +		offsetpointer = (uint32_t*)&offsets;
> +		break;
> +	default:
> +		tile_width = 512;
> +		tile_height = 16;
> +
> +		/*
> +		 * w*4 so there's enough space
> +		 */
> +		stride = ALIGN(w*4, tile_width);
> +		data->size = stride*ALIGN(h, tile_height);
> +		offsetpointer = NULL;
> +		gemsize = data->size;
> +		break;
> +	}
> +
> +	data->gem_handle = gem_create(data->gfx_fd, gemsize);
> +	ret = __gem_set_tiling(data->gfx_fd, data->gem_handle,
> +			       I915_TILING_NONE, stride);
> +
> +	igt_assert_eq(ret, 0);
> +
> +	ret = __kms_addfb(data->gfx_fd, data->gem_handle, w, h,
> +			  stride, format, LOCAL_DRM_FORMAT_MOD_NONE,
> +			  offsetpointer,
> LOCAL_DRM_MODE_FB_MODIFIERS,
> +			  &data->fb.fb_id);
> +
> +	if(ret < 0) {
> +		igt_info("Creating fb for format %s failed, return
> code %d\n",
> +			 (char*)&data->format_name, ret);
> +
> +		return false;
> +	}
> +
> +	data->fb.width = w;
> +	data->fb.height = h;
> +	data->fb.gem_handle = data->gem_handle;
> +	return true;
> +}
> +
> +
> +static void remove_fb(data_t* data, igt_output_t* output,
> igt_plane_t* plane)
> +{
> +	if (data->separateprimaryplane) {
> +		igt_plane_t* primary =
> igt_output_get_plane_type(output,
> +								 DRM
> _PLANE_TYPE_PRIMARY);
> +		igt_plane_set_fb(primary, NULL);
> +		igt_remove_fb(data->gfx_fd, &data->primary_fb);
> +		data->separateprimaryplane = false;
> +	}
> +
> +	igt_remove_fb(data->gfx_fd, &data->fb);
> +	free(data->buf);
> +	data->buf = NULL;
> +}
> +
> +
> +static bool prepare_crtc(data_t *data, igt_output_t *output,
> +			 igt_plane_t *plane, uint32_t format)
> +{
> +	drmModeModeInfo *mode;
> +	igt_plane_t *primary;
> +
> +	if (plane->type != DRM_PLANE_TYPE_PRIMARY) {
> +		mode = igt_output_get_mode(output);
> +		igt_create_color_fb(data->gfx_fd,
> +				    mode->hdisplay, mode->vdisplay,
> +				    DRM_FORMAT_XRGB8888,
> +				    LOCAL_DRM_FORMAT_MOD_NONE,
> +				    0, 0, 0,
> +				    &data->primary_fb);
> +
> +		primary = igt_output_get_plane_type(output,
> +						    DRM_PLANE_TYPE_P
> RIMARY);
> +
> +		igt_plane_set_fb(primary, &data->primary_fb);
> +		igt_display_commit2(&data->display, data->commit);
> +		data->separateprimaryplane = true;
> +	}
> +
> +	if (!setup_fb(data, output, plane, format))
> +		return false;
> +
> +	free((void*)data->buf);
> +	data->buf = (unsigned char*)calloc(data->size*2, 1);
> +	return true;
> +}
> +
> +
> +static int
> +test_one_mode(data_t* data, igt_output_t *output, igt_plane_t*
> plane,
> +	      int mode)
> +{
> +	igt_crc_t current_crc;
> +	signed rVal = 0;
> +	bool do_crc;
> +	char* crccompare[2];
> +
> +	if (prepare_crtc(data, output, plane, mode)){
> +		/*
> +		 * we have fb from prepare_crtc(..) so now fill it
> in
> +		 * correctly in fill_in_fb(..)
> +		 */
> +		do_crc = fill_in_fb(data, output, plane, mode);
> +
> +		igt_plane_set_fb(plane, &data->fb);
> +		igt_fb_set_size(&data->fb, plane, data->fb.width,
> data->fb.height);
> +		igt_plane_set_size(plane, data->fb.width, data-
> >fb.height);
> +		igt_fb_set_position(&data->fb, plane, 0, 0);
> +		igt_display_commit2(&data->display, data->commit);
> +
> +		if (do_crc) {
> +			igt_pipe_crc_drain(data->pipe_crc);
> +			igt_pipe_crc_get_single(data->pipe_crc,
> &current_crc);
> +
> +			if (plane->type != DRM_PLANE_TYPE_CURSOR) {
> +				if
> (!igt_check_crc_equal(&current_crc,
> +					&data->fullscreen_crc)) {
> +					crccompare[0] =
> igt_crc_to_string(&current_crc);
> +					crccompare[1] =
> igt_crc_to_string(&data->fullscreen_crc);
> +					igt_warn("crc mismatch.
> target %.8s, result %.8s.\n", crccompare[0], crccompare[1]);
> +					free(crccompare[0]);
> +					free(crccompare[1]);
> +					rVal++;
> +				}
> +			} else {
> +				if
> (!igt_check_crc_equal(&current_crc,
> +					&data->cursor_crc)) {
> +					crccompare[0] =
> igt_crc_to_string(&current_crc);
> +					crccompare[1] =
> igt_crc_to_string(&data->cursor_crc);
> +					igt_warn("crc mismatch.
> target %.8s, result %.8s.\n", crccompare[0], crccompare[1]);
> +					free(crccompare[0]);
> +					free(crccompare[1]);
> +					rVal++;
> +				}
> +			}
> +		}
> +		remove_fb(data, output, plane);
> +		return rVal;
> +	}
> +	return 1;
> +}
> +
> +
> +static void
> +test_available_modes(data_t* data)
> +{
> +	igt_output_t *output;
> +	igt_plane_t *plane;
> +	int* u32ptr_formats;
> +	int modeindex;
> +	enum pipe pipe;
> +	struct drm_mode_get_plane one_plane = {};
> +	int invalids = 0;
> +
> +	char planetype[3][8] = {"OVERLAY\0", "PRIMARY\0", "CURSOR\0"
> };
> +
> +	for_each_pipe_with_valid_output(&data->display, pipe,
> output) {
> +		igt_output_set_pipe(output, pipe);
> +		igt_display_commit2(&data->display, data->commit);
> +
> +		data->pipe_crc = igt_pipe_crc_new(data->gfx_fd,
> pipe,
> +						  INTEL_PIPE_CRC_SOU
> RCE_AUTO);
> +
> +		igt_pipe_crc_start(data->pipe_crc);
> +
> +		/*
> +		 * regenerate comparison crcs for each pipe just in
> case.
> +		 */
> +		generate_comparison_crc_list(data, output);
> +
> +		for_each_plane_on_pipe(&data->display, pipe, plane)
> {
> +			memset((void*)&one_plane, 0,
> +			       sizeof(struct drm_mode_get_plane));
> +			one_plane.plane_id = plane->drm_plane-
> >plane_id;
> +			/*
> +			 * first call to know how much space needed,
> +			 * second call to get list of supported
> modes.
> +			 */
> +			igt_ioctl(data->gfx_fd,
> DRM_IOCTL_MODE_GETPLANE,
> +				  &one_plane);
drmModeGetPlane() or igt_ioctl(). Both work and is a matter of style
and preference. I'm not sure which one would be more preferred way.

> +			igt_assert(one_plane.count_format_types >
> 0);
> +
> +			u32ptr_formats =
> (int*)calloc(one_plane.count_format_types,
> +						      sizeof(int));
> +
> +			one_plane.format_type_ptr =
> (__u64)u32ptr_formats;
> +			igt_ioctl(data->gfx_fd,
> DRM_IOCTL_MODE_GETPLANE,
> +				  &one_plane);
> +
> +			for (modeindex = 0;
> +			     modeindex <
> one_plane.count_format_types;
> +			     modeindex++) {
> +				data->format_name[0] =
> u32ptr_formats[modeindex]&0xff;
> +				data->format_name[1] =
> (u32ptr_formats[modeindex]>>8)&0xff;
> +				data->format_name[2] =
> (u32ptr_formats[modeindex]>>16)&0xff;
> +				data->format_name[3] =
> (u32ptr_formats[modeindex]>>24)&0xff;
> +
> +				igt_info("Testing connector %s using
> pipe %s" \
> +					 " plane index %d type %s
> mode %s\n",
> +					 igt_output_name(output),
> +					 kmstest_pipe_name(pipe),
> +					 plane->index,
> +					 planetype[plane->type],
> +					 (char*)&data->format_name);
> +
> +				invalids += test_one_mode(data,
> output,
> +							  plane,
> +							  u32ptr_for
> mats[modeindex]);
> +			}
> +			free((void*)one_plane.format_type_ptr);
> +		}
> +
> +		igt_pipe_crc_free(data->pipe_crc);
We should stop collecting crc's before we free the memory.

> +		igt_display_commit2(&data->display, data->commit);
> +	}
> +	igt_assert(invalids == 0);
> +}
> +
> +
> +igt_main
> +{
> +	data_t data = {};
> +
> +	igt_skip_on_simulation();
> +
> +	igt_fixture {
> +		data.gfx_fd = drm_open_driver_master(DRIVER_INTEL);
> +		kmstest_set_vt_graphics_mode();
> +		igt_display_init(&data.display, data.gfx_fd);
> +		igt_require_pipe_crc(data.gfx_fd);
> +	}
> +
> +	data.commit = data.display.is_atomic ? COMMIT_ATOMIC :
> COMMIT_LEGACY;
> +
> +	igt_subtest("available_mode_test_crc") {
> +		test_available_modes(&data);
> +	}
> +
> +	igt_fixture {
> +		kmstest_restore_vt_mode();
> +		igt_display_fini(&data.display);
> +	}
Maybe igt_exit() at the end.

With these minor additions, this patch is

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> +}
> diff --git a/tests/meson.build b/tests/meson.build
> index 22e4ac9..6a5bd96 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -150,6 +150,7 @@ test_progs = [
>  	'kms_atomic',
>  	'kms_atomic_interruptible',
>  	'kms_atomic_transition',
> +	'kms_available_modes_crc',
>  	'kms_busy',
>  	'kms_ccs',
>  	'kms_chv_cursor_fail',
-- 
Mika Kahola - Intel OTC

_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

end of thread, other threads:[~2018-05-15  9:15 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-20 16:13 [igt-dev] [PATCH i-g-t] tests/kms_available_modes_crc: Test all modes on all planes Juha-Pekka Heikkila
2018-03-20 18:06 ` [igt-dev] ✗ Fi.CI.BAT: warning for tests/kms_available_modes_crc: Test all modes on all planes (rev3) Patchwork
2018-04-03 10:12 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
2018-04-03 11:01 ` [igt-dev] ✗ Fi.CI.IGT: warning " Patchwork
2018-05-15  9:15 ` [igt-dev] [PATCH i-g-t] tests/kms_available_modes_crc: Test all modes on all planes Mika Kahola

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.