All of lore.kernel.org
 help / color / mirror / Atom feed
* [igt-dev] [PATCH] kms_rotation_crc:Add HW rotation test case for amdgpu
@ 2020-12-16 22:12 Sung Joon Kim
       [not found] ` <MN2PR12MB3054150157A5A6E90F904EF997C50@MN2PR12MB3054.namprd12.prod.outlook.com>
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Sung Joon Kim @ 2020-12-16 22:12 UTC (permalink / raw)
  To: igt-dev; +Cc: sunpengli

Added Hw rotation case specifically for amdgpu. Currently, kms_rotation_crc tests intel gpus. Added conditions to bypass all the requirements needed for intel when testing amdgpu.

Signed-off-by: Sung Joon Kim <sungkim@amd.com>
---
 tests/kms_rotation_crc.c | 1971 +++++++++++++++++++-------------------
 1 file changed, 1011 insertions(+), 960 deletions(-)

diff --git a/tests/kms_rotation_crc.c b/tests/kms_rotation_crc.c
index ffcc2cc2..f4f36144 100644
--- a/tests/kms_rotation_crc.c
+++ b/tests/kms_rotation_crc.c
@@ -1,960 +1,1011 @@
-/*
- * Copyright © 2013,2014 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 "igt.h"
-#include "igt_vec.h"
-#include <math.h>
-
-#define MAX_FENCES 32
-#define MAXMULTIPLANESAMOUNT 2
-#define TEST_MAX_WIDTH 640
-#define TEST_MAX_HEIGHT 480
-
-struct p_struct {
-	igt_plane_t *plane;
-	struct igt_fb fb;
-};
-
-enum p_pointorigo {
-	p_top = 1 << 0,
-	p_bottom = 1 << 1,
-	p_left = 1 << 2,
-	p_right = 1 << 3
-};
-
-struct p_point{
-	enum p_pointorigo origo;
-	float_t x;
-	float_t y;
-};
-
-typedef struct {
-	int gfx_fd;
-	igt_display_t display;
-	struct igt_fb fb;
-	struct igt_fb fb_reference;
-	struct igt_fb fb_flip;
-	igt_crc_t ref_crc;
-	igt_crc_t flip_crc;
-	igt_pipe_crc_t *pipe_crc;
-	igt_rotation_t rotation;
-	int pos_x;
-	int pos_y;
-	uint32_t override_fmt;
-	uint64_t override_tiling;
-	int devid;
-
-	struct p_struct *multiplaneoldview;
-	struct p_point planepos[MAXMULTIPLANESAMOUNT];
-
-	bool use_native_resolution;
-	bool extended;
-} data_t;
-
-typedef struct {
-	float r;
-	float g;
-	float b;
-} rgb_color_t;
-
-static void set_color(rgb_color_t *color, float r, float g, float b)
-{
-	color->r = r;
-	color->g = g;
-	color->b = b;
-}
-
-static void rotate_colors(rgb_color_t *tl, rgb_color_t *tr, rgb_color_t *br,
-			  rgb_color_t *bl, igt_rotation_t rotation)
-{
-	rgb_color_t bl_tmp, br_tmp, tl_tmp, tr_tmp;
-
-	if (rotation & IGT_REFLECT_X) {
-		igt_swap(*tl, *tr);
-		igt_swap(*bl, *br);
-	}
-
-	if (rotation & IGT_ROTATION_90) {
-		bl_tmp = *bl;
-		br_tmp = *br;
-		tl_tmp = *tl;
-		tr_tmp = *tr;
-		*tl = tr_tmp;
-		*bl = tl_tmp;
-		*tr = br_tmp;
-		*br = bl_tmp;
-	} else if (rotation & IGT_ROTATION_180) {
-		igt_swap(*tl, *br);
-		igt_swap(*tr, *bl);
-	} else if (rotation & IGT_ROTATION_270) {
-		bl_tmp = *bl;
-		br_tmp = *br;
-		tl_tmp = *tl;
-		tr_tmp = *tr;
-		*tl = bl_tmp;
-		*bl = br_tmp;
-		*tr = tl_tmp;
-		*br = tr_tmp;
-	}
-}
-
-#define RGB_COLOR(color) \
-	color.r, color.g, color.b
-
-static void
-paint_squares(data_t *data, igt_rotation_t rotation,
-	      struct igt_fb *fb, float o)
-{
-	cairo_t *cr;
-	unsigned int w = fb->width;
-	unsigned int h = fb->height;
-	rgb_color_t tl, tr, bl, br;
-
-	igt_assert_f(!(w&1), "rotation image must be even width, now attempted %d\n", w);
-	igt_assert_f(!(h&1), "rotation image must be even height, now attempted %d\n", h);
-
-	cr = igt_get_cairo_ctx(data->gfx_fd, fb);
-
-	set_color(&tl, o, 0.0f, 0.0f);
-	set_color(&tr, 0.0f, o, 0.0f);
-	set_color(&br, o, o, o);
-	set_color(&bl, 0.0f, 0.0f, o);
-
-	rotate_colors(&tl, &tr, &br, &bl, rotation);
-
-	igt_paint_color(cr, 0, 0, w / 2, h / 2, RGB_COLOR(tl));
-	igt_paint_color(cr, w / 2, 0, w / 2, h / 2, RGB_COLOR(tr));
-	igt_paint_color(cr, 0, h / 2, w / 2, h / 2, RGB_COLOR(bl));
-	igt_paint_color(cr, w / 2, h / 2, w / 2, h / 2, RGB_COLOR(br));
-
-	igt_put_cairo_ctx(cr);
-}
-
-static void remove_fbs(data_t *data)
-{
-	igt_remove_fb(data->gfx_fd, &data->fb);
-	igt_remove_fb(data->gfx_fd, &data->fb_reference);
-	igt_remove_fb(data->gfx_fd, &data->fb_flip);
-}
-
-static void cleanup_crtc(data_t *data)
-{
-	igt_display_t *display = &data->display;
-
-	igt_pipe_crc_free(data->pipe_crc);
-	data->pipe_crc = NULL;
-
-	remove_fbs(data);
-
-	igt_display_reset(display);
-}
-
-static void prepare_crtc(data_t *data, igt_output_t *output, enum pipe pipe,
-			 igt_plane_t *plane, bool start_crc)
-{
-	igt_display_t *display = &data->display;
-
-	cleanup_crtc(data);
-
-	igt_output_set_pipe(output, pipe);
-	igt_plane_set_rotation(plane, IGT_ROTATION_0);
-
-	/* create the pipe_crc object for this pipe */
-	igt_pipe_crc_free(data->pipe_crc);
-
-	igt_display_commit2(display, COMMIT_ATOMIC);
-	data->pipe_crc = igt_pipe_crc_new(data->gfx_fd, pipe, INTEL_PIPE_CRC_SOURCE_AUTO);
-
-	if (start_crc)
-		igt_pipe_crc_start(data->pipe_crc);
-}
-
-enum rectangle_type {
-	rectangle,
-	square,
-	portrait,
-	landscape,
-	num_rectangle_types /* must be last */
-};
-
-static void prepare_fbs(data_t *data, igt_output_t *output,
-			igt_plane_t *plane, enum rectangle_type rect, uint32_t format)
-{
-	drmModeModeInfo *mode;
-	igt_display_t *display = &data->display;
-	unsigned int w, h, ref_w, ref_h, min_w, min_h;
-	uint64_t tiling = data->override_tiling ?: LOCAL_DRM_FORMAT_MOD_NONE;
-	uint32_t pixel_format = data->override_fmt ?: DRM_FORMAT_XRGB8888;
-	const float flip_opacity = 0.75;
-
-	remove_fbs(data);
-
-	igt_plane_set_rotation(plane, IGT_ROTATION_0);
-
-	mode = igt_output_get_mode(output);
-	if (plane->type != DRM_PLANE_TYPE_CURSOR) {
-		if (data->use_native_resolution) {
-			w = mode->hdisplay;
-			h = mode->vdisplay;
-		} else {
-			w = min(TEST_MAX_WIDTH, mode->hdisplay);
-			h = min(TEST_MAX_HEIGHT, mode->vdisplay);
-		}
-
-		min_w = 256;
-		min_h = 256;
-	} else {
-		pixel_format = data->override_fmt ?: DRM_FORMAT_ARGB8888;
-
-		w = h = 256;
-		min_w = min_h = 64;
-	}
-
-	switch (rect) {
-	case rectangle:
-		break;
-	case square:
-		w = h = min(h, w);
-		break;
-	case portrait:
-		w = min_w;
-		break;
-	case landscape:
-		h = min_h;
-		break;
-	case num_rectangle_types:
-		igt_assert(0);
-	}
-
-	ref_w = w;
-	ref_h = h;
-
-	/*
-	 * For 90/270, we will use create smaller fb so that the rotated
-	 * frame can fit in
-	 */
-	if (data->rotation & (IGT_ROTATION_90 | IGT_ROTATION_270)) {
-		tiling = data->override_tiling ?: LOCAL_I915_FORMAT_MOD_Y_TILED;
-
-		igt_swap(w, h);
-	}
-
-	/*
-	 * Just try here if requested tiling format is generally available,
-	 * if one format fail it will skip entire subtest.
-	 */
-	igt_require(igt_display_has_format_mod(display, pixel_format, tiling));
-
-	/*
-	 * Create a reference software rotated flip framebuffer.
-	 */
-	igt_create_fb(data->gfx_fd, ref_w, ref_h, pixel_format, tiling,
-		      &data->fb_flip);
-	paint_squares(data, data->rotation, &data->fb_flip,
-		      flip_opacity);
-	igt_plane_set_fb(plane, &data->fb_flip);
-	if (plane->type != DRM_PLANE_TYPE_CURSOR)
-		igt_plane_set_position(plane, data->pos_x, data->pos_y);
-	igt_display_commit2(display, COMMIT_ATOMIC);
-
-	igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &data->flip_crc);
-
-	/*
-	  * Prepare the non-rotated flip fb.
-	  */
-	igt_remove_fb(data->gfx_fd, &data->fb_flip);
-	igt_create_fb(data->gfx_fd, w, h, pixel_format, tiling,
-		      &data->fb_flip);
-	paint_squares(data, IGT_ROTATION_0, &data->fb_flip,
-		      flip_opacity);
-
-	/*
-	 * Create a reference CRC for a software-rotated fb.
-	 */
-	igt_create_fb(data->gfx_fd, ref_w, ref_h, pixel_format,
-		      data->override_tiling ?: LOCAL_DRM_FORMAT_MOD_NONE, &data->fb_reference);
-	paint_squares(data, data->rotation, &data->fb_reference, 1.0);
-
-	igt_plane_set_fb(plane, &data->fb_reference);
-	if (plane->type != DRM_PLANE_TYPE_CURSOR)
-		igt_plane_set_position(plane, data->pos_x, data->pos_y);
-	igt_display_commit2(display, COMMIT_ATOMIC);
-
-	igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &data->ref_crc);
-
-	/*
-	 * Prepare the plane with an non-rotated fb let the hw rotate it.
-	 */
-	igt_create_fb(data->gfx_fd, w, h, pixel_format, tiling, &data->fb);
-	paint_squares(data, IGT_ROTATION_0, &data->fb, 1.0);
-	igt_plane_set_fb(plane, &data->fb);
-
-	if (plane->type != DRM_PLANE_TYPE_CURSOR)
-		igt_plane_set_position(plane, data->pos_x, data->pos_y);
-}
-
-static void test_single_case(data_t *data, enum pipe pipe,
-			     igt_output_t *output, igt_plane_t *plane,
-			     enum rectangle_type rect,
-			     uint32_t format, bool test_bad_format)
-{
-	igt_display_t *display = &data->display;
-	igt_crc_t crc_output;
-	int ret;
-
-	igt_debug("Testing case %i on pipe %s, format %s\n", rect, kmstest_pipe_name(pipe), igt_format_str(format));
-	prepare_fbs(data, output, plane, rect, format);
-
-	igt_plane_set_rotation(plane, data->rotation);
-	if (data->rotation & (IGT_ROTATION_90 | IGT_ROTATION_270))
-		igt_plane_set_size(plane, data->fb.height, data->fb.width);
-
-	ret = igt_display_try_commit2(display, COMMIT_ATOMIC);
-	if (test_bad_format) {
-		igt_assert_eq(ret, -EINVAL);
-		return;
-	}
-
-	/* Verify commit was ok. */
-	igt_assert_eq(ret, 0);
-
-	/* Check CRC */
-	igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &crc_output);
-	igt_assert_crc_equal(&data->ref_crc, &crc_output);
-
-	/*
-	 * If flips are requested flip to a different fb and
-	 * check CRC against that one as well.
-	 */
-	if (data->fb_flip.fb_id) {
-		igt_plane_set_fb(plane, &data->fb_flip);
-		if (data->rotation == IGT_ROTATION_90 || data->rotation == IGT_ROTATION_270)
-			igt_plane_set_size(plane, data->fb.height, data->fb.width);
-
-		if (plane->type != DRM_PLANE_TYPE_PRIMARY) {
-			igt_display_commit_atomic(display, DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK, NULL);
-		} else {
-			ret = drmModePageFlip(data->gfx_fd,
-					output->config.crtc->crtc_id,
-					data->fb_flip.fb_id,
-					DRM_MODE_PAGE_FLIP_EVENT,
-					NULL);
-			igt_assert_eq(ret, 0);
-		}
-		kmstest_wait_for_pageflip(data->gfx_fd);
-		igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &crc_output);
-		igt_assert_crc_equal(&data->flip_crc,
-				     &crc_output);
-	}
-}
-
-static bool test_format(data_t *data,
-			struct igt_vec *tested_formats,
-			uint32_t format)
-{
-	if (!igt_fb_supported_format(format))
-		return false;
-
-	if (!is_i915_device(data->gfx_fd) ||
-	    data->extended)
-		return true;
-
-	format = igt_reduce_format(format);
-
-	/* only test each format "class" once */
-	if (igt_vec_index(tested_formats, &format) >= 0)
-		return false;
-
-	igt_vec_push(tested_formats, &format);
-
-	return true;
-}
-
-static void test_plane_rotation(data_t *data, int plane_type, bool test_bad_format)
-{
-	igt_display_t *display = &data->display;
-	igt_output_t *output;
-	enum pipe pipe;
-
-	if (plane_type == DRM_PLANE_TYPE_CURSOR)
-		igt_require(display->has_cursor_plane);
-
-	igt_display_require_output(display);
-
-	for_each_pipe_with_valid_output(display, pipe, output) {
-		igt_plane_t *plane;
-		int i, j;
-
-		if (IS_CHERRYVIEW(data->devid) && pipe != PIPE_B)
-			continue;
-
-		igt_output_set_pipe(output, pipe);
-
-		plane = igt_output_get_plane_type(output, plane_type);
-		igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));
-
-		prepare_crtc(data, output, pipe, plane, true);
-
-		for (i = 0; i < num_rectangle_types; i++) {
-			/* Unsupported on i915 */
-			if (plane_type == DRM_PLANE_TYPE_CURSOR &&
-			    i != square)
-				continue;
-
-			/* Only support partial covering primary plane on gen9+ */
-			if (plane_type == DRM_PLANE_TYPE_PRIMARY &&
-			    intel_gen(intel_get_drm_devid(data->gfx_fd)) < 9) {
-				if (i != rectangle)
-					continue;
-				else
-					data->use_native_resolution = true;
-			} else {
-				data->use_native_resolution = false;
-			}
-
-			if (!data->override_fmt) {
-				struct igt_vec tested_formats;
-
-				igt_vec_init(&tested_formats, sizeof(uint32_t));
-
-				for (j = 0; j < plane->drm_plane->count_formats; j++) {
-					uint32_t format = plane->drm_plane->formats[j];
-
-					if (!test_format(data, &tested_formats, format))
-						continue;
-
-					test_single_case(data, pipe, output, plane, i,
-							 format, test_bad_format);
-				}
-
-				igt_vec_fini(&tested_formats);
-			} else {
-				test_single_case(data, pipe, output, plane, i,
-						 data->override_fmt, test_bad_format);
-			}
-		}
-		igt_pipe_crc_stop(data->pipe_crc);
-	}
-}
-
-typedef struct {
-	int32_t x1, y1;
-	uint64_t width, height, tiling, planetype, format;
-	igt_rotation_t rotation_sw, rotation_hw;
-} planeinfos;
-
-static bool get_multiplane_crc(data_t *data, igt_output_t *output,
-			       igt_crc_t *crc_output, planeinfos *planeinfo,
-			       int numplanes)
-{
-	uint32_t w, h;
-	igt_display_t *display = &data->display;
-	struct p_struct *planes, *oldplanes;
-	int c, ret;
-
-	oldplanes = data->multiplaneoldview;
-	planes = calloc(sizeof(*planes), numplanes);
-
-	for (c = 0; c < numplanes; c++) {
-		planes[c].plane = igt_output_get_plane_type(output,
-							    planeinfo[c].planetype);
-
-		/*
-		 * make plane and fb width and height always divisible by 4
-		 * due to NV12 support and Intel hw workarounds.
-		 */
-		w = planeinfo[c].width & ~3;
-		h = planeinfo[c].height & ~3;
-
-		if (planeinfo[c].rotation_sw & (IGT_ROTATION_90 | IGT_ROTATION_270))
-			igt_swap(w, h);
-
-		if (!igt_plane_has_format_mod(planes[c].plane,
-					      planeinfo[c].format,
-					      planeinfo[c].tiling))
-			return false;
-
-		igt_create_fb(data->gfx_fd, w, h, planeinfo[c].format,
-			      planeinfo[c].tiling, &planes[c].fb);
-
-		paint_squares(data, planeinfo[c].rotation_sw, &planes[c].fb, 1.0f);
-		igt_plane_set_fb(planes[c].plane, &planes[c].fb);
-
-		if (planeinfo[c].rotation_hw & (IGT_ROTATION_90 | IGT_ROTATION_270))
-			igt_plane_set_size(planes[c].plane, h, w);
-
-		igt_plane_set_position(planes[c].plane, planeinfo[c].x1, planeinfo[c].y1);
-		igt_plane_set_rotation(planes[c].plane, planeinfo[c].rotation_hw);
-	}
-
-	ret = igt_display_try_commit2(display, COMMIT_ATOMIC);
-	igt_assert_eq(ret, 0);
-
-	igt_pipe_crc_get_current(data->gfx_fd, data->pipe_crc, crc_output);
-
-	for (c = 0; c < numplanes && oldplanes; c++)
-		igt_remove_fb(data->gfx_fd, &oldplanes[c].fb);
-
-	free(oldplanes);
-	data->multiplaneoldview = (void*)planes;
-	return true;
-}
-
-static void pointlocation(data_t *data, planeinfos *p, drmModeModeInfo *mode,
-			  int c)
-{
-	if (data->planepos[c].origo & p_right) {
-		p[c].x1 = (int32_t)(data->planepos[c].x * min(TEST_MAX_WIDTH, mode->hdisplay)
-				+ mode->hdisplay);
-		p[c].x1 &= ~3;
-		/*
-		 * At this point is handled surface on right side. If display
-		 * mode is not divisible by 4 but with 2 point location is
-		 * fixed to match requirements. Because of YUV planes here is
-		 * intentionally ignored bit 1.
-		 */
-		p[c].x1 -= mode->hdisplay & 2;
-	} else {
-		p[c].x1 = (int32_t)(data->planepos[c].x * min(TEST_MAX_WIDTH, mode->hdisplay));
-		p[c].x1 &= ~3;
-	}
-
-	if (data->planepos[c].origo & p_bottom) {
-		p[c].y1 = (int32_t)(data->planepos[c].y * min(TEST_MAX_HEIGHT, mode->vdisplay)
-				+ mode->vdisplay);
-		p[c].y1 &= ~3;
-		p[c].y1 -= mode->vdisplay & 2;
-	} else {
-		p[c].y1 = (int32_t)(data->planepos[c].y * min(TEST_MAX_HEIGHT, mode->vdisplay));
-		p[c].y1 &= ~3;
-	}
-}
-
-/*
- * Here is pipe parameter which is now used only for first pipe.
- * It is left here if this test ever was wanted to be run on
- * different pipes.
- */
-static void test_multi_plane_rotation(data_t *data, enum pipe pipe)
-{
-	igt_display_t *display = &data->display;
-	igt_output_t *output;
-	igt_crc_t retcrc_sw, retcrc_hw;
-	planeinfos p[2];
-	int c, used_w, used_h;
-	struct p_struct *oldplanes;
-	drmModeModeInfo *mode;
-
-	static const struct {
-		igt_rotation_t rotation;
-		float_t width;
-		float_t height;
-		uint64_t tiling;
-	} planeconfigs[] = {
-	{IGT_ROTATION_0, .2f, .4f, LOCAL_DRM_FORMAT_MOD_NONE },
-	{IGT_ROTATION_0, .2f, .4f, LOCAL_I915_FORMAT_MOD_X_TILED },
-	{IGT_ROTATION_0, .2f, .4f, LOCAL_I915_FORMAT_MOD_Y_TILED },
-	{IGT_ROTATION_0, .2f, .4f, LOCAL_I915_FORMAT_MOD_Yf_TILED },
-	{IGT_ROTATION_90, .2f, .4f, LOCAL_I915_FORMAT_MOD_Y_TILED },
-	{IGT_ROTATION_90, .2f, .4f, LOCAL_I915_FORMAT_MOD_Yf_TILED },
-	{IGT_ROTATION_180, .2f, .4f, LOCAL_DRM_FORMAT_MOD_NONE },
-	{IGT_ROTATION_180, .2f, .4f, LOCAL_I915_FORMAT_MOD_X_TILED },
-	{IGT_ROTATION_180, .2f, .4f, LOCAL_I915_FORMAT_MOD_Y_TILED },
-	{IGT_ROTATION_180, .2f, .4f, LOCAL_I915_FORMAT_MOD_Yf_TILED },
-	{IGT_ROTATION_270, .2f, .4f, LOCAL_I915_FORMAT_MOD_Y_TILED },
-	{IGT_ROTATION_270, .2f, .4f, LOCAL_I915_FORMAT_MOD_Yf_TILED },
-	};
-
-	/*
-	* These are those modes which are tested. For testing feel interesting
-	* case with tiling are 2 bpp, 4 bpp and NV12.
-	*/
-	static const uint32_t formatlist[] = {DRM_FORMAT_RGB565,
-		DRM_FORMAT_XRGB8888, DRM_FORMAT_NV12};
-
-	for_each_valid_output_on_pipe(display, pipe, output) {
-		int i, j, k, l;
-		igt_output_set_pipe(output, pipe);
-		mode = igt_output_get_mode(output);
-		igt_display_require_output(display);
-		igt_display_commit2(display, COMMIT_ATOMIC);
-
-		used_w = min(TEST_MAX_WIDTH, mode->hdisplay);
-		used_h = min(TEST_MAX_HEIGHT, mode->vdisplay);
-
-		data->pipe_crc = igt_pipe_crc_new(data->gfx_fd, pipe,
-						  INTEL_PIPE_CRC_SOURCE_AUTO);
-		igt_pipe_crc_start(data->pipe_crc);
-
-		for (i = 0; i < ARRAY_SIZE(planeconfigs); i++) {
-			p[0].planetype = DRM_PLANE_TYPE_PRIMARY;
-			p[0].width = (uint64_t)(planeconfigs[i].width * used_w);
-			p[0].height = (uint64_t)(planeconfigs[i].height * used_h);
-			p[0].tiling = planeconfigs[i].tiling;
-			pointlocation(data, (planeinfos *)&p, mode, 0);
-
-			for (k = 0; k < ARRAY_SIZE(formatlist); k++) {
-				p[0].format = formatlist[k];
-
-				for (j = 0; j < ARRAY_SIZE(planeconfigs); j++) {
-					p[1].planetype = DRM_PLANE_TYPE_OVERLAY;
-					p[1].width = (uint64_t)(planeconfigs[j].width * used_w);
-					p[1].height = (uint64_t)(planeconfigs[j].height * used_h);
-					p[1].tiling = planeconfigs[j].tiling;
-					pointlocation(data, (planeinfos *)&p,
-						      mode, 1);
-
-					for (l = 0; l < ARRAY_SIZE(formatlist); l++) {
-						p[1].format = formatlist[l];
-
-						/*
-						 * RGB565 90/270 degrees rotation is supported
-						 * from gen11 onwards.
-						 */
-						if (p[0].format == DRM_FORMAT_RGB565 &&
-						     (planeconfigs[i].rotation & (IGT_ROTATION_90 | IGT_ROTATION_270))
-						     && intel_gen(data->devid) < 11)
-							continue;
-
-						if (p[1].format == DRM_FORMAT_RGB565 &&
-						     (planeconfigs[j].rotation & (IGT_ROTATION_90 | IGT_ROTATION_270))
-						     && intel_gen(data->devid) < 11)
-							continue;
-
-						p[0].rotation_sw = planeconfigs[i].rotation;
-						p[0].rotation_hw = IGT_ROTATION_0;
-						p[1].rotation_sw = planeconfigs[j].rotation;
-						p[1].rotation_hw = IGT_ROTATION_0;
-						if (!get_multiplane_crc(data, output, &retcrc_sw,
-								   (planeinfos *)&p, MAXMULTIPLANESAMOUNT))
-							continue;
-
-						igt_swap(p[0].rotation_sw, p[0].rotation_hw);
-						igt_swap(p[1].rotation_sw, p[1].rotation_hw);
-						if (!get_multiplane_crc(data, output, &retcrc_hw,
-								   (planeinfos *)&p, MAXMULTIPLANESAMOUNT))
-							continue;
-
-						igt_assert_crc_equal(&retcrc_sw, &retcrc_hw);
-					}
-				}
-			}
-		}
-		igt_pipe_crc_stop(data->pipe_crc);
-		igt_pipe_crc_free(data->pipe_crc);
-		igt_output_set_pipe(output, PIPE_ANY);
-	}
-
-	/*
-	* Old fbs are deleted only after new ones are set on planes.
-	* This is done to speed up the test
-	*/
-	oldplanes = data->multiplaneoldview;
-	for (c = 0; c < MAXMULTIPLANESAMOUNT && oldplanes; c++)
-		igt_remove_fb(data->gfx_fd, &oldplanes[c].fb);
-
-	free(oldplanes);
-	data->multiplaneoldview = NULL;
-	data->pipe_crc = NULL;
-}
-
-static void test_plane_rotation_exhaust_fences(data_t *data,
-					       enum pipe pipe,
-					       igt_output_t *output,
-					       igt_plane_t *plane)
-{
-	igt_display_t *display = &data->display;
-	uint64_t tiling = LOCAL_I915_FORMAT_MOD_Y_TILED;
-	uint32_t format = DRM_FORMAT_XRGB8888;
-	int fd = data->gfx_fd;
-	drmModeModeInfo *mode;
-	struct igt_fb fb[MAX_FENCES+1] = {};
-	uint64_t size;
-	unsigned int stride, w, h;
-	uint64_t total_aperture_size, total_fbs_size;
-	int i;
-
-	igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));
-
-	prepare_crtc(data, output, pipe, plane, false);
-
-	mode = igt_output_get_mode(output);
-	w = mode->hdisplay;
-	h = mode->vdisplay;
-
-	igt_calc_fb_size(fd, w, h, format, tiling, &size, &stride);
-
-	/*
-	 * Make sure there is atleast 90% of the available GTT space left
-	 * for creating (MAX_FENCES+1) framebuffers.
-	 */
-	total_fbs_size = size * (MAX_FENCES + 1);
-	total_aperture_size = gem_available_aperture_size(fd);
-	igt_require(total_fbs_size < total_aperture_size * 0.9);
-
-	for (i = 0; i < MAX_FENCES + 1; i++) {
-		igt_create_fb(fd, w, h, format, tiling, &fb[i]);
-
-		igt_plane_set_fb(plane, &fb[i]);
-		igt_plane_set_rotation(plane, IGT_ROTATION_0);
-		igt_display_commit2(display, COMMIT_ATOMIC);
-
-		igt_plane_set_rotation(plane, IGT_ROTATION_90);
-		igt_plane_set_size(plane, h, w);
-		igt_display_commit2(display, COMMIT_ATOMIC);
-	}
-
-	for (i = 0; i < MAX_FENCES + 1; i++)
-		igt_remove_fb(fd, &fb[i]);
-}
-
-static const char *plane_test_str(unsigned plane)
-{
-	switch (plane) {
-	case DRM_PLANE_TYPE_PRIMARY:
-		return "primary";
-	case DRM_PLANE_TYPE_OVERLAY:
-		return "sprite";
-	case DRM_PLANE_TYPE_CURSOR:
-		return "cursor";
-	default:
-		igt_assert(0);
-	}
-}
-
-static const char *rot_test_str(igt_rotation_t rot)
-{
-	switch (rot) {
-	case IGT_ROTATION_0:
-		return "0";
-	case IGT_ROTATION_90:
-		return "90";
-	case IGT_ROTATION_180:
-		return "180";
-	case IGT_ROTATION_270:
-		return "270";
-	default:
-		igt_assert(0);
-	}
-}
-
-static const char *tiling_test_str(uint64_t tiling)
-{
-	switch (tiling) {
-	case LOCAL_I915_FORMAT_MOD_X_TILED:
-		return "x-tiled";
-	case LOCAL_I915_FORMAT_MOD_Y_TILED:
-		return "y-tiled";
-	case LOCAL_I915_FORMAT_MOD_Yf_TILED:
-		return "yf-tiled";
-	default:
-		igt_assert(0);
-	}
-}
-
-static int opt_handler(int opt, int opt_index, void *_data)
-{
-	data_t *data = _data;
-
-	switch (opt) {
-	case 'e':
-		data->extended = true;
-		break;
-	}
-
-	return IGT_OPT_HANDLER_SUCCESS;
-}
-
-static const struct option long_opts[] = {
-	{ .name = "extended", .has_arg = false, .val = 'e', },
-	{}
-};
-
-static const char help_str[] =
-	"  --extended\t\tRun the extended tests\n";
-
-static data_t data;
-
-igt_main_args("", long_opts, help_str, opt_handler, &data)
-{
-	struct rot_subtest {
-		unsigned plane;
-		igt_rotation_t rot;
-	} *subtest, subtests[] = {
-		{ DRM_PLANE_TYPE_PRIMARY, IGT_ROTATION_90 },
-		{ DRM_PLANE_TYPE_PRIMARY, IGT_ROTATION_180 },
-		{ DRM_PLANE_TYPE_PRIMARY, IGT_ROTATION_270 },
-		{ DRM_PLANE_TYPE_OVERLAY, IGT_ROTATION_90 },
-		{ DRM_PLANE_TYPE_OVERLAY, IGT_ROTATION_180 },
-		{ DRM_PLANE_TYPE_OVERLAY, IGT_ROTATION_270 },
-		{ DRM_PLANE_TYPE_CURSOR, IGT_ROTATION_180 },
-		{ 0, 0}
-	};
-
-	struct reflect_x {
-		uint64_t tiling;
-		igt_rotation_t rot;
-	} *reflect_x, reflect_x_subtests[] = {
-		{ LOCAL_I915_FORMAT_MOD_X_TILED, IGT_ROTATION_0 },
-		{ LOCAL_I915_FORMAT_MOD_X_TILED, IGT_ROTATION_180 },
-		{ LOCAL_I915_FORMAT_MOD_Y_TILED, IGT_ROTATION_0 },
-		{ LOCAL_I915_FORMAT_MOD_Y_TILED, IGT_ROTATION_90 },
-		{ LOCAL_I915_FORMAT_MOD_Y_TILED, IGT_ROTATION_180 },
-		{ LOCAL_I915_FORMAT_MOD_Y_TILED, IGT_ROTATION_270 },
-		{ LOCAL_I915_FORMAT_MOD_Yf_TILED, IGT_ROTATION_0 },
-		{ LOCAL_I915_FORMAT_MOD_Yf_TILED, IGT_ROTATION_90 },
-		{ LOCAL_I915_FORMAT_MOD_Yf_TILED, IGT_ROTATION_180 },
-		{ LOCAL_I915_FORMAT_MOD_Yf_TILED, IGT_ROTATION_270 },
-		{ 0, 0 }
-	};
-
-	int gen = 0;
-
-	igt_fixture {
-		data.gfx_fd = drm_open_driver_master(DRIVER_INTEL);
-		data.devid = intel_get_drm_devid(data.gfx_fd);
-		gen = intel_gen(data.devid);
-
-		kmstest_set_vt_graphics_mode();
-
-		igt_require_pipe_crc(data.gfx_fd);
-
-		igt_display_require(&data.display, data.gfx_fd);
-		igt_require(data.display.is_atomic);
-	}
-
-	for (subtest = subtests; subtest->rot; subtest++) {
-		igt_subtest_f("%s-rotation-%s",
-			      plane_test_str(subtest->plane),
-			      rot_test_str(subtest->rot)) {
-			igt_require(!(subtest->rot &
-				    (IGT_ROTATION_90 | IGT_ROTATION_270)) ||
-				    gen >= 9);
-			data.rotation = subtest->rot;
-			test_plane_rotation(&data, subtest->plane, false);
-		}
-	}
-
-	igt_subtest_f("sprite-rotation-90-pos-100-0") {
-		igt_require(gen >= 9);
-		data.rotation = IGT_ROTATION_90;
-		data.pos_x = 100,
-		data.pos_y = 0;
-		test_plane_rotation(&data, DRM_PLANE_TYPE_OVERLAY, false);
-	}
-	data.pos_x = 0,
-	data.pos_y = 0;
-
-	igt_subtest_f("bad-pixel-format") {
-		 /* gen11 enables RGB565 rotation for 90/270 degrees.
-		  * so apart from this, any other gen11+ pixel format
-		  * can be used which doesn't support 90/270 degree
-		  * rotation */
-		igt_require(gen >= 9);
-		data.rotation = IGT_ROTATION_90;
-		data.override_fmt = gen < 11 ? DRM_FORMAT_RGB565 : DRM_FORMAT_Y212;
-		test_plane_rotation(&data, DRM_PLANE_TYPE_PRIMARY, true);
-	}
-	data.override_fmt = 0;
-
-	igt_subtest_f("bad-tiling") {
-		igt_require(gen >= 9);
-		data.rotation = IGT_ROTATION_90;
-		data.override_tiling = LOCAL_I915_FORMAT_MOD_X_TILED;
-		test_plane_rotation(&data, DRM_PLANE_TYPE_PRIMARY, true);
-	}
-	data.override_tiling = 0;
-
-	for (reflect_x = reflect_x_subtests; reflect_x->tiling; reflect_x++) {
-		igt_subtest_f("primary-%s-reflect-x-%s",
-			      tiling_test_str(reflect_x->tiling),
-			      rot_test_str(reflect_x->rot)) {
-			igt_require(gen >= 10 ||
-				    (IS_CHERRYVIEW(data.devid) && reflect_x->rot == IGT_ROTATION_0
-				     && reflect_x->tiling == LOCAL_I915_FORMAT_MOD_X_TILED));
-			data.rotation = (IGT_REFLECT_X | reflect_x->rot);
-			data.override_tiling = reflect_x->tiling;
-			test_plane_rotation(&data, DRM_PLANE_TYPE_PRIMARY, false);
-		}
-	}
-
-	igt_subtest_f("multiplane-rotation") {
-		igt_require(gen >= 9);
-		cleanup_crtc(&data);
-		data.planepos[0].origo = p_top | p_left;
-		data.planepos[0].x = .2f;
-		data.planepos[0].y = .1f;
-		data.planepos[1].origo = p_top | p_right;
-		data.planepos[1].x = -.4f;
-		data.planepos[1].y = .1f;
-		test_multi_plane_rotation(&data, 0);
-	}
-
-	igt_subtest_f("multiplane-rotation-cropping-top") {
-		igt_require(gen >= 9);
-		cleanup_crtc(&data);
-		data.planepos[0].origo = p_top | p_left;
-		data.planepos[0].x = -.05f;
-		data.planepos[0].y = -.15f;
-		data.planepos[1].origo = p_top | p_right;
-		data.planepos[1].x = -.15f;
-		data.planepos[1].y = -.15f;
-		test_multi_plane_rotation(&data, 0);
-	}
-
-	igt_subtest_f("multiplane-rotation-cropping-bottom") {
-		igt_require(gen >= 9);
-		cleanup_crtc(&data);
-		data.planepos[0].origo = p_bottom | p_left;
-		data.planepos[0].x = -.05f;
-		data.planepos[0].y = -.20f;
-		data.planepos[1].origo = p_bottom | p_right;
-		data.planepos[1].x = -.15f;
-		data.planepos[1].y = -.20f;
-		test_multi_plane_rotation(&data, 0);
-	}
-
-	/*
-	 * exhaust-fences should be last test, if it fails we may OOM in
-	 * the following subtests otherwise.
-	 */
-	igt_subtest_f("exhaust-fences") {
-		enum pipe pipe;
-		igt_output_t *output;
-
-		igt_require(gen >= 9);
-		igt_display_require_output(&data.display);
-
-		for_each_pipe_with_valid_output(&data.display, pipe, output) {
-			igt_plane_t *primary = &data.display.pipes[pipe].planes[0];
-
-			test_plane_rotation_exhaust_fences(&data, pipe, output, primary);
-			break;
-		}
-	}
-
-	igt_fixture {
-		igt_display_fini(&data.display);
-	}
-}
+/*
+ * Copyright © 2013,2014 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 "igt.h"
+#include "igt_vec.h"
+#include <math.h>
+
+#define MAX_FENCES 32
+#define MAXMULTIPLANESAMOUNT 2
+#define TEST_MAX_WIDTH 640
+#define TEST_MAX_HEIGHT 480
+
+struct p_struct {
+	igt_plane_t *plane;
+	struct igt_fb fb;
+};
+
+enum p_pointorigo {
+	p_top = 1 << 0,
+	p_bottom = 1 << 1,
+	p_left = 1 << 2,
+	p_right = 1 << 3
+};
+
+struct p_point{
+	enum p_pointorigo origo;
+	float_t x;
+	float_t y;
+};
+
+typedef struct {
+	int gfx_fd;
+	igt_display_t display;
+	struct igt_fb fb;
+	struct igt_fb fb_reference;
+	struct igt_fb fb_flip;
+	igt_crc_t ref_crc;
+	igt_crc_t flip_crc;
+	igt_pipe_crc_t *pipe_crc;
+	igt_rotation_t rotation;
+	int pos_x;
+	int pos_y;
+	uint32_t override_fmt;
+	uint64_t override_tiling;
+	int devid;
+
+	struct p_struct *multiplaneoldview;
+	struct p_point planepos[MAXMULTIPLANESAMOUNT];
+
+	bool use_native_resolution;
+	bool extended;
+} data_t;
+
+typedef struct {
+	float r;
+	float g;
+	float b;
+} rgb_color_t;
+
+static void set_color(rgb_color_t *color, float r, float g, float b)
+{
+	color->r = r;
+	color->g = g;
+	color->b = b;
+}
+
+static void rotate_colors(rgb_color_t *tl, rgb_color_t *tr, rgb_color_t *br,
+			  rgb_color_t *bl, igt_rotation_t rotation)
+{
+	rgb_color_t bl_tmp, br_tmp, tl_tmp, tr_tmp;
+
+	if (rotation & IGT_REFLECT_X) {
+		igt_swap(*tl, *tr);
+		igt_swap(*bl, *br);
+	}
+
+	if (rotation & IGT_ROTATION_90) {
+		bl_tmp = *bl;
+		br_tmp = *br;
+		tl_tmp = *tl;
+		tr_tmp = *tr;
+		*tl = tr_tmp;
+		*bl = tl_tmp;
+		*tr = br_tmp;
+		*br = bl_tmp;
+	} else if (rotation & IGT_ROTATION_180) {
+		igt_swap(*tl, *br);
+		igt_swap(*tr, *bl);
+	} else if (rotation & IGT_ROTATION_270) {
+		bl_tmp = *bl;
+		br_tmp = *br;
+		tl_tmp = *tl;
+		tr_tmp = *tr;
+		*tl = bl_tmp;
+		*bl = br_tmp;
+		*tr = tl_tmp;
+		*br = tr_tmp;
+	}
+}
+
+#define RGB_COLOR(color) \
+	color.r, color.g, color.b
+
+static void
+paint_squares(data_t *data, igt_rotation_t rotation,
+	      struct igt_fb *fb, float o)
+{
+	cairo_t *cr;
+	unsigned int w = fb->width;
+	unsigned int h = fb->height;
+	rgb_color_t tl, tr, bl, br;
+
+	igt_assert_f(!(w&1), "rotation image must be even width, now attempted %d\n", w);
+	igt_assert_f(!(h&1), "rotation image must be even height, now attempted %d\n", h);
+
+	cr = igt_get_cairo_ctx(data->gfx_fd, fb);
+
+	set_color(&tl, o, 0.0f, 0.0f);
+	set_color(&tr, 0.0f, o, 0.0f);
+	set_color(&br, o, o, o);
+	set_color(&bl, 0.0f, 0.0f, o);
+
+	rotate_colors(&tl, &tr, &br, &bl, rotation);
+
+	igt_paint_color(cr, 0, 0, w / 2, h / 2, RGB_COLOR(tl));
+	igt_paint_color(cr, w / 2, 0, w / 2, h / 2, RGB_COLOR(tr));
+	igt_paint_color(cr, 0, h / 2, w / 2, h / 2, RGB_COLOR(bl));
+	igt_paint_color(cr, w / 2, h / 2, w / 2, h / 2, RGB_COLOR(br));
+
+	igt_put_cairo_ctx(cr);
+}
+
+static void remove_fbs(data_t *data)
+{
+	igt_remove_fb(data->gfx_fd, &data->fb);
+	igt_remove_fb(data->gfx_fd, &data->fb_reference);
+	igt_remove_fb(data->gfx_fd, &data->fb_flip);
+}
+
+static void cleanup_crtc(data_t *data)
+{
+	igt_display_t *display = &data->display;
+
+	igt_pipe_crc_free(data->pipe_crc);
+	data->pipe_crc = NULL;
+
+	remove_fbs(data);
+
+	igt_display_reset(display);
+}
+
+static void prepare_crtc(data_t *data, igt_output_t *output, enum pipe pipe,
+			 igt_plane_t *plane, bool start_crc)
+{
+	igt_display_t *display = &data->display;
+
+	cleanup_crtc(data);
+
+	igt_output_set_pipe(output, pipe);
+	igt_plane_set_rotation(plane, IGT_ROTATION_0);
+
+	/* create the pipe_crc object for this pipe */
+	igt_pipe_crc_free(data->pipe_crc);
+
+	if (is_amdgpu_device(data->gfx_fd)) {
+		igt_fb_t fb_temp;
+
+		igt_create_fb(data->gfx_fd, 1280, 800, DRM_FORMAT_XRGB8888, 0, &fb_temp);
+		igt_plane_set_fb(plane, &fb_temp);
+	}
+	igt_display_commit2(display, COMMIT_ATOMIC);
+	data->pipe_crc = igt_pipe_crc_new(data->gfx_fd, pipe, INTEL_PIPE_CRC_SOURCE_AUTO);
+
+	if (start_crc)
+		igt_pipe_crc_start(data->pipe_crc);
+}
+
+enum rectangle_type {
+	rectangle,
+	square,
+	portrait,
+	landscape,
+	num_rectangle_types /* must be last */
+};
+
+static void prepare_fbs(data_t *data, igt_output_t *output,
+			igt_plane_t *plane, enum rectangle_type rect, uint32_t format)
+{
+	drmModeModeInfo *mode;
+	igt_display_t *display = &data->display;
+	unsigned int w, h, ref_w, ref_h, min_w, min_h;
+	uint64_t tiling = data->override_tiling ?: LOCAL_DRM_FORMAT_MOD_NONE;
+	uint32_t pixel_format = data->override_fmt ?: DRM_FORMAT_XRGB8888;
+	const float flip_opacity = 0.75;
+	bool amd_gpu = is_amdgpu_device(data->gfx_fd);
+	bool intel_gpu = is_i915_device(data->gfx_fd);
+
+	remove_fbs(data);
+
+	igt_plane_set_rotation(plane, IGT_ROTATION_0);
+
+	mode = igt_output_get_mode(output);
+	if (plane->type != DRM_PLANE_TYPE_CURSOR) {
+		if (amd_gpu) {
+			w = mode->hdisplay;
+			h = mode->vdisplay;
+		} else if (intel_gpu) {
+			if (data->use_native_resolution) {
+				w = mode->hdisplay;
+				h = mode->vdisplay;
+			} else {
+				w = min(TEST_MAX_WIDTH, mode->hdisplay);
+				h = min(TEST_MAX_HEIGHT, mode->vdisplay);
+			}
+
+			min_w = 256;
+			min_h = 256;
+		}
+	} else {
+		pixel_format = data->override_fmt ?: DRM_FORMAT_ARGB8888;
+
+		w = h = 256;
+		min_w = min_h = 64;
+	}
+
+	switch (rect) {
+	case rectangle:
+		break;
+	case square:
+		w = h = min(h, w);
+		break;
+	case portrait:
+		w = min_w;
+		break;
+	case landscape:
+		h = min_h;
+		break;
+	case num_rectangle_types:
+		igt_assert(0);
+	}
+
+	ref_w = w;
+	ref_h = h;
+
+	/*
+	 * For 90/270, we will use create smaller fb so that the rotated
+	 * frame can fit in
+	 */
+	if (data->rotation & (IGT_ROTATION_90 | IGT_ROTATION_270)) {
+		if (intel_gpu)
+			tiling = data->override_tiling ?: LOCAL_I915_FORMAT_MOD_Y_TILED;
+
+		igt_swap(w, h);
+	}
+
+	/*
+	 * Just try here if requested tiling format is generally available,
+	 * if one format fail it will skip entire subtest.
+	 */
+	igt_require(igt_display_has_format_mod(display, pixel_format, tiling));
+
+	if (intel_gpu) {
+		/*
+		 * Create a reference software rotated flip framebuffer.
+		 */
+		igt_create_fb(data->gfx_fd, ref_w, ref_h, pixel_format, tiling,
+			      &data->fb_flip);
+		paint_squares(data, data->rotation, &data->fb_flip,
+			      flip_opacity);
+		igt_plane_set_fb(plane, &data->fb_flip);
+		if (plane->type != DRM_PLANE_TYPE_CURSOR)
+			igt_plane_set_position(plane, data->pos_x, data->pos_y);
+		igt_display_commit2(display, COMMIT_ATOMIC);
+
+		igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &data->flip_crc);
+
+		/*
+		  * Prepare the non-rotated flip fb.
+		  */
+		igt_remove_fb(data->gfx_fd, &data->fb_flip);
+		igt_create_fb(data->gfx_fd, w, h, pixel_format, tiling,
+			      &data->fb_flip);
+		paint_squares(data, IGT_ROTATION_0, &data->fb_flip,
+			      flip_opacity);
+
+		/*
+		 * Create a reference CRC for a software-rotated fb.
+		 */
+		igt_create_fb(data->gfx_fd, ref_w, ref_h, pixel_format,
+			      data->override_tiling ?: LOCAL_DRM_FORMAT_MOD_NONE, &data->fb_reference);
+	} else if (amd_gpu) {
+		tiling = 0x1900;
+		igt_create_fb(data->gfx_fd, ref_w, ref_h, pixel_format,
+				  tiling, &data->fb_reference);
+	}
+	paint_squares(data, data->rotation, &data->fb_reference, 1.0);
+
+	igt_plane_set_fb(plane, &data->fb_reference);
+	if (plane->type != DRM_PLANE_TYPE_CURSOR)
+		igt_plane_set_position(plane, data->pos_x, data->pos_y);
+	igt_display_commit2(display, COMMIT_ATOMIC);
+
+	if (intel_gpu)
+		igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &data->ref_crc);
+	else if (amd_gpu)
+		igt_pipe_crc_collect_crc(data->pipe_crc, &data->ref_crc);
+
+	/*
+	 * Prepare the plane with an non-rotated fb let the hw rotate it.
+	 */
+	igt_create_fb(data->gfx_fd, w, h, pixel_format, tiling, &data->fb);
+	paint_squares(data, IGT_ROTATION_0, &data->fb, 1.0);
+	igt_plane_set_fb(plane, &data->fb);
+
+	if (plane->type != DRM_PLANE_TYPE_CURSOR)
+		igt_plane_set_position(plane, data->pos_x, data->pos_y);
+}
+
+static void test_single_case(data_t *data, enum pipe pipe,
+			     igt_output_t *output, igt_plane_t *plane,
+			     enum rectangle_type rect,
+			     uint32_t format, bool test_bad_format)
+{
+	igt_display_t *display = &data->display;
+	igt_crc_t crc_output;
+	int ret;
+
+	igt_debug("Testing case %i on pipe %s, format %s\n", rect, kmstest_pipe_name(pipe), igt_format_str(format));
+	prepare_fbs(data, output, plane, rect, format);
+
+	igt_plane_set_rotation(plane, data->rotation);
+	if (data->rotation & (IGT_ROTATION_90 | IGT_ROTATION_270))
+		igt_plane_set_size(plane, data->fb.height, data->fb.width);
+
+	ret = igt_display_try_commit2(display, COMMIT_ATOMIC);
+	if (test_bad_format) {
+		igt_assert_eq(ret, -EINVAL);
+		return;
+	}
+
+	/* Verify commit was ok. */
+	igt_assert_eq(ret, 0);
+
+	if (is_i915_device(data->gfx_fd)) {
+		/* Check CRC */
+		igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &crc_output);
+		igt_assert_crc_equal(&data->ref_crc, &crc_output);
+
+		/*
+		 * If flips are requested flip to a different fb and
+		 * check CRC against that one as well.
+		 */
+		if (data->fb_flip.fb_id) {
+			igt_plane_set_fb(plane, &data->fb_flip);
+			if (data->rotation == IGT_ROTATION_90 || data->rotation == IGT_ROTATION_270)
+				igt_plane_set_size(plane, data->fb.height, data->fb.width);
+
+			if (plane->type != DRM_PLANE_TYPE_PRIMARY) {
+				igt_display_commit_atomic(display, DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK, NULL);
+			} else {
+				ret = drmModePageFlip(data->gfx_fd,
+						output->config.crtc->crtc_id,
+						data->fb_flip.fb_id,
+						DRM_MODE_PAGE_FLIP_EVENT,
+						NULL);
+				igt_assert_eq(ret, 0);
+			}
+			kmstest_wait_for_pageflip(data->gfx_fd);
+			igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &crc_output);
+			igt_assert_crc_equal(&data->flip_crc,
+					     &crc_output);
+		}
+	} else if (is_amdgpu_device(data->gfx_fd)) {
+		igt_pipe_crc_collect_crc(data->pipe_crc, &crc_output);
+	}
+}
+
+static bool test_format(data_t *data,
+			struct igt_vec *tested_formats,
+			uint32_t format)
+{
+	if (!igt_fb_supported_format(format))
+		return false;
+
+	if (!is_i915_device(data->gfx_fd) ||
+	    data->extended)
+		return true;
+
+	format = igt_reduce_format(format);
+
+	/* only test each format "class" once */
+	if (igt_vec_index(tested_formats, &format) >= 0)
+		return false;
+
+	igt_vec_push(tested_formats, &format);
+
+	return true;
+}
+
+static void test_plane_rotation(data_t *data, int plane_type, bool test_bad_format)
+{
+	igt_display_t *display = &data->display;
+	igt_output_t *output;
+	enum pipe pipe;
+
+	if (plane_type == DRM_PLANE_TYPE_CURSOR)
+		igt_require(display->has_cursor_plane);
+
+	igt_display_require_output(display);
+
+	for_each_pipe_with_valid_output(display, pipe, output) {
+		igt_plane_t *plane;
+		int i, j;
+
+		if (is_i915_device(data->gfx_fd)) {
+			if (IS_CHERRYVIEW(data->devid) && pipe != PIPE_B)
+				continue;
+
+			igt_output_set_pipe(output, pipe);
+
+			plane = igt_output_get_plane_type(output, plane_type);
+			igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));
+
+			prepare_crtc(data, output, pipe, plane, true);
+
+			for (i = 0; i < num_rectangle_types; i++) {
+				/* Unsupported on i915 */
+				if (plane_type == DRM_PLANE_TYPE_CURSOR &&
+				    i != square)
+					continue;
+
+				/* Only support partial covering primary plane on gen9+ */
+				if (plane_type == DRM_PLANE_TYPE_PRIMARY &&
+				    intel_gen(intel_get_drm_devid(data->gfx_fd)) < 9) {
+					if (i != rectangle)
+						continue;
+					else
+						data->use_native_resolution = true;
+				} else {
+					data->use_native_resolution = false;
+				}
+
+				if (!data->override_fmt) {
+					struct igt_vec tested_formats;
+
+					igt_vec_init(&tested_formats, sizeof(uint32_t));
+
+					for (j = 0; j < plane->drm_plane->count_formats; j++) {
+						uint32_t format = plane->drm_plane->formats[j];
+
+						if (!test_format(data, &tested_formats, format))
+							continue;
+
+						test_single_case(data, pipe, output, plane, i,
+								 format, test_bad_format);
+					}
+
+					igt_vec_fini(&tested_formats);
+				} else {
+					test_single_case(data, pipe, output, plane, i,
+							 data->override_fmt, test_bad_format);
+				}
+			}
+		} else if (is_amdgpu_device(data->gfx_fd)) {
+			uint32_t format = DRM_FORMAT_XRGB8888;
+
+			igt_output_set_pipe(output, pipe);
+
+			plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
+			igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));
+
+			prepare_crtc(data, output, pipe, plane, false);
+
+			if (plane_type != DRM_PLANE_TYPE_PRIMARY) {
+				plane = igt_output_get_plane_type(output, plane_type);
+				igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));
+			}
+
+			test_single_case(data, pipe, output, plane,
+					 rectangle, format, test_bad_format);
+		}
+
+		igt_pipe_crc_stop(data->pipe_crc);
+	}
+}
+
+typedef struct {
+	int32_t x1, y1;
+	uint64_t width, height, tiling, planetype, format;
+	igt_rotation_t rotation_sw, rotation_hw;
+} planeinfos;
+
+static bool get_multiplane_crc(data_t *data, igt_output_t *output,
+			       igt_crc_t *crc_output, planeinfos *planeinfo,
+			       int numplanes)
+{
+	uint32_t w, h;
+	igt_display_t *display = &data->display;
+	struct p_struct *planes, *oldplanes;
+	int c, ret;
+
+	oldplanes = data->multiplaneoldview;
+	planes = calloc(sizeof(*planes), numplanes);
+
+	for (c = 0; c < numplanes; c++) {
+		planes[c].plane = igt_output_get_plane_type(output,
+							    planeinfo[c].planetype);
+
+		/*
+		 * make plane and fb width and height always divisible by 4
+		 * due to NV12 support and Intel hw workarounds.
+		 */
+		w = planeinfo[c].width & ~3;
+		h = planeinfo[c].height & ~3;
+
+		if (planeinfo[c].rotation_sw & (IGT_ROTATION_90 | IGT_ROTATION_270))
+			igt_swap(w, h);
+
+		if (!igt_plane_has_format_mod(planes[c].plane,
+					      planeinfo[c].format,
+					      planeinfo[c].tiling))
+			return false;
+
+		igt_create_fb(data->gfx_fd, w, h, planeinfo[c].format,
+			      planeinfo[c].tiling, &planes[c].fb);
+
+		paint_squares(data, planeinfo[c].rotation_sw, &planes[c].fb, 1.0f);
+		igt_plane_set_fb(planes[c].plane, &planes[c].fb);
+
+		if (planeinfo[c].rotation_hw & (IGT_ROTATION_90 | IGT_ROTATION_270))
+			igt_plane_set_size(planes[c].plane, h, w);
+
+		igt_plane_set_position(planes[c].plane, planeinfo[c].x1, planeinfo[c].y1);
+		igt_plane_set_rotation(planes[c].plane, planeinfo[c].rotation_hw);
+	}
+
+	ret = igt_display_try_commit2(display, COMMIT_ATOMIC);
+	igt_assert_eq(ret, 0);
+
+	igt_pipe_crc_get_current(data->gfx_fd, data->pipe_crc, crc_output);
+
+	for (c = 0; c < numplanes && oldplanes; c++)
+		igt_remove_fb(data->gfx_fd, &oldplanes[c].fb);
+
+	free(oldplanes);
+	data->multiplaneoldview = (void*)planes;
+	return true;
+}
+
+static void pointlocation(data_t *data, planeinfos *p, drmModeModeInfo *mode,
+			  int c)
+{
+	if (data->planepos[c].origo & p_right) {
+		p[c].x1 = (int32_t)(data->planepos[c].x * min(TEST_MAX_WIDTH, mode->hdisplay)
+				+ mode->hdisplay);
+		p[c].x1 &= ~3;
+		/*
+		 * At this point is handled surface on right side. If display
+		 * mode is not divisible by 4 but with 2 point location is
+		 * fixed to match requirements. Because of YUV planes here is
+		 * intentionally ignored bit 1.
+		 */
+		p[c].x1 -= mode->hdisplay & 2;
+	} else {
+		p[c].x1 = (int32_t)(data->planepos[c].x * min(TEST_MAX_WIDTH, mode->hdisplay));
+		p[c].x1 &= ~3;
+	}
+
+	if (data->planepos[c].origo & p_bottom) {
+		p[c].y1 = (int32_t)(data->planepos[c].y * min(TEST_MAX_HEIGHT, mode->vdisplay)
+				+ mode->vdisplay);
+		p[c].y1 &= ~3;
+		p[c].y1 -= mode->vdisplay & 2;
+	} else {
+		p[c].y1 = (int32_t)(data->planepos[c].y * min(TEST_MAX_HEIGHT, mode->vdisplay));
+		p[c].y1 &= ~3;
+	}
+}
+
+/*
+ * Here is pipe parameter which is now used only for first pipe.
+ * It is left here if this test ever was wanted to be run on
+ * different pipes.
+ */
+static void test_multi_plane_rotation(data_t *data, enum pipe pipe)
+{
+	igt_display_t *display = &data->display;
+	igt_output_t *output;
+	igt_crc_t retcrc_sw, retcrc_hw;
+	planeinfos p[2];
+	int c, used_w, used_h;
+	struct p_struct *oldplanes;
+	drmModeModeInfo *mode;
+
+	static const struct {
+		igt_rotation_t rotation;
+		float_t width;
+		float_t height;
+		uint64_t tiling;
+	} planeconfigs[] = {
+	{IGT_ROTATION_0, .2f, .4f, LOCAL_DRM_FORMAT_MOD_NONE },
+	{IGT_ROTATION_0, .2f, .4f, LOCAL_I915_FORMAT_MOD_X_TILED },
+	{IGT_ROTATION_0, .2f, .4f, LOCAL_I915_FORMAT_MOD_Y_TILED },
+	{IGT_ROTATION_0, .2f, .4f, LOCAL_I915_FORMAT_MOD_Yf_TILED },
+	{IGT_ROTATION_90, .2f, .4f, LOCAL_I915_FORMAT_MOD_Y_TILED },
+	{IGT_ROTATION_90, .2f, .4f, LOCAL_I915_FORMAT_MOD_Yf_TILED },
+	{IGT_ROTATION_180, .2f, .4f, LOCAL_DRM_FORMAT_MOD_NONE },
+	{IGT_ROTATION_180, .2f, .4f, LOCAL_I915_FORMAT_MOD_X_TILED },
+	{IGT_ROTATION_180, .2f, .4f, LOCAL_I915_FORMAT_MOD_Y_TILED },
+	{IGT_ROTATION_180, .2f, .4f, LOCAL_I915_FORMAT_MOD_Yf_TILED },
+	{IGT_ROTATION_270, .2f, .4f, LOCAL_I915_FORMAT_MOD_Y_TILED },
+	{IGT_ROTATION_270, .2f, .4f, LOCAL_I915_FORMAT_MOD_Yf_TILED },
+	};
+
+	/*
+	* These are those modes which are tested. For testing feel interesting
+	* case with tiling are 2 bpp, 4 bpp and NV12.
+	*/
+	static const uint32_t formatlist[] = {DRM_FORMAT_RGB565,
+		DRM_FORMAT_XRGB8888, DRM_FORMAT_NV12};
+
+	for_each_valid_output_on_pipe(display, pipe, output) {
+		int i, j, k, l;
+		igt_output_set_pipe(output, pipe);
+		mode = igt_output_get_mode(output);
+		igt_display_require_output(display);
+		igt_display_commit2(display, COMMIT_ATOMIC);
+
+		used_w = min(TEST_MAX_WIDTH, mode->hdisplay);
+		used_h = min(TEST_MAX_HEIGHT, mode->vdisplay);
+
+		data->pipe_crc = igt_pipe_crc_new(data->gfx_fd, pipe,
+						  INTEL_PIPE_CRC_SOURCE_AUTO);
+		igt_pipe_crc_start(data->pipe_crc);
+
+		for (i = 0; i < ARRAY_SIZE(planeconfigs); i++) {
+			p[0].planetype = DRM_PLANE_TYPE_PRIMARY;
+			p[0].width = (uint64_t)(planeconfigs[i].width * used_w);
+			p[0].height = (uint64_t)(planeconfigs[i].height * used_h);
+			p[0].tiling = planeconfigs[i].tiling;
+			pointlocation(data, (planeinfos *)&p, mode, 0);
+
+			for (k = 0; k < ARRAY_SIZE(formatlist); k++) {
+				p[0].format = formatlist[k];
+
+				for (j = 0; j < ARRAY_SIZE(planeconfigs); j++) {
+					p[1].planetype = DRM_PLANE_TYPE_OVERLAY;
+					p[1].width = (uint64_t)(planeconfigs[j].width * used_w);
+					p[1].height = (uint64_t)(planeconfigs[j].height * used_h);
+					p[1].tiling = planeconfigs[j].tiling;
+					pointlocation(data, (planeinfos *)&p,
+						      mode, 1);
+
+					for (l = 0; l < ARRAY_SIZE(formatlist); l++) {
+						p[1].format = formatlist[l];
+
+						/*
+						 * RGB565 90/270 degrees rotation is supported
+						 * from gen11 onwards.
+						 */
+						if (p[0].format == DRM_FORMAT_RGB565 &&
+						     (planeconfigs[i].rotation & (IGT_ROTATION_90 | IGT_ROTATION_270))
+						     && intel_gen(data->devid) < 11)
+							continue;
+
+						if (p[1].format == DRM_FORMAT_RGB565 &&
+						     (planeconfigs[j].rotation & (IGT_ROTATION_90 | IGT_ROTATION_270))
+						     && intel_gen(data->devid) < 11)
+							continue;
+
+						p[0].rotation_sw = planeconfigs[i].rotation;
+						p[0].rotation_hw = IGT_ROTATION_0;
+						p[1].rotation_sw = planeconfigs[j].rotation;
+						p[1].rotation_hw = IGT_ROTATION_0;
+						if (!get_multiplane_crc(data, output, &retcrc_sw,
+								   (planeinfos *)&p, MAXMULTIPLANESAMOUNT))
+							continue;
+
+						igt_swap(p[0].rotation_sw, p[0].rotation_hw);
+						igt_swap(p[1].rotation_sw, p[1].rotation_hw);
+						if (!get_multiplane_crc(data, output, &retcrc_hw,
+								   (planeinfos *)&p, MAXMULTIPLANESAMOUNT))
+							continue;
+
+						igt_assert_crc_equal(&retcrc_sw, &retcrc_hw);
+					}
+				}
+			}
+		}
+		igt_pipe_crc_stop(data->pipe_crc);
+		igt_pipe_crc_free(data->pipe_crc);
+		igt_output_set_pipe(output, PIPE_ANY);
+	}
+
+	/*
+	* Old fbs are deleted only after new ones are set on planes.
+	* This is done to speed up the test
+	*/
+	oldplanes = data->multiplaneoldview;
+	for (c = 0; c < MAXMULTIPLANESAMOUNT && oldplanes; c++)
+		igt_remove_fb(data->gfx_fd, &oldplanes[c].fb);
+
+	free(oldplanes);
+	data->multiplaneoldview = NULL;
+	data->pipe_crc = NULL;
+}
+
+static void test_plane_rotation_exhaust_fences(data_t *data,
+					       enum pipe pipe,
+					       igt_output_t *output,
+					       igt_plane_t *plane)
+{
+	igt_display_t *display = &data->display;
+	uint64_t tiling = LOCAL_I915_FORMAT_MOD_Y_TILED;
+	uint32_t format = DRM_FORMAT_XRGB8888;
+	int fd = data->gfx_fd;
+	drmModeModeInfo *mode;
+	struct igt_fb fb[MAX_FENCES+1] = {};
+	uint64_t size;
+	unsigned int stride, w, h;
+	uint64_t total_aperture_size, total_fbs_size;
+	int i;
+
+	igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));
+
+	prepare_crtc(data, output, pipe, plane, false);
+
+	mode = igt_output_get_mode(output);
+	w = mode->hdisplay;
+	h = mode->vdisplay;
+
+	igt_calc_fb_size(fd, w, h, format, tiling, &size, &stride);
+
+	/*
+	 * Make sure there is atleast 90% of the available GTT space left
+	 * for creating (MAX_FENCES+1) framebuffers.
+	 */
+	total_fbs_size = size * (MAX_FENCES + 1);
+	total_aperture_size = gem_available_aperture_size(fd);
+	igt_require(total_fbs_size < total_aperture_size * 0.9);
+
+	for (i = 0; i < MAX_FENCES + 1; i++) {
+		igt_create_fb(fd, w, h, format, tiling, &fb[i]);
+
+		igt_plane_set_fb(plane, &fb[i]);
+		igt_plane_set_rotation(plane, IGT_ROTATION_0);
+		igt_display_commit2(display, COMMIT_ATOMIC);
+
+		igt_plane_set_rotation(plane, IGT_ROTATION_90);
+		igt_plane_set_size(plane, h, w);
+		igt_display_commit2(display, COMMIT_ATOMIC);
+	}
+
+	for (i = 0; i < MAX_FENCES + 1; i++)
+		igt_remove_fb(fd, &fb[i]);
+}
+
+static const char *plane_test_str(unsigned plane)
+{
+	switch (plane) {
+	case DRM_PLANE_TYPE_PRIMARY:
+		return "primary";
+	case DRM_PLANE_TYPE_OVERLAY:
+		return "sprite";
+	case DRM_PLANE_TYPE_CURSOR:
+		return "cursor";
+	default:
+		igt_assert(0);
+	}
+}
+
+static const char *rot_test_str(igt_rotation_t rot)
+{
+	switch (rot) {
+	case IGT_ROTATION_0:
+		return "0";
+	case IGT_ROTATION_90:
+		return "90";
+	case IGT_ROTATION_180:
+		return "180";
+	case IGT_ROTATION_270:
+		return "270";
+	default:
+		igt_assert(0);
+	}
+}
+
+static const char *tiling_test_str(uint64_t tiling)
+{
+	switch (tiling) {
+	case LOCAL_I915_FORMAT_MOD_X_TILED:
+		return "x-tiled";
+	case LOCAL_I915_FORMAT_MOD_Y_TILED:
+		return "y-tiled";
+	case LOCAL_I915_FORMAT_MOD_Yf_TILED:
+		return "yf-tiled";
+	default:
+		igt_assert(0);
+	}
+}
+
+static int opt_handler(int opt, int opt_index, void *_data)
+{
+	data_t *data = _data;
+
+	switch (opt) {
+	case 'e':
+		data->extended = true;
+		break;
+	}
+
+	return IGT_OPT_HANDLER_SUCCESS;
+}
+
+static const struct option long_opts[] = {
+	{ .name = "extended", .has_arg = false, .val = 'e', },
+	{}
+};
+
+static const char help_str[] =
+	"  --extended\t\tRun the extended tests\n";
+
+static data_t data;
+
+igt_main_args("", long_opts, help_str, opt_handler, &data)
+{
+	struct rot_subtest {
+		unsigned plane;
+		igt_rotation_t rot;
+	} *subtest, subtests[] = {
+		{ DRM_PLANE_TYPE_PRIMARY, IGT_ROTATION_90 },
+		{ DRM_PLANE_TYPE_PRIMARY, IGT_ROTATION_180 },
+		{ DRM_PLANE_TYPE_PRIMARY, IGT_ROTATION_270 },
+		{ DRM_PLANE_TYPE_OVERLAY, IGT_ROTATION_90 },
+		{ DRM_PLANE_TYPE_OVERLAY, IGT_ROTATION_180 },
+		{ DRM_PLANE_TYPE_OVERLAY, IGT_ROTATION_270 },
+		{ DRM_PLANE_TYPE_CURSOR, IGT_ROTATION_180 },
+		{ 0, 0}
+	};
+
+	struct reflect_x {
+		uint64_t tiling;
+		igt_rotation_t rot;
+	} *reflect_x, reflect_x_subtests[] = {
+		{ LOCAL_I915_FORMAT_MOD_X_TILED, IGT_ROTATION_0 },
+		{ LOCAL_I915_FORMAT_MOD_X_TILED, IGT_ROTATION_180 },
+		{ LOCAL_I915_FORMAT_MOD_Y_TILED, IGT_ROTATION_0 },
+		{ LOCAL_I915_FORMAT_MOD_Y_TILED, IGT_ROTATION_90 },
+		{ LOCAL_I915_FORMAT_MOD_Y_TILED, IGT_ROTATION_180 },
+		{ LOCAL_I915_FORMAT_MOD_Y_TILED, IGT_ROTATION_270 },
+		{ LOCAL_I915_FORMAT_MOD_Yf_TILED, IGT_ROTATION_0 },
+		{ LOCAL_I915_FORMAT_MOD_Yf_TILED, IGT_ROTATION_90 },
+		{ LOCAL_I915_FORMAT_MOD_Yf_TILED, IGT_ROTATION_180 },
+		{ LOCAL_I915_FORMAT_MOD_Yf_TILED, IGT_ROTATION_270 },
+		{ 0, 0 }
+	};
+
+	int gen = 0;
+
+	igt_fixture {
+		data.gfx_fd = drm_open_driver_master(DRIVER_INTEL | DRIVER_AMDGPU);
+		if (is_i915_device(data.gfx_fd)) {
+			data.devid = intel_get_drm_devid(data.gfx_fd);
+			gen = intel_gen(data.devid);
+		}
+
+		kmstest_set_vt_graphics_mode();
+
+		igt_require_pipe_crc(data.gfx_fd);
+
+		igt_display_require(&data.display, data.gfx_fd);
+		igt_require(data.display.is_atomic);
+	}
+
+	for (subtest = subtests; subtest->rot; subtest++) {
+		igt_subtest_f("%s-rotation-%s",
+			      plane_test_str(subtest->plane),
+			      rot_test_str(subtest->rot)) {
+			if (is_i915_device(data.gfx_fd)) {
+				igt_require(!(subtest->rot &
+					    (IGT_ROTATION_90 | IGT_ROTATION_270)) ||
+					    gen >= 9);
+			}
+			data.rotation = subtest->rot;
+			test_plane_rotation(&data, subtest->plane, false);
+		}
+	}
+
+	igt_subtest_f("sprite-rotation-90-pos-100-0") {
+		igt_require(gen >= 9);
+		data.rotation = IGT_ROTATION_90;
+		data.pos_x = 100,
+		data.pos_y = 0;
+		test_plane_rotation(&data, DRM_PLANE_TYPE_OVERLAY, false);
+	}
+	data.pos_x = 0,
+	data.pos_y = 0;
+
+	igt_subtest_f("bad-pixel-format") {
+		 /* gen11 enables RGB565 rotation for 90/270 degrees.
+		  * so apart from this, any other gen11+ pixel format
+		  * can be used which doesn't support 90/270 degree
+		  * rotation */
+		igt_require(gen >= 9);
+		data.rotation = IGT_ROTATION_90;
+		data.override_fmt = gen < 11 ? DRM_FORMAT_RGB565 : DRM_FORMAT_Y212;
+		test_plane_rotation(&data, DRM_PLANE_TYPE_PRIMARY, true);
+	}
+	data.override_fmt = 0;
+
+	igt_subtest_f("bad-tiling") {
+		igt_require(gen >= 9);
+		data.rotation = IGT_ROTATION_90;
+		data.override_tiling = LOCAL_I915_FORMAT_MOD_X_TILED;
+		test_plane_rotation(&data, DRM_PLANE_TYPE_PRIMARY, true);
+	}
+	data.override_tiling = 0;
+
+	for (reflect_x = reflect_x_subtests; reflect_x->tiling; reflect_x++) {
+		igt_subtest_f("primary-%s-reflect-x-%s",
+			      tiling_test_str(reflect_x->tiling),
+			      rot_test_str(reflect_x->rot)) {
+			igt_require(gen >= 10 ||
+				    (IS_CHERRYVIEW(data.devid) && reflect_x->rot == IGT_ROTATION_0
+				     && reflect_x->tiling == LOCAL_I915_FORMAT_MOD_X_TILED));
+			data.rotation = (IGT_REFLECT_X | reflect_x->rot);
+			data.override_tiling = reflect_x->tiling;
+			test_plane_rotation(&data, DRM_PLANE_TYPE_PRIMARY, false);
+		}
+	}
+
+	igt_subtest_f("multiplane-rotation") {
+		igt_require(gen >= 9);
+		cleanup_crtc(&data);
+		data.planepos[0].origo = p_top | p_left;
+		data.planepos[0].x = .2f;
+		data.planepos[0].y = .1f;
+		data.planepos[1].origo = p_top | p_right;
+		data.planepos[1].x = -.4f;
+		data.planepos[1].y = .1f;
+		test_multi_plane_rotation(&data, 0);
+	}
+
+	igt_subtest_f("multiplane-rotation-cropping-top") {
+		igt_require(gen >= 9);
+		cleanup_crtc(&data);
+		data.planepos[0].origo = p_top | p_left;
+		data.planepos[0].x = -.05f;
+		data.planepos[0].y = -.15f;
+		data.planepos[1].origo = p_top | p_right;
+		data.planepos[1].x = -.15f;
+		data.planepos[1].y = -.15f;
+		test_multi_plane_rotation(&data, 0);
+	}
+
+	igt_subtest_f("multiplane-rotation-cropping-bottom") {
+		igt_require(gen >= 9);
+		cleanup_crtc(&data);
+		data.planepos[0].origo = p_bottom | p_left;
+		data.planepos[0].x = -.05f;
+		data.planepos[0].y = -.20f;
+		data.planepos[1].origo = p_bottom | p_right;
+		data.planepos[1].x = -.15f;
+		data.planepos[1].y = -.20f;
+		test_multi_plane_rotation(&data, 0);
+	}
+
+	/*
+	 * exhaust-fences should be last test, if it fails we may OOM in
+	 * the following subtests otherwise.
+	 */
+	igt_subtest_f("exhaust-fences") {
+		enum pipe pipe;
+		igt_output_t *output;
+
+		igt_require(gen >= 9);
+		igt_display_require_output(&data.display);
+
+		for_each_pipe_with_valid_output(&data.display, pipe, output) {
+			igt_plane_t *primary = &data.display.pipes[pipe].planes[0];
+
+			test_plane_rotation_exhaust_fences(&data, pipe, output, primary);
+			break;
+		}
+	}
+
+	igt_fixture {
+		igt_display_fini(&data.display);
+	}
+}
-- 
2.25.1

_______________________________________________
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

* Re: [igt-dev] [PATCH] kms_rotation_crc:Add HW rotation test case for amdgpu
       [not found] ` <MN2PR12MB3054150157A5A6E90F904EF997C50@MN2PR12MB3054.namprd12.prod.outlook.com>
@ 2020-12-16 22:43   ` Kim, Sung joon
  0 siblings, 0 replies; 5+ messages in thread
From: Kim, Sung joon @ 2020-12-16 22:43 UTC (permalink / raw)
  To: igt-dev; +Cc: sunpengli


Sorry this didn't send completely. I will send a new set.

-----Original Message-----
From: Kim, Sung joon <Sungjoon.Kim@amd.com> 
Sent: Wednesday, December 16, 2020 5:13 PM
To: igt-dev@lists.freedesktop.org
Cc: Kazlauskas, Nicholas <Nicholas.Kazlauskas@amd.com>; sunpengli@amd.com; Wentland, Harry <Harry.Wentland@amd.com>; Cornij, Nikola <Nikola.Cornij@amd.com>; Kim, Sung joon <Sungjoon.Kim@amd.com>
Subject: [PATCH] kms_rotation_crc:Add HW rotation test case for amdgpu

Added Hw rotation case specifically for amdgpu. Currently, kms_rotation_crc tests intel gpus. Added conditions to bypass all the requirements needed for intel when testing amdgpu.

Signed-off-by: Sung Joon Kim <sungkim@amd.com>
---
 tests/kms_rotation_crc.c | 1971 +++++++++++++++++++-------------------
 1 file changed, 1011 insertions(+), 960 deletions(-)

diff --git a/tests/kms_rotation_crc.c b/tests/kms_rotation_crc.c
index ffcc2cc2..f4f36144 100644
--- a/tests/kms_rotation_crc.c
+++ b/tests/kms_rotation_crc.c
@@ -1,960 +1,1011 @@
-/*
- * Copyright © 2013,2014 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 "igt.h"
-#include "igt_vec.h"
-#include <math.h>
-
-#define MAX_FENCES 32
-#define MAXMULTIPLANESAMOUNT 2
-#define TEST_MAX_WIDTH 640
-#define TEST_MAX_HEIGHT 480
-
-struct p_struct {
-	igt_plane_t *plane;
-	struct igt_fb fb;
-};
-
-enum p_pointorigo {
-	p_top = 1 << 0,
-	p_bottom = 1 << 1,
-	p_left = 1 << 2,
-	p_right = 1 << 3
-};
-
-struct p_point{
-	enum p_pointorigo origo;
-	float_t x;
-	float_t y;
-};
-
-typedef struct {
-	int gfx_fd;
-	igt_display_t display;
-	struct igt_fb fb;
-	struct igt_fb fb_reference;
-	struct igt_fb fb_flip;
-	igt_crc_t ref_crc;
-	igt_crc_t flip_crc;
-	igt_pipe_crc_t *pipe_crc;
-	igt_rotation_t rotation;
-	int pos_x;
-	int pos_y;
-	uint32_t override_fmt;
-	uint64_t override_tiling;
-	int devid;
-
-	struct p_struct *multiplaneoldview;
-	struct p_point planepos[MAXMULTIPLANESAMOUNT];
-
-	bool use_native_resolution;
-	bool extended;
-} data_t;
-
-typedef struct {
-	float r;
-	float g;
-	float b;
-} rgb_color_t;
-
-static void set_color(rgb_color_t *color, float r, float g, float b)
-{
-	color->r = r;
-	color->g = g;
-	color->b = b;
-}
-
-static void rotate_colors(rgb_color_t *tl, rgb_color_t *tr, rgb_color_t *br,
-			  rgb_color_t *bl, igt_rotation_t rotation)
-{
-	rgb_color_t bl_tmp, br_tmp, tl_tmp, tr_tmp;
-
-	if (rotation & IGT_REFLECT_X) {
-		igt_swap(*tl, *tr);
-		igt_swap(*bl, *br);
-	}
-
-	if (rotation & IGT_ROTATION_90) {
-		bl_tmp = *bl;
-		br_tmp = *br;
-		tl_tmp = *tl;
-		tr_tmp = *tr;
-		*tl = tr_tmp;
-		*bl = tl_tmp;
-		*tr = br_tmp;
-		*br = bl_tmp;
-	} else if (rotation & IGT_ROTATION_180) {
-		igt_swap(*tl, *br);
-		igt_swap(*tr, *bl);
-	} else if (rotation & IGT_ROTATION_270) {
-		bl_tmp = *bl;
-		br_tmp = *br;
-		tl_tmp = *tl;
-		tr_tmp = *tr;
-		*tl = bl_tmp;
-		*bl = br_tmp;
-		*tr = tl_tmp;
-		*br = tr_tmp;
-	}
-}
-
-#define RGB_COLOR(color) \
-	color.r, color.g, color.b
-
-static void
-paint_squares(data_t *data, igt_rotation_t rotation,
-	      struct igt_fb *fb, float o)
-{
-	cairo_t *cr;
-	unsigned int w = fb->width;
-	unsigned int h = fb->height;
-	rgb_color_t tl, tr, bl, br;
-
-	igt_assert_f(!(w&1), "rotation image must be even width, now attempted %d\n", w);
-	igt_assert_f(!(h&1), "rotation image must be even height, now attempted %d\n", h);
-
-	cr = igt_get_cairo_ctx(data->gfx_fd, fb);
-
-	set_color(&tl, o, 0.0f, 0.0f);
-	set_color(&tr, 0.0f, o, 0.0f);
-	set_color(&br, o, o, o);
-	set_color(&bl, 0.0f, 0.0f, o);
-
-	rotate_colors(&tl, &tr, &br, &bl, rotation);
-
-	igt_paint_color(cr, 0, 0, w / 2, h / 2, RGB_COLOR(tl));
-	igt_paint_color(cr, w / 2, 0, w / 2, h / 2, RGB_COLOR(tr));
-	igt_paint_color(cr, 0, h / 2, w / 2, h / 2, RGB_COLOR(bl));
-	igt_paint_color(cr, w / 2, h / 2, w / 2, h / 2, RGB_COLOR(br));
-
-	igt_put_cairo_ctx(cr);
-}
-
-static void remove_fbs(data_t *data)
-{
-	igt_remove_fb(data->gfx_fd, &data->fb);
-	igt_remove_fb(data->gfx_fd, &data->fb_reference);
-	igt_remove_fb(data->gfx_fd, &data->fb_flip);
-}
-
-static void cleanup_crtc(data_t *data)
-{
-	igt_display_t *display = &data->display;
-
-	igt_pipe_crc_free(data->pipe_crc);
-	data->pipe_crc = NULL;
-
-	remove_fbs(data);
-
-	igt_display_reset(display);
-}
-
-static void prepare_crtc(data_t *data, igt_output_t *output, enum pipe pipe,
-			 igt_plane_t *plane, bool start_crc)
-{
-	igt_display_t *display = &data->display;
-
-	cleanup_crtc(data);
-
-	igt_output_set_pipe(output, pipe);
-	igt_plane_set_rotation(plane, IGT_ROTATION_0);
-
-	/* create the pipe_crc object for this pipe */
-	igt_pipe_crc_free(data->pipe_crc);
-
-	igt_display_commit2(display, COMMIT_ATOMIC);
-	data->pipe_crc = igt_pipe_crc_new(data->gfx_fd, pipe, INTEL_PIPE_CRC_SOURCE_AUTO);
-
-	if (start_crc)
-		igt_pipe_crc_start(data->pipe_crc);
-}
-
-enum rectangle_type {
-	rectangle,
-	square,
-	portrait,
-	landscape,
-	num_rectangle_types /* must be last */
-};
-
-static void prepare_fbs(data_t *data, igt_output_t *output,
-			igt_plane_t *plane, enum rectangle_type rect, uint32_t format)
-{
-	drmModeModeInfo *mode;
-	igt_display_t *display = &data->display;
-	unsigned int w, h, ref_w, ref_h, min_w, min_h;
-	uint64_t tiling = data->override_tiling ?: LOCAL_DRM_FORMAT_MOD_NONE;
-	uint32_t pixel_format = data->override_fmt ?: DRM_FORMAT_XRGB8888;
-	const float flip_opacity = 0.75;
-
-	remove_fbs(data);
-
-	igt_plane_set_rotation(plane, IGT_ROTATION_0);
-
-	mode = igt_output_get_mode(output);
-	if (plane->type != DRM_PLANE_TYPE_CURSOR) {
-		if (data->use_native_resolution) {
-			w = mode->hdisplay;
-			h = mode->vdisplay;
-		} else {
-			w = min(TEST_MAX_WIDTH, mode->hdisplay);
-			h = min(TEST_MAX_HEIGHT, mode->vdisplay);
-		}
-
-		min_w = 256;
-		min_h = 256;
-	} else {
-		pixel_format = data->override_fmt ?: DRM_FORMAT_ARGB8888;
-
-		w = h = 256;
-		min_w = min_h = 64;
-	}
-
-	switch (rect) {
-	case rectangle:
-		break;
-	case square:
-		w = h = min(h, w);
-		break;
-	case portrait:
-		w = min_w;
-		break;
-	case landscape:
-		h = min_h;
-		break;
-	case num_rectangle_types:
-		igt_assert(0);
-	}
-
-	ref_w = w;
-	ref_h = h;
-
-	/*
-	 * For 90/270, we will use create smaller fb so that the rotated
-	 * frame can fit in
-	 */
-	if (data->rotation & (IGT_ROTATION_90 | IGT_ROTATION_270)) {
-		tiling = data->override_tiling ?: LOCAL_I915_FORMAT_MOD_Y_TILED;
-
-		igt_swap(w, h);
-	}
-
-	/*
-	 * Just try here if requested tiling format is generally available,
-	 * if one format fail it will skip entire subtest.
-	 */
-	igt_require(igt_display_has_format_mod(display, pixel_format, tiling));
-
-	/*
-	 * Create a reference software rotated flip framebuffer.
-	 */
-	igt_create_fb(data->gfx_fd, ref_w, ref_h, pixel_format, tiling,
-		      &data->fb_flip);
-	paint_squares(data, data->rotation, &data->fb_flip,
-		      flip_opacity);
-	igt_plane_set_fb(plane, &data->fb_flip);
-	if (plane->type != DRM_PLANE_TYPE_CURSOR)
-		igt_plane_set_position(plane, data->pos_x, data->pos_y);
-	igt_display_commit2(display, COMMIT_ATOMIC);
-
-	igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &data->flip_crc);
-
-	/*
-	  * Prepare the non-rotated flip fb.
-	  */
-	igt_remove_fb(data->gfx_fd, &data->fb_flip);
-	igt_create_fb(data->gfx_fd, w, h, pixel_format, tiling,
-		      &data->fb_flip);
-	paint_squares(data, IGT_ROTATION_0, &data->fb_flip,
-		      flip_opacity);
-
-	/*
-	 * Create a reference CRC for a software-rotated fb.
-	 */
-	igt_create_fb(data->gfx_fd, ref_w, ref_h, pixel_format,
-		      data->override_tiling ?: LOCAL_DRM_FORMAT_MOD_NONE, &data->fb_reference);
-	paint_squares(data, data->rotation, &data->fb_reference, 1.0);
-
-	igt_plane_set_fb(plane, &data->fb_reference);
-	if (plane->type != DRM_PLANE_TYPE_CURSOR)
-		igt_plane_set_position(plane, data->pos_x, data->pos_y);
-	igt_display_commit2(display, COMMIT_ATOMIC);
-
-	igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &data->ref_crc);
-
-	/*
-	 * Prepare the plane with an non-rotated fb let the hw rotate it.
-	 */
-	igt_create_fb(data->gfx_fd, w, h, pixel_format, tiling, &data->fb);
-	paint_squares(data, IGT_ROTATION_0, &data->fb, 1.0);
-	igt_plane_set_fb(plane, &data->fb);
-
-	if (plane->type != DRM_PLANE_TYPE_CURSOR)
-		igt_plane_set_position(plane, data->pos_x, data->pos_y);
-}
-
-static void test_single_case(data_t *data, enum pipe pipe,
-			     igt_output_t *output, igt_plane_t *plane,
-			     enum rectangle_type rect,
-			     uint32_t format, bool test_bad_format)
-{
-	igt_display_t *display = &data->display;
-	igt_crc_t crc_output;
-	int ret;
-
-	igt_debug("Testing case %i on pipe %s, format %s\n", rect, kmstest_pipe_name(pipe), igt_format_str(format));
-	prepare_fbs(data, output, plane, rect, format);
-
-	igt_plane_set_rotation(plane, data->rotation);
-	if (data->rotation & (IGT_ROTATION_90 | IGT_ROTATION_270))
-		igt_plane_set_size(plane, data->fb.height, data->fb.width);
-
-	ret = igt_display_try_commit2(display, COMMIT_ATOMIC);
-	if (test_bad_format) {
-		igt_assert_eq(ret, -EINVAL);
-		return;
-	}
-
-	/* Verify commit was ok. */
-	igt_assert_eq(ret, 0);
-
-	/* Check CRC */
-	igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &crc_output);
-	igt_assert_crc_equal(&data->ref_crc, &crc_output);
-
-	/*
-	 * If flips are requested flip to a different fb and
-	 * check CRC against that one as well.
-	 */
-	if (data->fb_flip.fb_id) {
-		igt_plane_set_fb(plane, &data->fb_flip);
-		if (data->rotation == IGT_ROTATION_90 || data->rotation == IGT_ROTATION_270)
-			igt_plane_set_size(plane, data->fb.height, data->fb.width);
-
-		if (plane->type != DRM_PLANE_TYPE_PRIMARY) {
-			igt_display_commit_atomic(display, DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK, NULL);
-		} else {
-			ret = drmModePageFlip(data->gfx_fd,
-					output->config.crtc->crtc_id,
-					data->fb_flip.fb_id,
-					DRM_MODE_PAGE_FLIP_EVENT,
-					NULL);
-			igt_assert_eq(ret, 0);
-		}
-		kmstest_wait_for_pageflip(data->gfx_fd);
-		igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &crc_output);
-		igt_assert_crc_equal(&data->flip_crc,
-				     &crc_output);
-	}
-}
-
-static bool test_format(data_t *data,
-			struct igt_vec *tested_formats,
-			uint32_t format)
-{
-	if (!igt_fb_supported_format(format))
-		return false;
-
-	if (!is_i915_device(data->gfx_fd) ||
-	    data->extended)
-		return true;
-
-	format = igt_reduce_format(format);
-
-	/* only test each format "class" once */
-	if (igt_vec_index(tested_formats, &format) >= 0)
-		return false;
-
-	igt_vec_push(tested_formats, &format);
-
-	return true;
-}
-
-static void test_plane_rotation(data_t *data, int plane_type, bool test_bad_format)
-{
-	igt_display_t *display = &data->display;
-	igt_output_t *output;
-	enum pipe pipe;
-
-	if (plane_type == DRM_PLANE_TYPE_CURSOR)
-		igt_require(display->has_cursor_plane);
-
-	igt_display_require_output(display);
-
-	for_each_pipe_with_valid_output(display, pipe, output) {
-		igt_plane_t *plane;
-		int i, j;
-
-		if (IS_CHERRYVIEW(data->devid) && pipe != PIPE_B)
-			continue;
-
-		igt_output_set_pipe(output, pipe);
-
-		plane = igt_output_get_plane_type(output, plane_type);
-		igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));
-
-		prepare_crtc(data, output, pipe, plane, true);
-
-		for (i = 0; i < num_rectangle_types; i++) {
-			/* Unsupported on i915 */
-			if (plane_type == DRM_PLANE_TYPE_CURSOR &&
-			    i != square)
-				continue;
-
-			/* Only support partial covering primary plane on gen9+ */
-			if (plane_type == DRM_PLANE_TYPE_PRIMARY &&
-			    intel_gen(intel_get_drm_devid(data->gfx_fd)) < 9) {
-				if (i != rectangle)
-					continue;
-				else
-					data->use_native_resolution = true;
-			} else {
-				data->use_native_resolution = false;
-			}
-
-			if (!data->override_fmt) {
-				struct igt_vec tested_formats;
-
-				igt_vec_init(&tested_formats, sizeof(uint32_t));
-
-				for (j = 0; j < plane->drm_plane->count_formats; j++) {
-					uint32_t format = plane->drm_plane->formats[j];
-
-					if (!test_format(data, &tested_formats, format))
-						continue;
-
-					test_single_case(data, pipe, output, plane, i,
-							 format, test_bad_format);
-				}
-
-				igt_vec_fini(&tested_formats);
-			} else {
-				test_single_case(data, pipe, output, plane, i,
-						 data->override_fmt, test_bad_format);
-			}
-		}
-		igt_pipe_crc_stop(data->pipe_crc);
-	}
-}
-
-typedef struct {
-	int32_t x1, y1;
-	uint64_t width, height, tiling, planetype, format;
-	igt_rotation_t rotation_sw, rotation_hw;
-} planeinfos;
-
-static bool get_multiplane_crc(data_t *data, igt_output_t *output,
-			       igt_crc_t *crc_output, planeinfos *planeinfo,
-			       int numplanes)
-{
-	uint32_t w, h;
-	igt_display_t *display = &data->display;
-	struct p_struct *planes, *oldplanes;
-	int c, ret;
-
-	oldplanes = data->multiplaneoldview;
-	planes = calloc(sizeof(*planes), numplanes);
-
-	for (c = 0; c < numplanes; c++) {
-		planes[c].plane = igt_output_get_plane_type(output,
-							    planeinfo[c].planetype);
-
-		/*
-		 * make plane and fb width and height always divisible by 4
-		 * due to NV12 support and Intel hw workarounds.
-		 */
-		w = planeinfo[c].width & ~3;
-		h = planeinfo[c].height & ~3;
-
-		if (planeinfo[c].rotation_sw & (IGT_ROTATION_90 | IGT_ROTATION_270))
-			igt_swap(w, h);
-
-		if (!igt_plane_has_format_mod(planes[c].plane,
-					      planeinfo[c].format,
-					      planeinfo[c].tiling))
-			return false;
-
-		igt_create_fb(data->gfx_fd, w, h, planeinfo[c].format,
-			      planeinfo[c].tiling, &planes[c].fb);
-
-		paint_squares(data, planeinfo[c].rotation_sw, &planes[c].fb, 1.0f);
-		igt_plane_set_fb(planes[c].plane, &planes[c].fb);
-
-		if (planeinfo[c].rotation_hw & (IGT_ROTATION_90 | IGT_ROTATION_270))
-			igt_plane_set_size(planes[c].plane, h, w);
-
-		igt_plane_set_position(planes[c].plane, planeinfo[c].x1, planeinfo[c].y1);
-		igt_plane_set_rotation(planes[c].plane, planeinfo[c].rotation_hw);
-	}
-
-	ret = igt_display_try_commit2(display, COMMIT_ATOMIC);
-	igt_assert_eq(ret, 0);
-
-	igt_pipe_crc_get_current(data->gfx_fd, data->pipe_crc, crc_output);
-
-	for (c = 0; c < numplanes && oldplanes; c++)
-		igt_remove_fb(data->gfx_fd, &oldplanes[c].fb);
-
-	free(oldplanes);
-	data->multiplaneoldview = (void*)planes;
-	return true;
-}
-
-static void pointlocation(data_t *data, planeinfos *p, drmModeModeInfo *mode,
-			  int c)
-{
-	if (data->planepos[c].origo & p_right) {
-		p[c].x1 = (int32_t)(data->planepos[c].x * min(TEST_MAX_WIDTH, mode->hdisplay)
-				+ mode->hdisplay);
-		p[c].x1 &= ~3;
-		/*
-		 * At this point is handled surface on right side. If display
-		 * mode is not divisible by 4 but with 2 point location is
-		 * fixed to match requirements. Because of YUV planes here is
-		 * intentionally ignored bit 1.
-		 */
-		p[c].x1 -= mode->hdisplay & 2;
-	} else {
-		p[c].x1 = (int32_t)(data->planepos[c].x * min(TEST_MAX_WIDTH, mode->hdisplay));
-		p[c].x1 &= ~3;
-	}
-
-	if (data->planepos[c].origo & p_bottom) {
-		p[c].y1 = (int32_t)(data->planepos[c].y * min(TEST_MAX_HEIGHT, mode->vdisplay)
-				+ mode->vdisplay);
-		p[c].y1 &= ~3;
-		p[c].y1 -= mode->vdisplay & 2;
-	} else {
-		p[c].y1 = (int32_t)(data->planepos[c].y * min(TEST_MAX_HEIGHT, mode->vdisplay));
-		p[c].y1 &= ~3;
-	}
-}
-
-/*
- * Here is pipe parameter which is now used only for first pipe.
- * It is left here if this test ever was wanted to be run on
- * different pipes.
- */
-static void test_multi_plane_rotation(data_t *data, enum pipe pipe)
-{
-	igt_display_t *display = &data->display;
-	igt_output_t *output;
-	igt_crc_t retcrc_sw, retcrc_hw;
-	planeinfos p[2];
-	int c, used_w, used_h;
-	struct p_struct *oldplanes;
-	drmModeModeInfo *mode;
-
-	static const struct {
-		igt_rotation_t rotation;
-		float_t width;
-		float_t height;
-		uint64_t tiling;
-	} planeconfigs[] = {
-	{IGT_ROTATION_0, .2f, .4f, LOCAL_DRM_FORMAT_MOD_NONE },
-	{IGT_ROTATION_0, .2f, .4f, LOCAL_I915_FORMAT_MOD_X_TILED },
-	{IGT_ROTATION_0, .2f, .4f, LOCAL_I915_FORMAT_MOD_Y_TILED },
-	{IGT_ROTATION_0, .2f, .4f, LOCAL_I915_FORMAT_MOD_Yf_TILED },
-	{IGT_ROTATION_90, .2f, .4f, LOCAL_I915_FORMAT_MOD_Y_TILED },
-	{IGT_ROTATION_90, .2f, .4f, LOCAL_I915_FORMAT_MOD_Yf_TILED },
-	{IGT_ROTATION_180, .2f, .4f, LOCAL_DRM_FORMAT_MOD_NONE },
-	{IGT_ROTATION_180, .2f, .4f, LOCAL_I915_FORMAT_MOD_X_TILED },
-	{IGT_ROTATION_180, .2f, .4f, LOCAL_I915_FORMAT_MOD_Y_TILED },
-	{IGT_ROTATION_180, .2f, .4f, LOCAL_I915_FORMAT_MOD_Yf_TILED },
-	{IGT_ROTATION_270, .2f, .4f, LOCAL_I915_FORMAT_MOD_Y_TILED },
-	{IGT_ROTATION_270, .2f, .4f, LOCAL_I915_FORMAT_MOD_Yf_TILED },
-	};
-
-	/*
-	* These are those modes which are tested. For testing feel interesting
-	* case with tiling are 2 bpp, 4 bpp and NV12.
-	*/
-	static const uint32_t formatlist[] = {DRM_FORMAT_RGB565,
-		DRM_FORMAT_XRGB8888, DRM_FORMAT_NV12};
-
-	for_each_valid_output_on_pipe(display, pipe, output) {
-		int i, j, k, l;
-		igt_output_set_pipe(output, pipe);
-		mode = igt_output_get_mode(output);
-		igt_display_require_output(display);
-		igt_display_commit2(display, COMMIT_ATOMIC);
-
-		used_w = min(TEST_MAX_WIDTH, mode->hdisplay);
-		used_h = min(TEST_MAX_HEIGHT, mode->vdisplay);
-
-		data->pipe_crc = igt_pipe_crc_new(data->gfx_fd, pipe,
-						  INTEL_PIPE_CRC_SOURCE_AUTO);
-		igt_pipe_crc_start(data->pipe_crc);
-
-		for (i = 0; i < ARRAY_SIZE(planeconfigs); i++) {
-			p[0].planetype = DRM_PLANE_TYPE_PRIMARY;
-			p[0].width = (uint64_t)(planeconfigs[i].width * used_w);
-			p[0].height = (uint64_t)(planeconfigs[i].height * used_h);
-			p[0].tiling = planeconfigs[i].tiling;
-			pointlocation(data, (planeinfos *)&p, mode, 0);
-
-			for (k = 0; k < ARRAY_SIZE(formatlist); k++) {
-				p[0].format = formatlist[k];
-
-				for (j = 0; j < ARRAY_SIZE(planeconfigs); j++) {
-					p[1].planetype = DRM_PLANE_TYPE_OVERLAY;
-					p[1].width = (uint64_t)(planeconfigs[j].width * used_w);
-					p[1].height = (uint64_t)(planeconfigs[j].height * used_h);
-					p[1].tiling = planeconfigs[j].tiling;
-					pointlocation(data, (planeinfos *)&p,
-						      mode, 1);
-
-					for (l = 0; l < ARRAY_SIZE(formatlist); l++) {
-						p[1].format = formatlist[l];
-
-						/*
-						 * RGB565 90/270 degrees rotation is supported
-						 * from gen11 onwards.
-						 */
-						if (p[0].format == DRM_FORMAT_RGB565 &&
-						     (planeconfigs[i].rotation & (IGT_ROTATION_90 | IGT_ROTATION_270))
-						     && intel_gen(data->devid) < 11)
-							continue;
-
-						if (p[1].format == DRM_FORMAT_RGB565 &&
-						     (planeconfigs[j].rotation & (IGT_ROTATION_90 | IGT_ROTATION_270))
-						     && intel_gen(data->devid) < 11)
-							continue;
-
-						p[0].rotation_sw = planeconfigs[i].rotation;
-						p[0].rotation_hw = IGT_ROTATION_0;
-						p[1].rotation_sw = planeconfigs[j].rotation;
-						p[1].rotation_hw = IGT_ROTATION_0;
-						if (!get_multiplane_crc(data, output, &retcrc_sw,
-								   (planeinfos *)&p, MAXMULTIPLANESAMOUNT))
-							continue;
-
-						igt_swap(p[0].rotation_sw, p[0].rotation_hw);
-						igt_swap(p[1].rotation_sw, p[1].rotation_hw);
-						if (!get_multiplane_crc(data, output, &retcrc_hw,
-								   (planeinfos *)&p, MAXMULTIPLANESAMOUNT))
-							continue;
-
-						igt_assert_crc_equal(&retcrc_sw, &retcrc_hw);
-					}
-				}
-			}
-		}
-		igt_pipe_crc_stop(data->pipe_crc);
-		igt_pipe_crc_free(data->pipe_crc);
-		igt_output_set_pipe(output, PIPE_ANY);
-	}
-
-	/*
-	* Old fbs are deleted only after new ones are set on planes.
-	* This is done to speed up the test
-	*/
-	oldplanes = data->multiplaneoldview;
-	for (c = 0; c < MAXMULTIPLANESAMOUNT && oldplanes; c++)
-		igt_remove_fb(data->gfx_fd, &oldplanes[c].fb);
-
-	free(oldplanes);
-	data->multiplaneoldview = NULL;
-	data->pipe_crc = NULL;
-}
-
-static void test_plane_rotation_exhaust_fences(data_t *data,
-					       enum pipe pipe,
-					       igt_output_t *output,
-					       igt_plane_t *plane)
-{
-	igt_display_t *display = &data->display;
-	uint64_t tiling = LOCAL_I915_FORMAT_MOD_Y_TILED;
-	uint32_t format = DRM_FORMAT_XRGB8888;
-	int fd = data->gfx_fd;
-	drmModeModeInfo *mode;
-	struct igt_fb fb[MAX_FENCES+1] = {};
-	uint64_t size;
-	unsigned int stride, w, h;
-	uint64_t total_aperture_size, total_fbs_size;
-	int i;
-
-	igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));
-
-	prepare_crtc(data, output, pipe, plane, false);
-
-	mode = igt_output_get_mode(output);
-	w = mode->hdisplay;
-	h = mode->vdisplay;
-
-	igt_calc_fb_size(fd, w, h, format, tiling, &size, &stride);
-
-	/*
-	 * Make sure there is atleast 90% of the available GTT space left
-	 * for creating (MAX_FENCES+1) framebuffers.
-	 */
-	total_fbs_size = size * (MAX_FENCES + 1);
-	total_aperture_size = gem_available_aperture_size(fd);
-	igt_require(total_fbs_size < total_aperture_size * 0.9);
-
-	for (i = 0; i < MAX_FENCES + 1; i++) {
-		igt_create_fb(fd, w, h, format, tiling, &fb[i]);
-
-		igt_plane_set_fb(plane, &fb[i]);
-		igt_plane_set_rotation(plane, IGT_ROTATION_0);
-		igt_display_commit2(display, COMMIT_ATOMIC);
-
-		igt_plane_set_rotation(plane, IGT_ROTATION_90);
-		igt_plane_set_size(plane, h, w);
-		igt_display_commit2(display, COMMIT_ATOMIC);
-	}
-
-	for (i = 0; i < MAX_FENCES + 1; i++)
-		igt_remove_fb(fd, &fb[i]);
-}
-
-static const char *plane_test_str(unsigned plane)
-{
-	switch (plane) {
-	case DRM_PLANE_TYPE_PRIMARY:
-		return "primary";
-	case DRM_PLANE_TYPE_OVERLAY:
-		return "sprite";
-	case DRM_PLANE_TYPE_CURSOR:
-		return "cursor";
-	default:
-		igt_assert(0);
-	}
-}
-
-static const char *rot_test_str(igt_rotation_t rot)
-{
-	switch (rot) {
-	case IGT_ROTATION_0:
-		return "0";
-	case IGT_ROTATION_90:
-		return "90";
-	case IGT_ROTATION_180:
-		return "180";
-	case IGT_ROTATION_270:
-		return "270";
-	default:
-		igt_assert(0);
-	}
-}
-
-static const char *tiling_test_str(uint64_t tiling)
-{
-	switch (tiling) {
-	case LOCAL_I915_FORMAT_MOD_X_TILED:
-		return "x-tiled";
-	case LOCAL_I915_FORMAT_MOD_Y_TILED:
-		return "y-tiled";
-	case LOCAL_I915_FORMAT_MOD_Yf_TILED:
-		return "yf-tiled";
-	default:
-		igt_assert(0);
-	}
-}
-
-static int opt_handler(int opt, int opt_index, void *_data)
-{
-	data_t *data = _data;
-
-	switch (opt) {
-	case 'e':
-		data->extended = true;
-		break;
-	}
-
-	return IGT_OPT_HANDLER_SUCCESS;
-}
-
-static const struct option long_opts[] = {
-	{ .name = "extended", .has_arg = false, .val = 'e', },
-	{}
-};
-
-static const char help_str[] =
-	"  --extended\t\tRun the extended tests\n";
-
-static data_t data;
-
-igt_main_args("", long_opts, help_str, opt_handler, &data)
-{
-	struct rot_subtest {
-		unsigned plane;
-		igt_rotation_t rot;
-	} *subtest, subtests[] = {
-		{ DRM_PLANE_TYPE_PRIMARY, IGT_ROTATION_90 },
-		{ DRM_PLANE_TYPE_PRIMARY, IGT_ROTATION_180 },
-		{ DRM_PLANE_TYPE_PRIMARY, IGT_ROTATION_270 },
-		{ DRM_PLANE_TYPE_OVERLAY, IGT_ROTATION_90 },
-		{ DRM_PLANE_TYPE_OVERLAY, IGT_ROTATION_180 },
-		{ DRM_PLANE_TYPE_OVERLAY, IGT_ROTATION_270 },
-		{ DRM_PLANE_TYPE_CURSOR, IGT_ROTATION_180 },
-		{ 0, 0}
-	};
-
-	struct reflect_x {
-		uint64_t tiling;
-		igt_rotation_t rot;
-	} *reflect_x, reflect_x_subtests[] = {
-		{ LOCAL_I915_FORMAT_MOD_X_TILED, IGT_ROTATION_0 },
-		{ LOCAL_I915_FORMAT_MOD_X_TILED, IGT_ROTATION_180 },
-		{ LOCAL_I915_FORMAT_MOD_Y_TILED, IGT_ROTATION_0 },
-		{ LOCAL_I915_FORMAT_MOD_Y_TILED, IGT_ROTATION_90 },
-		{ LOCAL_I915_FORMAT_MOD_Y_TILED, IGT_ROTATION_180 },
-		{ LOCAL_I915_FORMAT_MOD_Y_TILED, IGT_ROTATION_270 },
-		{ LOCAL_I915_FORMAT_MOD_Yf_TILED, IGT_ROTATION_0 },
-		{ LOCAL_I915_FORMAT_MOD_Yf_TILED, IGT_ROTATION_90 },
-		{ LOCAL_I915_FORMAT_MOD_Yf_TILED, IGT_ROTATION_180 },
-		{ LOCAL_I915_FORMAT_MOD_Yf_TILED, IGT_ROTATION_270 },
-		{ 0, 0 }
-	};
-
-	int gen = 0;
-
-	igt_fixture {
-		data.gfx_fd = drm_open_driver_master(DRIVER_INTEL);
-		data.devid = intel_get_drm_devid(data.gfx_fd);
-		gen = intel_gen(data.devid);
-
-		kmstest_set_vt_graphics_mode();
-
-		igt_require_pipe_crc(data.gfx_fd);
-
-		igt_display_require(&data.display, data.gfx_fd);
-		igt_require(data.display.is_atomic);
-	}
-
-	for (subtest = subtests; subtest->rot; subtest++) {
-		igt_subtest_f("%s-rotation-%s",
-			      plane_test_str(subtest->plane),
-			      rot_test_str(subtest->rot)) {
-			igt_require(!(subtest->rot &
-				    (IGT_ROTATION_90 | IGT_ROTATION_270)) ||
-				    gen >= 9);
-			data.rotation = subtest->rot;
-			test_plane_rotation(&data, subtest->plane, false);
-		}
-	}
-
-	igt_subtest_f("sprite-rotation-90-pos-100-0") {
-		igt_require(gen >= 9);
-		data.rotation = IGT_ROTATION_90;
-		data.pos_x = 100,
-		data.pos_y = 0;
-		test_plane_rotation(&data, DRM_PLANE_TYPE_OVERLAY, false);
-	}
-	data.pos_x = 0,
-	data.pos_y = 0;
-
-	igt_subtest_f("bad-pixel-format") {
-		 /* gen11 enables RGB565 rotation for 90/270 degrees.
-		  * so apart from this, any other gen11+ pixel format
-		  * can be used which doesn't support 90/270 degree
-		  * rotation */
-		igt_require(gen >= 9);
-		data.rotation = IGT_ROTATION_90;
-		data.override_fmt = gen < 11 ? DRM_FORMAT_RGB565 : DRM_FORMAT_Y212;
-		test_plane_rotation(&data, DRM_PLANE_TYPE_PRIMARY, true);
-	}
-	data.override_fmt = 0;
-
-	igt_subtest_f("bad-tiling") {
-		igt_require(gen >= 9);
-		data.rotation = IGT_ROTATION_90;
-		data.override_tiling = LOCAL_I915_FORMAT_MOD_X_TILED;
-		test_plane_rotation(&data, DRM_PLANE_TYPE_PRIMARY, true);
-	}
-	data.override_tiling = 0;
-
-	for (reflect_x = reflect_x_subtests; reflect_x->tiling; reflect_x++) {
-		igt_subtest_f("primary-%s-reflect-x-%s",
-			      tiling_test_str(reflect_x->tiling),
-			      rot_test_str(reflect_x->rot)) {
-			igt_require(gen >= 10 ||
-				    (IS_CHERRYVIEW(data.devid) && reflect_x->rot == IGT_ROTATION_0
-				     && reflect_x->tiling == LOCAL_I915_FORMAT_MOD_X_TILED));
-			data.rotation = (IGT_REFLECT_X | reflect_x->rot);
-			data.override_tiling = reflect_x->tiling;
-			test_plane_rotation(&data, DRM_PLANE_TYPE_PRIMARY, false);
-		}
-	}
-
-	igt_subtest_f("multiplane-rotation") {
-		igt_require(gen >= 9);
-		cleanup_crtc(&data);
-		data.planepos[0].origo = p_top | p_left;
-		data.planepos[0].x = .2f;
-		data.planepos[0].y = .1f;
-		data.planepos[1].origo = p_top | p_right;
-		data.planepos[1].x = -.4f;
-		data.planepos[1].y = .1f;
-		test_multi_plane_rotation(&data, 0);
-	}
-
-	igt_subtest_f("multiplane-rotation-cropping-top") {
-		igt_require(gen >= 9);
-		cleanup_crtc(&data);
-		data.planepos[0].origo = p_top | p_left;
-		data.planepos[0].x = -.05f;
-		data.planepos[0].y = -.15f;
-		data.planepos[1].origo = p_top | p_right;
-		data.planepos[1].x = -.15f;
-		data.planepos[1].y = -.15f;
-		test_multi_plane_rotation(&data, 0);
-	}
-
-	igt_subtest_f("multiplane-rotation-cropping-bottom") {
-		igt_require(gen >= 9);
-		cleanup_crtc(&data);
-		data.planepos[0].origo = p_bottom | p_left;
-		data.planepos[0].x = -.05f;
-		data.planepos[0].y = -.20f;
-		data.planepos[1].origo = p_bottom | p_right;
-		data.planepos[1].x = -.15f;
-		data.planepos[1].y = -.20f;
-		test_multi_plane_rotation(&data, 0);
-	}
-
-	/*
-	 * exhaust-fences should be last test, if it fails we may OOM in
-	 * the following subtests otherwise.
-	 */
-	igt_subtest_f("exhaust-fences") {
-		enum pipe pipe;
-		igt_output_t *output;
-
-		igt_require(gen >= 9);
-		igt_display_require_output(&data.display);
-
-		for_each_pipe_with_valid_output(&data.display, pipe, output) {
-			igt_plane_t *primary = &data.display.pipes[pipe].planes[0];
-
-			test_plane_rotation_exhaust_fences(&data, pipe, output, primary);
-			break;
-		}
-	}
-
-	igt_fixture {
-		igt_display_fini(&data.display);
-	}
-}
+/*

+ * Copyright © 2013,2014 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 "igt.h"

+#include "igt_vec.h"

+#include <math.h>

+

+#define MAX_FENCES 32

+#define MAXMULTIPLANESAMOUNT 2

+#define TEST_MAX_WIDTH 640

+#define TEST_MAX_HEIGHT 480

+

+struct p_struct {

+	igt_plane_t *plane;

+	struct igt_fb fb;

+};

+

+enum p_pointorigo {

+	p_top = 1 << 0,

+	p_bottom = 1 << 1,

+	p_left = 1 << 2,

+	p_right = 1 << 3

+};

+

+struct p_point{

+	enum p_pointorigo origo;

+	float_t x;

+	float_t y;

+};

+

+typedef struct {

+	int gfx_fd;

+	igt_display_t display;

+	struct igt_fb fb;

+	struct igt_fb fb_reference;

+	struct igt_fb fb_flip;

+	igt_crc_t ref_crc;

+	igt_crc_t flip_crc;

+	igt_pipe_crc_t *pipe_crc;

+	igt_rotation_t rotation;

+	int pos_x;

+	int pos_y;

+	uint32_t override_fmt;

+	uint64_t override_tiling;

+	int devid;

+

+	struct p_struct *multiplaneoldview;

+	struct p_point planepos[MAXMULTIPLANESAMOUNT];

+

+	bool use_native_resolution;

+	bool extended;

+} data_t;

+

+typedef struct {

+	float r;

+	float g;

+	float b;

+} rgb_color_t;

+

+static void set_color(rgb_color_t *color, float r, float g, float b)

+{

+	color->r = r;

+	color->g = g;

+	color->b = b;

+}

+

+static void rotate_colors(rgb_color_t *tl, rgb_color_t *tr, rgb_color_t *br,

+			  rgb_color_t *bl, igt_rotation_t rotation)

+{

+	rgb_color_t bl_tmp, br_tmp, tl_tmp, tr_tmp;

+

+	if (rotation & IGT_REFLECT_X) {

+		igt_swap(*tl, *tr);

+		igt_swap(*bl, *br);

+	}

+

+	if (rotation & IGT_ROTATION_90) {

+		bl_tmp = *bl;

+		br_tmp = *br;

+		tl_tmp = *tl;

+		tr_tmp = *tr;

+		*tl = tr_tmp;

+		*bl = tl_tmp;

+		*tr = br_tmp;

+		*br = bl_tmp;

+	} else if (rotation & IGT_ROTATION_180) {

+		igt_swap(*tl, *br);

+		igt_swap(*tr, *bl);

+	} else if (rotation & IGT_ROTATION_270) {

+		bl_tmp = *bl;

+		br_tmp = *br;

+		tl_tmp = *tl;

+		tr_tmp = *tr;

+		*tl = bl_tmp;

+		*bl = br_tmp;

+		*tr = tl_tmp;

+		*br = tr_tmp;

+	}

+}

+

+#define RGB_COLOR(color) \

+	color.r, color.g, color.b

+

+static void

+paint_squares(data_t *data, igt_rotation_t rotation,

+	      struct igt_fb *fb, float o)

+{

+	cairo_t *cr;

+	unsigned int w = fb->width;

+	unsigned int h = fb->height;

+	rgb_color_t tl, tr, bl, br;

+

+	igt_assert_f(!(w&1), "rotation image must be even width, now attempted %d\n", w);

+	igt_assert_f(!(h&1), "rotation image must be even height, now attempted %d\n", h);

+

+	cr = igt_get_cairo_ctx(data->gfx_fd, fb);

+

+	set_color(&tl, o, 0.0f, 0.0f);

+	set_color(&tr, 0.0f, o, 0.0f);

+	set_color(&br, o, o, o);

+	set_color(&bl, 0.0f, 0.0f, o);

+

+	rotate_colors(&tl, &tr, &br, &bl, rotation);

+

+	igt_paint_color(cr, 0, 0, w / 2, h / 2, RGB_COLOR(tl));

+	igt_paint_color(cr, w / 2, 0, w / 2, h / 2, RGB_COLOR(tr));

+	igt_paint_color(cr, 0, h / 2, w / 2, h / 2, RGB_COLOR(bl));

+	igt_paint_color(cr, w / 2, h / 2, w / 2, h / 2, RGB_COLOR(br));

+

+	igt_put_cairo_ctx(cr);

+}

+

+static void remove_fbs(data_t *data)

+{

+	igt_remove_fb(data->gfx_fd, &data->fb);

+	igt_remove_fb(data->gfx_fd, &data->fb_reference);

+	igt_remove_fb(data->gfx_fd, &data->fb_flip);

+}

+

+static void cleanup_crtc(data_t *data)

+{

+	igt_display_t *display = &data->display;

+

+	igt_pipe_crc_free(data->pipe_crc);

+	data->pipe_crc = NULL;

+

+	remove_fbs(data);

+

+	igt_display_reset(display);

+}

+

+static void prepare_crtc(data_t *data, igt_output_t *output, enum pipe pipe,

+			 igt_plane_t *plane, bool start_crc)

+{

+	igt_display_t *display = &data->display;

+

+	cleanup_crtc(data);

+

+	igt_output_set_pipe(output, pipe);

+	igt_plane_set_rotation(plane, IGT_ROTATION_0);

+

+	/* create the pipe_crc object for this pipe */

+	igt_pipe_crc_free(data->pipe_crc);

+

+	if (is_amdgpu_device(data->gfx_fd)) {

+		igt_fb_t fb_temp;

+

+		igt_create_fb(data->gfx_fd, 1280, 800, DRM_FORMAT_XRGB8888, 0, &fb_temp);

+		igt_plane_set_fb(plane, &fb_temp);

+	}

+	igt_display_commit2(display, COMMIT_ATOMIC);

+	data->pipe_crc = igt_pipe_crc_new(data->gfx_fd, pipe, INTEL_PIPE_CRC_SOURCE_AUTO);

+

+	if (start_crc)

+		igt_pipe_crc_start(data->pipe_crc);

+}

+

+enum rectangle_type {

+	rectangle,

+	square,

+	portrait,

+	landscape,

+	num_rectangle_types /* must be last */

+};

+

+static void prepare_fbs(data_t *data, igt_output_t *output,

+			igt_plane_t *plane, enum rectangle_type rect, uint32_t format)

+{

+	drmModeModeInfo *mode;

+	igt_display_t *display = &data->display;

+	unsigned int w, h, ref_w, ref_h, min_w, min_h;

+	uint64_t tiling = data->override_tiling ?: LOCAL_DRM_FORMAT_MOD_NONE;

+	uint32_t pixel_format = data->override_fmt ?: DRM_FORMAT_XRGB8888;

+	const float flip_opacity = 0.75;

+	bool amd_gpu = is_amdgpu_device(data->gfx_fd);

+	bool intel_gpu = is_i915_device(data->gfx_fd);

+

+	remove_fbs(data);

+

+	igt_plane_set_rotation(plane, IGT_ROTATION_0);

+

+	mode = igt_output_get_mode(output);

+	if (plane->type != DRM_PLANE_TYPE_CURSOR) {

+		if (amd_gpu) {

+			w = mode->hdisplay;

+			h = mode->vdisplay;

+		} else if (intel_gpu) {

+			if (data->use_native_resolution) {

+				w = mode->hdisplay;

+				h = mode->vdisplay;

+			} else {

+				w = min(TEST_MAX_WIDTH, mode->hdisplay);

+				h = min(TEST_MAX_HEIGHT, mode->vdisplay);

+			}

+

+			min_w = 256;

+			min_h = 256;

+		}

+	} else {

+		pixel_format = data->override_fmt ?: DRM_FORMAT_ARGB8888;

+

+		w = h = 256;

+		min_w = min_h = 64;

+	}

+

+	switch (rect) {

+	case rectangle:

+		break;

+	case square:

+		w = h = min(h, w);

+		break;

+	case portrait:

+		w = min_w;

+		break;

+	case landscape:

+		h = min_h;

+		break;

+	case num_rectangle_types:

+		igt_assert(0);

+	}

+

+	ref_w = w;

+	ref_h = h;

+

+	/*

+	 * For 90/270, we will use create smaller fb so that the rotated

+	 * frame can fit in

+	 */

+	if (data->rotation & (IGT_ROTATION_90 | IGT_ROTATION_270)) {

+		if (intel_gpu)

+			tiling = data->override_tiling ?: LOCAL_I915_FORMAT_MOD_Y_TILED;

+

+		igt_swap(w, h);

+	}

+

+	/*

+	 * Just try here if requested tiling format is generally available,

+	 * if one format fail it will skip entire subtest.

+	 */

+	igt_require(igt_display_has_format_mod(display, pixel_format, tiling));

+

+	if (intel_gpu) {

+		/*

+		 * Create a reference software rotated flip framebuffer.

+		 */

+		igt_create_fb(data->gfx_fd, ref_w, ref_h, pixel_format, tiling,

+			      &data->fb_flip);

+		paint_squares(data, data->rotation, &data->fb_flip,

+			      flip_opacity);

+		igt_plane_set_fb(plane, &data->fb_flip);

+		if (plane->type != DRM_PLANE_TYPE_CURSOR)

+			igt_plane_set_position(plane, data->pos_x, data->pos_y);

+		igt_display_commit2(display, COMMIT_ATOMIC);

+

+		igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &data->flip_crc);

+

+		/*

+		  * Prepare the non-rotated flip fb.

+		  */

+		igt_remove_fb(data->gfx_fd, &data->fb_flip);

+		igt_create_fb(data->gfx_fd, w, h, pixel_format, tiling,

+			      &data->fb_flip);

+		paint_squares(data, IGT_ROTATION_0, &data->fb_flip,

+			      flip_opacity);

+

+		/*

+		 * Create a reference CRC for a software-rotated fb.

+		 */

+		igt_create_fb(data->gfx_fd, ref_w, ref_h, pixel_format,

+			      data->override_tiling ?: LOCAL_DRM_FORMAT_MOD_NONE, &data->fb_reference);

+	} else if (amd_gpu) {

+		tiling = 0x1900;

+		igt_create_fb(data->gfx_fd, ref_w, ref_h, pixel_format,

+				  tiling, &data->fb_reference);

+	}

+	paint_squares(data, data->rotation, &data->fb_reference, 1.0);

+

+	igt_plane_set_fb(plane, &data->fb_reference);

+	if (plane->type != DRM_PLANE_TYPE_CURSOR)

+		igt_plane_set_position(plane, data->pos_x, data->pos_y);

+	igt_display_commit2(display, COMMIT_ATOMIC);

+

+	if (intel_gpu)

+		igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &data->ref_crc);

+	else if (amd_gpu)

+		igt_pipe_crc_collect_crc(data->pipe_crc, &data->ref_crc);

+

+	/*

+	 * Prepare the plane with an non-rotated fb let the hw rotate it.

+	 */

+	igt_create_fb(data->gfx_fd, w, h, pixel_format, tiling, &data->fb);

+	paint_squares(data, IGT_ROTATION_0, &data->fb, 1.0);

+	igt_plane_set_fb(plane, &data->fb);

+

+	if (plane->type != DRM_PLANE_TYPE_CURSOR)

+		igt_plane_set_position(plane, data->pos_x, data->pos_y);

+}

+

+static void test_single_case(data_t *data, enum pipe pipe,

+			     igt_output_t *output, igt_plane_t *plane,

+			     enum rectangle_type rect,

+			     uint32_t format, bool test_bad_format)

+{

+	igt_display_t *display = &data->display;

+	igt_crc_t crc_output;

+	int ret;

+

+	igt_debug("Testing case %i on pipe %s, format %s\n", rect, kmstest_pipe_name(pipe), igt_format_str(format));

+	prepare_fbs(data, output, plane, rect, format);

+

+	igt_plane_set_rotation(plane, data->rotation);

+	if (data->rotation & (IGT_ROTATION_90 | IGT_ROTATION_270))

+		igt_plane_set_size(plane, data->fb.height, data->fb.width);

+

+	ret = igt_display_try_commit2(display, COMMIT_ATOMIC);

+	if (test_bad_format) {

+		igt_assert_eq(ret, -EINVAL);

+		return;

+	}

+

+	/* Verify commit was ok. */

+	igt_assert_eq(ret, 0);

+

+	if (is_i915_device(data->gfx_fd)) {

+		/* Check CRC */

+		igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &crc_output);

+		igt_assert_crc_equal(&data->ref_crc, &crc_output);

+

+		/*

+		 * If flips are requested flip to a different fb and

+		 * check CRC against that one as well.

+		 */

+		if (data->fb_flip.fb_id) {

+			igt_plane_set_fb(plane, &data->fb_flip);

+			if (data->rotation == IGT_ROTATION_90 || data->rotation == IGT_ROTATION_270)

+				igt_plane_set_size(plane, data->fb.height, data->fb.width);

+

+			if (plane->type != DRM_PLANE_TYPE_PRIMARY) {

+				igt_display_commit_atomic(display, DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK, NULL);

+			} else {

+				ret = drmModePageFlip(data->gfx_fd,

+						output->config.crtc->crtc_id,

+						data->fb_flip.fb_id,

+						DRM_MODE_PAGE_FLIP_EVENT,

+						NULL);

+				igt_assert_eq(ret, 0);

+			}

+			kmstest_wait_for_pageflip(data->gfx_fd);

+			igt_pipe_crc_get_current(display->drm_fd, data->pipe_crc, &crc_output);

+			igt_assert_crc_equal(&data->flip_crc,

+					     &crc_output);

+		}

+	} else if (is_amdgpu_device(data->gfx_fd)) {

+		igt_pipe_crc_collect_crc(data->pipe_crc, &crc_output);

+	}

+}

+

+static bool test_format(data_t *data,

+			struct igt_vec *tested_formats,

+			uint32_t format)

+{

+	if (!igt_fb_supported_format(format))

+		return false;

+

+	if (!is_i915_device(data->gfx_fd) ||

+	    data->extended)

+		return true;

+

+	format = igt_reduce_format(format);

+

+	/* only test each format "class" once */

+	if (igt_vec_index(tested_formats, &format) >= 0)

+		return false;

+

+	igt_vec_push(tested_formats, &format);

+

+	return true;

+}

+

+static void test_plane_rotation(data_t *data, int plane_type, bool test_bad_format)

+{

+	igt_display_t *display = &data->display;

+	igt_output_t *output;

+	enum pipe pipe;

+

+	if (plane_type == DRM_PLANE_TYPE_CURSOR)

+		igt_require(display->has_cursor_plane);

+

+	igt_display_require_output(display);

+

+	for_each_pipe_with_valid_output(display, pipe, output) {

+		igt_plane_t *plane;

+		int i, j;

+

+		if (is_i915_device(data->gfx_fd)) {

+			if (IS_CHERRYVIEW(data->devid) && pipe != PIPE_B)

+				continue;

+

+			igt_output_set_pipe(output, pipe);

+

+			plane = igt_output_get_plane_type(output, plane_type);

+			igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));

+

+			prepare_crtc(data, output, pipe, plane, true);

+

+			for (i = 0; i < num_rectangle_types; i++) {

+				/* Unsupported on i915 */

+				if (plane_type == DRM_PLANE_TYPE_CURSOR &&

+				    i != square)

+					continue;

+

+				/* Only support partial covering primary plane on gen9+ */

+				if (plane_type == DRM_PLANE_TYPE_PRIMARY &&

+				    intel_gen(intel_get_drm_devid(data->gfx_fd)) < 9) {

+					if (i != rectangle)

+						continue;

+					else

+						data->use_native_resolution = true;

+				} else {

+					data->use_native_resolution = false;

+				}

+

+				if (!data->override_fmt) {

+					struct igt_vec tested_formats;

+

+					igt_vec_init(&tested_formats, sizeof(uint32_t));

+

+					for (j = 0; j < plane->drm_plane->count_formats; j++) {

+						uint32_t format = plane->drm_plane->formats[j];

+

+						if (!test_format(data, &tested_formats, format))

+							continue;

+

+						test_single_case(data, pipe, output, plane, i,

+								 format, test_bad_format);

+					}

+

+					igt_vec_fini(&tested_formats);

+				} else {

+					test_single_case(data, pipe, output, plane, i,

+							 data->override_fmt, test_bad_format);

+				}

+			}

+		} else if (is_amdgpu_device(data->gfx_fd)) {

+			uint32_t format = DRM_FORMAT_XRGB8888;

+

+			igt_output_set_pipe(output, pipe);

+

+			plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);

+			igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));

+

+			prepare_crtc(data, output, pipe, plane, false);

+

+			if (plane_type != DRM_PLANE_TYPE_PRIMARY) {

+				plane = igt_output_get_plane_type(output, plane_type);

+				igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));

+			}

+

+			test_single_case(data, pipe, output, plane,

+					 rectangle, format, test_bad_format);

+		}

+

+		igt_pipe_crc_stop(data->pipe_crc);

+	}

+}

+

+typedef struct {

+	int32_t x1, y1;

+	uint64_t width, height, tiling, planetype, format;

+	igt_rotation_t rotation_sw, rotation_hw;

+} planeinfos;

+

+static bool get_multiplane_crc(data_t *data, igt_output_t *output,

+			       igt_crc_t *crc_output, planeinfos *planeinfo,

+			       int numplanes)

+{

+	uint32_t w, h;

+	igt_display_t *display = &data->display;

+	struct p_struct *planes, *oldplanes;

+	int c, ret;

+

+	oldplanes = data->multiplaneoldview;

+	planes = calloc(sizeof(*planes), numplanes);

+

+	for (c = 0; c < numplanes; c++) {

+		planes[c].plane = igt_output_get_plane_type(output,

+							    planeinfo[c].planetype);

+

+		/*

+		 * make plane and fb width and height always divisible by 4

+		 * due to NV12 support and Intel hw workarounds.

+		 */

+		w = planeinfo[c].width & ~3;

+		h = planeinfo[c].height & ~3;

+

+		if (planeinfo[c].rotation_sw & (IGT_ROTATION_90 | IGT_ROTATION_270))

+			igt_swap(w, h);

+

+		if (!igt_plane_has_format_mod(planes[c].plane,

+					      planeinfo[c].format,

+					      planeinfo[c].tiling))

+			return false;

+

+		igt_create_fb(data->gfx_fd, w, h, planeinfo[c].format,

+			      planeinfo[c].tiling, &planes[c].fb);

+

+		paint_squares(data, planeinfo[c].rotation_sw, &planes[c].fb, 1.0f);

+		igt_plane_set_fb(planes[c].plane, &planes[c].fb);

+

+		if (planeinfo[c].rotation_hw & (IGT_ROTATION_90 | IGT_ROTATION_270))

+			igt_plane_set_size(planes[c].plane, h, w);

+

+		igt_plane_set_position(planes[c].plane, planeinfo[c].x1, planeinfo[c].y1);

+		igt_plane_set_rotation(planes[c].plane, planeinfo[c].rotation_hw);

+	}

+

+	ret = igt_display_try_commit2(display, COMMIT_ATOMIC);

+	igt_assert_eq(ret, 0);

+

+	igt_pipe_crc_get_current(data->gfx_fd, data->pipe_crc, crc_output);

+

+	for (c = 0; c < numplanes && oldplanes; c++)

+		igt_remove_fb(data->gfx_fd, &oldplanes[c].fb);

+

+	free(oldplanes);

+	data->multiplaneoldview = (void*)planes;

+	return true;

+}

+

+static void pointlocation(data_t *data, planeinfos *p, drmModeModeInfo *mode,

+			  int c)

+{

+	if (data->planepos[c].origo & p_right) {

+		p[c].x1 = (int32_t)(data->planepos[c].x * min(TEST_MAX_WIDTH, mode->hdisplay)

+				+ mode->hdisplay);

+		p[c].x1 &= ~3;

+		/*

+		 * At this point is handled surface on right side. If display

+		 * mode is not divisible by 4 but with 2 point location is

+		 * fixed to match requirements. Because of YUV planes here is

+		 * intentionally ignored bit 1.

+		 */

+		p[c].x1 -= mode->hdisplay & 2;

+	} else {

+		p[c].x1 = (int32_t)(data->planepos[c].x * min(TEST_MAX_WIDTH, mode->hdisplay));

+		p[c].x1 &= ~3;

+	}

+

+	if (data->planepos[c].origo & p_bottom) {

+		p[c].y1 = (int32_t)(data->planepos[c].y * min(TEST_MAX_HEIGHT, mode->vdisplay)

+				+ mode->vdisplay);

+		p[c].y1 &= ~3;

+		p[c].y1 -= mode->vdisplay & 2;

+	} else {

+		p[c].y1 = (int32_t)(data->planepos[c].y * min(TEST_MAX_HEIGHT, mode->vdisplay));

+		p[c].y1 &= ~3;

+	}

+}

+

+/*

+ * Here is pipe parameter which is now used only for first pipe.

+ * It is left here if this test ever was wanted to be run on

+ * different pipes.

+ */

+static void test_multi_plane_rotation(data_t *data, enum pipe pipe)

+{

+	igt_display_t *display = &data->display;

+	igt_output_t *output;

+	igt_crc_t retcrc_sw, retcrc_hw;

+	planeinfos p[2];

+	int c, used_w, used_h;

+	struct p_struct *oldplanes;

+	drmModeModeInfo *mode;

+

+	static const struct {

+		igt_rotation_t rotation;

+		float_t width;

+		float_t height;

+		uint64_t tiling;

+	} planeconfigs[] = {

+	{IGT_ROTATION_0, .2f, .4f, LOCAL_DRM_FORMAT_MOD_NONE },

+	{IGT_ROTATION_0, .2f, .4f, LOCAL_I915_FORMAT_MOD_X_TILED },

+	{IGT_ROTATION_0, .2f, .4f, LOCAL_I915_FORMAT_MOD_Y_TILED },

+	{IGT_ROTATION_0, .2f, .4f, LOCAL_I915_FORMAT_MOD_Yf_TILED },

+	{IGT_ROTATION_90, .2f, .4f, LOCAL_I915_FORMAT_MOD_Y_TILED },

+	{IGT_ROTATION_90, .2f, .4f, LOCAL_I915_FORMAT_MOD_Yf_TILED },

+	{IGT_ROTATION_180, .2f, .4f, LOCAL_DRM_FORMAT_MOD_NONE },

+	{IGT_ROTATION_180, .2f, .4f, LOCAL_I915_FORMAT_MOD_X_TILED },

+	{IGT_ROTATION_180, .2f, .4f, LOCAL_I915_FORMAT_MOD_Y_TILED },

+	{IGT_ROTATION_180, .2f, .4f, LOCAL_I915_FORMAT_MOD_Yf_TILED },

+	{IGT_ROTATION_270, .2f, .4f, LOCAL_I915_FORMAT_MOD_Y_TILED },

+	{IGT_ROTATION_270, .2f, .4f, LOCAL_I915_FORMAT_MOD_Yf_TILED },

+	};

+

+	/*

+	* These are those modes which are tested. For testing feel interesting

+	* case with tiling are 2 bpp, 4 bpp and NV12.

+	*/

+	static const uint32_t formatlist[] = {DRM_FORMAT_RGB565,

+		DRM_FORMAT_XRGB8888, DRM_FORMAT_NV12};

+

+	for_each_valid_output_on_pipe(display, pipe, output) {

+		int i, j, k, l;

+		igt_output_set_pipe(output, pipe);

+		mode = igt_output_get_mode(output);

+		igt_display_require_output(display);

+		igt_display_commit2(display, COMMIT_ATOMIC);

+

+		used_w = min(TEST_MAX_WIDTH, mode->hdisplay);

+		used_h = min(TEST_MAX_HEIGHT, mode->vdisplay);

+

+		data->pipe_crc = igt_pipe_crc_new(data->gfx_fd, pipe,

+						  INTEL_PIPE_CRC_SOURCE_AUTO);

+		igt_pipe_crc_start(data->pipe_crc);

+

+		for (i = 0; i < ARRAY_SIZE(planeconfigs); i++) {

+			p[0].planetype = DRM_PLANE_TYPE_PRIMARY;

+			p[0].width = (uint64_t)(planeconfigs[i].width * used_w);

+			p[0].height = (uint64_t)(planeconfigs[i].height * used_h);

+			p[0].tiling = planeconfigs[i].tiling;

+			pointlocation(data, (planeinfos *)&p, mode, 0);

+

+			for (k = 0; k < ARRAY_SIZE(formatlist); k++) {

+				p[0].format = formatlist[k];

+

+				for (j = 0; j < ARRAY_SIZE(planeconfigs); j++) {

+					p[1].planetype = DRM_PLANE_TYPE_OVERLAY;

+					p[1].width = (uint64_t)(planeconfigs[j].width * used_w);

+					p[1].height = (uint64_t)(planeconfigs[j].height * used_h);

+					p[1].tiling = planeconfigs[j].tiling;

+					pointlocation(data, (planeinfos *)&p,

+						      mode, 1);

+

+					for (l = 0; l < ARRAY_SIZE(formatlist); l++) {

+						p[1].format = formatlist[l];

+

+						/*

+						 * RGB565 90/270 degrees rotation is supported

+						 * from gen11 onwards.

+						 */

+						if (p[0].format == DRM_FORMAT_RGB565 &&

+						     (planeconfigs[i].rotation & (IGT_ROTATION_90 | IGT_ROTATION_270))

+						     && intel_gen(data->devid) < 11)

+							continue;

+

+						if (p[1].format == DRM_FORMAT_RGB565 &&

+						     (planeconfigs[j].rotation & (IGT_ROTATION_90 | IGT_ROTATION_270))

+						     && intel_gen(data->devid) < 11)

+							continue;

+

+						p[0].rotation_sw = planeconfigs[i].rotation;

+						p[0].rotation_hw = IGT_ROTATION_0;

+						p[1].rotation_sw = planeconfigs[j].rotation;

+						p[1].rotation_hw = IGT_ROTATION_0;

+						if (!get_multiplane_crc(data, output, &retcrc_sw,

+								   (planeinfos *)&p, MAXMULTIPLANESAMOUNT))

+							continue;

+

+						igt_swap(p[0].rotation_sw, p[0].rotation_hw);

+						igt_swap(p[1].rotation_sw, p[1].rotation_hw);

+						if (!get_multiplane_crc(data, output, &retcrc_hw,

+								   (planeinfos *)&p, MAXMULTIPLANESAMOUNT))

+							continue;

+

+						igt_assert_crc_equal(&retcrc_sw, &retcrc_hw);

+					}

+				}

+			}

+		}

+		igt_pipe_crc_stop(data->pipe_crc);

+		igt_pipe_crc_free(data->pipe_crc);

+		igt_output_set_pipe(output, PIPE_ANY);

+	}

+

+	/*

+	* Old fbs are deleted only after new ones are set on planes.

+	* This is done to speed up the test

+	*/

+	oldplanes = data->multiplaneoldview;

+	for (c = 0; c < MAXMULTIPLANESAMOUNT && oldplanes; c++)

+		igt_remove_fb(data->gfx_fd, &oldplanes[c].fb);

+

+	free(oldplanes);

+	data->multiplaneoldview = NULL;

+	data->pipe_crc = NULL;

+}

+

+static void test_plane_rotation_exhaust_fences(data_t *data,

+					       enum pipe pipe,

+					       igt_output_t *output,

+					       igt_plane_t *plane)

+{

+	igt_display_t *display = &data->display;

+	uint64_t tiling = LOCAL_I915_FORMAT_MOD_Y_TILED;

+	uint32_t format = DRM_FORMAT_XRGB8888;

+	int fd = data->gfx_fd;

+	drmModeModeInfo *mode;

+	struct igt_fb fb[MAX_FENCES+1] = {};

+	uint64_t size;

+	unsigned int stride, w, h;

+	uint64_t total_aperture_size, total_fbs_size;

+	int i;

+

+	igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));

+

+	prepare_crtc(data, output, pipe, plane, false);

+

+	mode = igt_output_get_mode(output);

+	w = mode->hdisplay;

+	h = mode->vdisplay;

+

+	igt_calc_fb_size(fd, w, h, format, tiling, &size, &stride);

+

+	/*

+	 * Make sure there is atleast 90% of the available GTT space left

+	 * for creating (MAX_FENCES+1) framebuffers.

+	 */

+	total_fbs_size = size * (MAX_FENCES + 1);

+	total_aperture_size = gem_available_aperture_size(fd);

+	igt_require(total_fbs_size < total_aperture_size * 0.9);

+

+	for (i = 0; i < MAX_FENCES + 1; i++) {

+		igt_create_fb(fd, w, h, format, tiling, &fb[i]);

+

+		igt_plane_set_fb(plane, &fb[i]);

+		igt_plane_set_rotation(plane, IGT_ROTATION_0);

+		igt_display_commit2(display, COMMIT_ATOMIC);

+

+		igt_plane_set_rotation(plane, IGT_ROTATION_90);

+		igt_plane_set_size(plane, h, w);

+		igt_display_commit2(display, COMMIT_ATOMIC);

+	}

+

+	for (i = 0; i < MAX_FENCES + 1; i++)

+		igt_remove_fb(fd, &fb[i]);

+}

+

+static const char *plane_test_str(unsigned plane)

+{

+	switch (plane) {

+	case DRM_PLANE_TYPE_PRIMARY:

+		return "primary";

+	case DRM_PLANE_TYPE_OVERLAY:

+		return "sprite";

+	case DRM_PLANE_TYPE_CURSOR:

+		return "cursor";

+	default:

+		igt_assert(0);

+	}

+}

+

+static const char *rot_test_str(igt_rotation_t rot)

+{

+	switch (rot) {

+	case IGT_ROTATION_0:

+		return "0";

+	case IGT_ROTATION_90:

+		return "90";

+	case IGT_ROTATION_180:

+		return "180";

+	case IGT_ROTATION_270:

+		return "270";

+	default:

+		igt_assert(0);

+	}

+}

+

+static const char *tiling_test_str(uint64_t tiling)

+{

+	switch (tiling) {

+	case LOCAL_I915_FORMAT_MOD_X_TILED:

+		return "x-tiled";

+	case LOCAL_I915_FORMAT_MOD_Y_TILED:

+		return "y-tiled";

+	case LOCAL_I915_FORMAT_MOD_Yf_TILED:

+		return "yf-tiled";

+	default:

+		igt_assert(0);

+	}

+}

+

+static int opt_handler(int opt, int opt_index, void *_data)

+{

+	data_t *data = _data;

+

+	switch (opt) {

+	case 'e':

+		data->extended = true;

+		break;

+	}

+

+	return IGT_OPT_HANDLER_SUCCESS;

+}

+

+static const struct option long_opts[] = {

+	{ .name = "extended", .has_arg = false, .val = 'e', },

+	{}

+};

+

+static const char help_str[] =

+	"  --extended\t\tRun the extended tests\n";

+

+static data_t data;

+

+igt_main_args("", long_opts, help_str, opt_handler, &data)

+{

+	struct rot_subtest {

+		unsigned plane;

+		igt_rotation_t rot;

+	} *subtest, subtests[] = {

+		{ DRM_PLANE_TYPE_PRIMARY, IGT_ROTATION_90 },

+		{ DRM_PLANE_TYPE_PRIMARY, IGT_ROTATION_180 },

+		{ DRM_PLANE_TYPE_PRIMARY, IGT_ROTATION_270 },

+		{ DRM_PLANE_TYPE_OVERLAY, IGT_ROTATION_90 },

+		{ DRM_PLANE_TYPE_OVERLAY, IGT_ROTATION_180 },

+		{ DRM_PLANE_TYPE_OVERLAY, IGT_ROTATION_270 },

+		{ DRM_PLANE_TYPE_CURSOR, IGT_ROTATION_180 },

+		{ 0, 0}

+	};

+

+	struct reflect_x {

+		uint64_t tiling;

+		igt_rotation_t rot;

+	} *reflect_x, reflect_x_subtests[] = {

+		{ LOCAL_I915_FORMAT_MOD_X_TILED, IGT_ROTATION_0 },

+		{ LOCAL_I915_FORMAT_MOD_X_TILED, IGT_ROTATION_180 },

+		{ LOCAL_I915_FORMAT_MOD_Y_TILED, IGT_ROTATION_0 },

+		{ LOCAL_I915_FORMAT_MOD_Y_TILED, IGT_ROTATION_90 },

+		{ LOCAL_I915_FORMAT_MOD_Y_TILED, IGT_ROTATION_180 },

+		{ LOCAL_I915_FORMAT_MOD_Y_TILED, IGT_ROTATION_270 },

+		{ LOCAL_I915_FORMAT_MOD_Yf_TILED, IGT_ROTATION_0 },

+		{ LOCAL_I915_FORMAT_MOD_Yf_TILED, IGT_ROTATION_90 },

+		{ LOCAL_I915_FORMAT_MOD_Yf_TILED, IGT_ROTATION_180 },

+		{ LOCAL_I915_FORMAT_MOD_Yf_TILED, IGT_ROTATION_270 },

+		{ 0, 0 }

+	};

+

+	int gen = 0;

+

+	igt_fixture {

+		data.gfx_fd = drm_open_driver_master(DRIVER_INTEL | DRIVER_AMDGPU);

+		if (is_i915_device(data.gfx_fd)) {

+			data.devid = intel_get_drm_devid(data.gfx_fd);

+			gen = intel_gen(data.devid);

+		}

+

+		kmstest_set_vt_graphics_mode();

+

+		igt_require_pipe_crc(data.gfx_fd);

+

+		igt_display_require(&data.display, data.gfx_fd);

+		igt_require(data.display.is_atomic);

+	}

+

+	for (subtest = subtests; subtest->rot; subtest++) {

+		igt_subtest_f("%s-rotation-%s",

+			      plane_test_str(subtest->plane),

+			      rot_test_str(subtest->rot)) {

+			if (is_i915_device(data.gfx_fd)) {

+				igt_require(!(subtest->rot &

+					    (IGT_ROTATION_90 | IGT_ROTATION_270)) ||

+					    gen >= 9);

+			}

+			data.rotation = subtest->rot;

+			test_plane_rotation(&data, subtest->plane, false);

+		}

+	}

+

+	igt_subtest_f("sprite-rotation-90-pos-100-0") {

+		igt_require(gen >= 9);

+		data.rotation = IGT_ROTATION_90;

+		data.pos_x = 100,

+		data.pos_y = 0;

+		test_plane_rotation(&data, DRM_PLANE_TYPE_OVERLAY, false);

+	}

+	data.pos_x = 0,

+	data.pos_y = 0;

+

+	igt_subtest_f("bad-pixel-format") {

+		 /* gen11 enables RGB565 rotation for 90/270 degrees.

+		  * so apart from this, any other gen11+ pixel format

+		  * can be used which doesn't support 90/270 degree

+		  * rotation */

+		igt_require(gen >= 9);

+		data.rotation = IGT_ROTATION_90;

+		data.override_fmt = gen < 11 ? DRM_FORMAT_RGB565 : DRM_FORMAT_Y212;

+		test_plane_rotation(&data, DRM_PLANE_TYPE_PRIMARY, true);

+	}

+	data.override_fmt = 0;

+

+	igt_subtest_f("bad-tiling") {

+		igt_require(gen >= 9);

+		data.rotation = IGT_ROTATION_90;

+		data.override_tiling = LOCAL_I915_FORMAT_MOD_X_TILED;

+		test_plane_rotation(&data, DRM_PLANE_TYPE_PRIMARY, true);

+	}

+	data.override_tiling = 0;

+

+	for (reflect_x = reflect_x_subtests; reflect_x->tiling; reflect_x++) {

+		igt_subtest_f("primary-%s-reflect-x-%s",

+			      tiling_test_str(reflect_x->tiling),

+			      rot_test_str(reflect_x->rot)) {

+			igt_require(gen >= 10 ||

+				    (IS_CHERRYVIEW(data.devid) && reflect_x->rot == IGT_ROTATION_0

+				     && reflect_x->tiling == LOCAL_I915_FORMAT_MOD_X_TILED));

+			data.rotation = (IGT_REFLECT_X | reflect_x->rot);

+			data.override_tiling = reflect_x->tiling;

+			test_plane_rotation(&data, DRM_PLANE_TYPE_PRIMARY, false);

+		}

+	}

+

+	igt_subtest_f("multiplane-rotation") {

+		igt_require(gen >= 9);

+		cleanup_crtc(&data);

+		data.planepos[0].origo = p_top | p_left;

+		data.planepos[0].x = .2f;

+		data.planepos[0].y = .1f;

+		data.planepos[1].origo = p_top | p_right;

+		data.planepos[1].x = -.4f;

+		data.planepos[1].y = .1f;

+		test_multi_plane_rotation(&data, 0);

+	}

+

+	igt_subtest_f("multiplane-rotation-cropping-top") {

+		igt_require(gen >= 9);

+		cleanup_crtc(&data);

+		data.planepos[0].origo = p_top | p_left;

+		data.planepos[0].x = -.05f;

+		data.planepos[0].y = -.15f;

+		data.planepos[1].origo = p_top | p_right;

+		data.planepos[1].x = -.15f;

+		data.planepos[1].y = -.15f;

+		test_multi_plane_rotation(&data, 0);

+	}

+

+	igt_subtest_f("multiplane-rotation-cropping-bottom") {

+		igt_require(gen >= 9);

+		cleanup_crtc(&data);

+		data.planepos[0].origo = p_bottom | p_left;

+		data.planepos[0].x = -.05f;

+		data.planepos[0].y = -.20f;

+		data.planepos[1].origo = p_bottom | p_right;

+		data.planepos[1].x = -.15f;

+		data.planepos[1].y = -.20f;

+		test_multi_plane_rotation(&data, 0);

+	}

+

+	/*

+	 * exhaust-fences should be last test, if it fails we may OOM in

+	 * the following subtests otherwise.

+	 */

+	igt_subtest_f("exhaust-fences") {

+		enum pipe pipe;

+		igt_output_t *output;

+

+		igt_require(gen >= 9);

+		igt_display_require_output(&data.display);

+

+		for_each_pipe_with_valid_output(&data.display, pipe, output) {

+			igt_plane_t *primary = &data.display.pipes[pipe].planes[0];

+

+			test_plane_rotation_exhaust_fences(&data, pipe, output, primary);

+			break;

+		}

+	}

+

+	igt_fixture {

+		igt_display_fini(&data.display);

+	}

+}

-- 
2.25.1

_______________________________________________
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: success for kms_rotation_crc:Add HW rotation test case for amdgpu
  2020-12-16 22:12 [igt-dev] [PATCH] kms_rotation_crc:Add HW rotation test case for amdgpu Sung Joon Kim
       [not found] ` <MN2PR12MB3054150157A5A6E90F904EF997C50@MN2PR12MB3054.namprd12.prod.outlook.com>
@ 2020-12-16 23:09 ` Patchwork
  2020-12-17  2:32 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork
  2020-12-17 13:41 ` [igt-dev] ✗ Fi.CI.BUILD: failure for kms_rotation_crc:Add HW rotation test case for amdgpu (rev2) Patchwork
  3 siblings, 0 replies; 5+ messages in thread
From: Patchwork @ 2020-12-16 23:09 UTC (permalink / raw)
  To: Sung Joon Kim; +Cc: igt-dev


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

== Series Details ==

Series: kms_rotation_crc:Add HW rotation test case for amdgpu
URL   : https://patchwork.freedesktop.org/series/85018/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_9495 -> IGTPW_5302
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/index.html

Known issues
------------

  Here are the changes found in IGTPW_5302 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@gem_flink_basic@bad-flink:
    - fi-tgl-y:           [PASS][1] -> [DMESG-WARN][2] ([i915#402])
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/fi-tgl-y/igt@gem_flink_basic@bad-flink.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/fi-tgl-y/igt@gem_flink_basic@bad-flink.html

  * igt@runner@aborted:
    - fi-bdw-5557u:       NOTRUN -> [FAIL][3] ([i915#2029] / [i915#2722])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/fi-bdw-5557u/igt@runner@aborted.html

  
#### Possible fixes ####

  * igt@gem_basic@create-close:
    - fi-tgl-y:           [DMESG-WARN][4] ([i915#402]) -> [PASS][5] +1 similar issue
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/fi-tgl-y/igt@gem_basic@create-close.html
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/fi-tgl-y/igt@gem_basic@create-close.html

  
  [i915#2029]: https://gitlab.freedesktop.org/drm/intel/issues/2029
  [i915#2722]: https://gitlab.freedesktop.org/drm/intel/issues/2722
  [i915#402]: https://gitlab.freedesktop.org/drm/intel/issues/402


Participating hosts (42 -> 38)
------------------------------

  Missing    (4): fi-dg1-1 fi-bsw-cyan fi-bdw-samus fi-hsw-4200u 


Build changes
-------------

  * CI: CI-20190529 -> None
  * IGT: IGT_5905 -> IGTPW_5302

  CI-20190529: 20190529
  CI_DRM_9495: 2960e86fd8fd7659400d05f40a1e06d3a97b6987 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_5302: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/index.html
  IGT_5905: 3d0934900bddeb7a68f1abab4cd05077f0609e32 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/index.html

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

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

_______________________________________________
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: failure for kms_rotation_crc:Add HW rotation test case for amdgpu
  2020-12-16 22:12 [igt-dev] [PATCH] kms_rotation_crc:Add HW rotation test case for amdgpu Sung Joon Kim
       [not found] ` <MN2PR12MB3054150157A5A6E90F904EF997C50@MN2PR12MB3054.namprd12.prod.outlook.com>
  2020-12-16 23:09 ` [igt-dev] ✓ Fi.CI.BAT: success for " Patchwork
@ 2020-12-17  2:32 ` Patchwork
  2020-12-17 13:41 ` [igt-dev] ✗ Fi.CI.BUILD: failure for kms_rotation_crc:Add HW rotation test case for amdgpu (rev2) Patchwork
  3 siblings, 0 replies; 5+ messages in thread
From: Patchwork @ 2020-12-17  2:32 UTC (permalink / raw)
  To: Sung Joon Kim; +Cc: igt-dev


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

== Series Details ==

Series: kms_rotation_crc:Add HW rotation test case for amdgpu
URL   : https://patchwork.freedesktop.org/series/85018/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_9495_full -> IGTPW_5302_full
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with IGTPW_5302_full absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in IGTPW_5302_full, please notify your bug team to allow them
  to document this new failure mode, which will reduce false positives in CI.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/index.html

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in IGTPW_5302_full:

### IGT changes ###

#### Possible regressions ####

  * igt@kms_pipe_crc_basic@suspend-read-crc-pipe-c:
    - shard-iclb:         [PASS][1] -> [DMESG-WARN][2]
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-iclb4/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-c.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-iclb5/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-c.html

  
New tests
---------

  New tests have been introduced between CI_DRM_9495_full and IGTPW_5302_full:

### New IGT tests (4) ###

  * igt@kms_atomic_transition@modeset-transition:
    - Statuses :
    - Exec time: [None] s

  * igt@kms_atomic_transition@modeset-transition-fencing:
    - Statuses :
    - Exec time: [None] s

  * igt@kms_atomic_transition@modeset-transition-nonblocking:
    - Statuses :
    - Exec time: [None] s

  * igt@kms_atomic_transition@modeset-transition-nonblocking-fencing:
    - Statuses :
    - Exec time: [None] s

  

Known issues
------------

  Here are the changes found in IGTPW_5302_full that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@feature_discovery@psr2:
    - shard-iclb:         [PASS][3] -> [SKIP][4] ([i915#658])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-iclb2/igt@feature_discovery@psr2.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-iclb8/igt@feature_discovery@psr2.html

  * igt@gem_exec_fence@basic-wait@bcs0:
    - shard-glk:          NOTRUN -> [SKIP][5] ([fdo#109271]) +9 similar issues
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-glk6/igt@gem_exec_fence@basic-wait@bcs0.html

  * igt@gem_exec_params@secure-non-master:
    - shard-tglb:         NOTRUN -> [SKIP][6] ([fdo#112283])
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb1/igt@gem_exec_params@secure-non-master.html
    - shard-iclb:         NOTRUN -> [SKIP][7] ([fdo#112283])
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-iclb8/igt@gem_exec_params@secure-non-master.html

  * igt@gem_exec_reloc@basic-many-active@rcs0:
    - shard-apl:          [PASS][8] -> [FAIL][9] ([i915#2389])
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-apl8/igt@gem_exec_reloc@basic-many-active@rcs0.html
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-apl8/igt@gem_exec_reloc@basic-many-active@rcs0.html

  * igt@gem_exec_reloc@basic-many-active@vcs1:
    - shard-iclb:         NOTRUN -> [FAIL][10] ([i915#2389])
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-iclb2/igt@gem_exec_reloc@basic-many-active@vcs1.html

  * igt@gen7_exec_parse@basic-allowed:
    - shard-tglb:         NOTRUN -> [SKIP][11] ([fdo#109289]) +1 similar issue
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb5/igt@gen7_exec_parse@basic-allowed.html

  * igt@gen9_exec_parse@secure-batches:
    - shard-tglb:         NOTRUN -> [SKIP][12] ([fdo#112306])
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb5/igt@gen9_exec_parse@secure-batches.html

  * igt@i915_pm_dc@dc3co-vpb-simulation:
    - shard-tglb:         [PASS][13] -> [FAIL][14] ([i915#1567])
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-tglb7/igt@i915_pm_dc@dc3co-vpb-simulation.html
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb2/igt@i915_pm_dc@dc3co-vpb-simulation.html

  * igt@kms_big_fb@linear-16bpp-rotate-90:
    - shard-apl:          NOTRUN -> [SKIP][15] ([fdo#109271]) +33 similar issues
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-apl8/igt@kms_big_fb@linear-16bpp-rotate-90.html
    - shard-tglb:         NOTRUN -> [SKIP][16] ([fdo#111614])
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb2/igt@kms_big_fb@linear-16bpp-rotate-90.html

  * igt@kms_big_fb@yf-tiled-64bpp-rotate-270:
    - shard-tglb:         NOTRUN -> [SKIP][17] ([fdo#111615]) +1 similar issue
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb3/igt@kms_big_fb@yf-tiled-64bpp-rotate-270.html
    - shard-iclb:         NOTRUN -> [SKIP][18] ([fdo#110723])
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-iclb4/igt@kms_big_fb@yf-tiled-64bpp-rotate-270.html

  * igt@kms_chamelium@dp-audio-edid:
    - shard-tglb:         NOTRUN -> [SKIP][19] ([fdo#109284] / [fdo#111827]) +1 similar issue
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb7/igt@kms_chamelium@dp-audio-edid.html

  * igt@kms_chamelium@vga-hpd-enable-disable-mode:
    - shard-apl:          NOTRUN -> [SKIP][20] ([fdo#109271] / [fdo#111827]) +1 similar issue
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-apl6/igt@kms_chamelium@vga-hpd-enable-disable-mode.html
    - shard-kbl:          NOTRUN -> [SKIP][21] ([fdo#109271] / [fdo#111827]) +1 similar issue
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-kbl7/igt@kms_chamelium@vga-hpd-enable-disable-mode.html

  * igt@kms_content_protection@legacy:
    - shard-kbl:          NOTRUN -> [TIMEOUT][22] ([i915#1319])
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-kbl3/igt@kms_content_protection@legacy.html
    - shard-tglb:         NOTRUN -> [SKIP][23] ([fdo#111828])
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb7/igt@kms_content_protection@legacy.html
    - shard-apl:          NOTRUN -> [TIMEOUT][24] ([i915#1319])
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-apl1/igt@kms_content_protection@legacy.html

  * igt@kms_cursor_crc@pipe-a-cursor-64x21-random:
    - shard-apl:          [PASS][25] -> [FAIL][26] ([i915#54])
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-apl2/igt@kms_cursor_crc@pipe-a-cursor-64x21-random.html
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-apl3/igt@kms_cursor_crc@pipe-a-cursor-64x21-random.html

  * igt@kms_cursor_crc@pipe-d-cursor-suspend:
    - shard-kbl:          NOTRUN -> [SKIP][27] ([fdo#109271]) +32 similar issues
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-kbl2/igt@kms_cursor_crc@pipe-d-cursor-suspend.html

  * igt@kms_cursor_legacy@pipe-d-torture-bo:
    - shard-kbl:          NOTRUN -> [SKIP][28] ([fdo#109271] / [i915#533]) +1 similar issue
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-kbl2/igt@kms_cursor_legacy@pipe-d-torture-bo.html
    - shard-apl:          NOTRUN -> [SKIP][29] ([fdo#109271] / [i915#533]) +1 similar issue
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-apl4/igt@kms_cursor_legacy@pipe-d-torture-bo.html

  * igt@kms_flip@2x-flip-vs-modeset-vs-hang:
    - shard-iclb:         NOTRUN -> [SKIP][30] ([fdo#109274]) +2 similar issues
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-iclb4/igt@kms_flip@2x-flip-vs-modeset-vs-hang.html

  * igt@kms_flip@flip-vs-blocking-wf-vblank@a-edp1:
    - shard-tglb:         [PASS][31] -> [FAIL][32] ([i915#2122])
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-tglb6/igt@kms_flip@flip-vs-blocking-wf-vblank@a-edp1.html
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb8/igt@kms_flip@flip-vs-blocking-wf-vblank@a-edp1.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-onoff:
    - shard-tglb:         NOTRUN -> [SKIP][33] ([fdo#111825]) +8 similar issues
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb8/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-onoff.html
    - shard-iclb:         NOTRUN -> [SKIP][34] ([fdo#109280])
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-iclb6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-shrfb-msflip-blt:
    - shard-hsw:          NOTRUN -> [SKIP][35] ([fdo#109271]) +3 similar issues
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-hsw7/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-shrfb-msflip-blt.html

  * igt@kms_hdr@static-toggle-dpms:
    - shard-tglb:         NOTRUN -> [SKIP][36] ([i915#1187])
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb8/igt@kms_hdr@static-toggle-dpms.html
    - shard-iclb:         NOTRUN -> [SKIP][37] ([i915#1187])
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-iclb7/igt@kms_hdr@static-toggle-dpms.html

  * igt@kms_pipe_crc_basic@suspend-read-crc-pipe-c:
    - shard-glk:          [PASS][38] -> [DMESG-WARN][39] ([i915#2635])
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-glk2/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-c.html
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-glk5/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-c.html
    - shard-apl:          [PASS][40] -> [DMESG-WARN][41] ([i915#2635])
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-apl4/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-c.html
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-apl4/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-c.html
    - shard-kbl:          [PASS][42] -> [INCOMPLETE][43] ([i915#155])
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-kbl7/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-c.html
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-kbl2/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-c.html
    - shard-tglb:         [PASS][44] -> [INCOMPLETE][45] ([i915#1436] / [i915#1798] / [i915#1982] / [i915#456]) +1 similar issue
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-tglb1/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-c.html
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb2/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-c.html

  * igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes:
    - shard-iclb:         [PASS][46] -> [INCOMPLETE][47] ([i915#1185] / [i915#1602] / [i915#250])
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-iclb1/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes.html
   [47]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-iclb5/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes.html
    - shard-kbl:          [PASS][48] -> [DMESG-WARN][49] ([i915#1602])
   [48]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-kbl7/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes.html
   [49]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-kbl7/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes.html
    - shard-hsw:          [PASS][50] -> [DMESG-WARN][51] ([i915#2637]) +1 similar issue
   [50]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-hsw1/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes.html
   [51]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-hsw7/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes.html
    - shard-glk:          [PASS][52] -> [DMESG-WARN][53] ([i915#1602] / [i915#2635])
   [52]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-glk9/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes.html
   [53]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-glk6/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes.html
    - shard-apl:          [PASS][54] -> [DMESG-WARN][55] ([i915#1602] / [i915#2635])
   [54]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-apl1/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes.html
   [55]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-apl2/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes.html

  * igt@kms_psr2_su@frontbuffer:
    - shard-iclb:         [PASS][56] -> [SKIP][57] ([fdo#109642] / [fdo#111068])
   [56]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-iclb2/igt@kms_psr2_su@frontbuffer.html
   [57]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-iclb4/igt@kms_psr2_su@frontbuffer.html

  * igt@kms_psr@psr2_cursor_render:
    - shard-iclb:         [PASS][58] -> [SKIP][59] ([fdo#109441]) +1 similar issue
   [58]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-iclb2/igt@kms_psr@psr2_cursor_render.html
   [59]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-iclb1/igt@kms_psr@psr2_cursor_render.html

  * igt@prime_nv_api@i915_nv_import_twice_check_flink_name:
    - shard-tglb:         NOTRUN -> [SKIP][60] ([fdo#109291])
   [60]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb6/igt@prime_nv_api@i915_nv_import_twice_check_flink_name.html

  
#### Possible fixes ####

  * {igt@gem_exec_schedule@u-fairslice@rcs0}:
    - shard-kbl:          [DMESG-WARN][61] ([i915#1610]) -> [PASS][62]
   [61]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-kbl7/igt@gem_exec_schedule@u-fairslice@rcs0.html
   [62]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-kbl6/igt@gem_exec_schedule@u-fairslice@rcs0.html
    - shard-apl:          [DMESG-WARN][63] ([i915#1610]) -> [PASS][64]
   [63]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-apl1/igt@gem_exec_schedule@u-fairslice@rcs0.html
   [64]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-apl8/igt@gem_exec_schedule@u-fairslice@rcs0.html

  * {igt@gem_exec_schedule@u-fairslice@vecs0}:
    - shard-tglb:         [DMESG-WARN][65] ([i915#2803]) -> [PASS][66]
   [65]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-tglb3/igt@gem_exec_schedule@u-fairslice@vecs0.html
   [66]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb6/igt@gem_exec_schedule@u-fairslice@vecs0.html

  * igt@kms_concurrent@pipe-b:
    - shard-kbl:          [DMESG-WARN][67] ([i915#180] / [i915#78]) -> [PASS][68]
   [67]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-kbl2/igt@kms_concurrent@pipe-b.html
   [68]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-kbl1/igt@kms_concurrent@pipe-b.html

  * igt@kms_cursor_crc@pipe-b-cursor-suspend:
    - shard-apl:          [DMESG-WARN][69] ([i915#2635]) -> [PASS][70]
   [69]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-apl7/igt@kms_cursor_crc@pipe-b-cursor-suspend.html
   [70]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-apl7/igt@kms_cursor_crc@pipe-b-cursor-suspend.html
    - shard-iclb:         [DMESG-WARN][71] -> [PASS][72]
   [71]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-iclb5/igt@kms_cursor_crc@pipe-b-cursor-suspend.html
   [72]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-iclb2/igt@kms_cursor_crc@pipe-b-cursor-suspend.html
    - shard-glk:          [DMESG-WARN][73] ([i915#2635]) -> [PASS][74]
   [73]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-glk7/igt@kms_cursor_crc@pipe-b-cursor-suspend.html
   [74]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-glk3/igt@kms_cursor_crc@pipe-b-cursor-suspend.html
    - shard-hsw:          [DMESG-WARN][75] ([i915#2637]) -> [PASS][76]
   [75]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-hsw2/igt@kms_cursor_crc@pipe-b-cursor-suspend.html
   [76]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-hsw7/igt@kms_cursor_crc@pipe-b-cursor-suspend.html
    - shard-kbl:          [DMESG-WARN][77] -> [PASS][78]
   [77]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-kbl3/igt@kms_cursor_crc@pipe-b-cursor-suspend.html
   [78]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-kbl7/igt@kms_cursor_crc@pipe-b-cursor-suspend.html
    - shard-tglb:         [INCOMPLETE][79] ([i915#1436] / [i915#1798] / [i915#1982] / [i915#456]) -> [PASS][80]
   [79]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-tglb7/igt@kms_cursor_crc@pipe-b-cursor-suspend.html
   [80]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb1/igt@kms_cursor_crc@pipe-b-cursor-suspend.html

  * igt@kms_cursor_legacy@2x-long-cursor-vs-flip-atomic:
    - shard-hsw:          [FAIL][81] ([i915#96]) -> [PASS][82]
   [81]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-hsw1/igt@kms_cursor_legacy@2x-long-cursor-vs-flip-atomic.html
   [82]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-hsw1/igt@kms_cursor_legacy@2x-long-cursor-vs-flip-atomic.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@a-edp1:
    - shard-tglb:         [FAIL][83] ([i915#2598]) -> [PASS][84]
   [83]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-tglb7/igt@kms_flip@flip-vs-expired-vblank-interruptible@a-edp1.html
   [84]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb2/igt@kms_flip@flip-vs-expired-vblank-interruptible@a-edp1.html

  * igt@kms_psr2_su@page_flip:
    - shard-iclb:         [SKIP][85] ([fdo#109642] / [fdo#111068]) -> [PASS][86]
   [85]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-iclb3/igt@kms_psr2_su@page_flip.html
   [86]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-iclb2/igt@kms_psr2_su@page_flip.html

  * igt@kms_vblank@pipe-b-ts-continuation-dpms-rpm:
    - shard-hsw:          [SKIP][87] ([fdo#109271]) -> [PASS][88]
   [87]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-hsw8/igt@kms_vblank@pipe-b-ts-continuation-dpms-rpm.html
   [88]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-hsw4/igt@kms_vblank@pipe-b-ts-continuation-dpms-rpm.html

  
#### Warnings ####

  * igt@i915_pm_dc@dc3co-vpb-simulation:
    - shard-iclb:         [SKIP][89] ([i915#588]) -> [SKIP][90] ([i915#658])
   [89]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-iclb2/igt@i915_pm_dc@dc3co-vpb-simulation.html
   [90]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-iclb5/igt@i915_pm_dc@dc3co-vpb-simulation.html

  * igt@i915_pm_rpm@gem-execbuf-stress-pc8:
    - shard-iclb:         [SKIP][91] ([i915#579]) -> [SKIP][92] ([fdo#109293] / [fdo#109506])
   [91]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-iclb8/igt@i915_pm_rpm@gem-execbuf-stress-pc8.html
   [92]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-iclb2/igt@i915_pm_rpm@gem-execbuf-stress-pc8.html
    - shard-tglb:         [SKIP][93] ([i915#579]) -> [SKIP][94] ([fdo#109506] / [i915#2411])
   [93]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-tglb6/igt@i915_pm_rpm@gem-execbuf-stress-pc8.html
   [94]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb2/igt@i915_pm_rpm@gem-execbuf-stress-pc8.html

  * igt@runner@aborted:
    - shard-hsw:          [FAIL][95] ([i915#2295]) -> ([FAIL][96], [FAIL][97]) ([fdo#109271] / [i915#2295])
   [95]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-hsw2/igt@runner@aborted.html
   [96]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-hsw7/igt@runner@aborted.html
   [97]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-hsw2/igt@runner@aborted.html
    - shard-kbl:          ([FAIL][98], [FAIL][99], [FAIL][100]) ([i915#1814] / [i915#2295] / [i915#2426] / [i915#2722] / [i915#483]) -> ([FAIL][101], [FAIL][102]) ([i915#1814] / [i915#2295] / [i915#2722] / [i915#483])
   [98]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-kbl7/igt@runner@aborted.html
   [99]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-kbl3/igt@runner@aborted.html
   [100]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-kbl2/igt@runner@aborted.html
   [101]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-kbl4/igt@runner@aborted.html
   [102]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-kbl7/igt@runner@aborted.html
    - shard-apl:          ([FAIL][103], [FAIL][104], [FAIL][105]) ([i915#1610] / [i915#1814] / [i915#2295] / [i915#2426] / [i915#2722]) -> ([FAIL][106], [FAIL][107], [FAIL][108]) ([fdo#109271] / [i915#1814] / [i915#2295] / [i915#2722])
   [103]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-apl7/igt@runner@aborted.html
   [104]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-apl1/igt@runner@aborted.html
   [105]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-apl6/igt@runner@aborted.html
   [106]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-apl3/igt@runner@aborted.html
   [107]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-apl4/igt@runner@aborted.html
   [108]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-apl2/igt@runner@aborted.html
    - shard-glk:          ([FAIL][109], [FAIL][110]) ([i915#1814] / [i915#2295] / [i915#2722] / [i915#483] / [k.org#202321]) -> ([FAIL][111], [FAIL][112], [FAIL][113]) ([i915#1814] / [i915#2295] / [i915#2722] / [k.org#202321])
   [109]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-glk7/igt@runner@aborted.html
   [110]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-glk3/igt@runner@aborted.html
   [111]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-glk6/igt@runner@aborted.html
   [112]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-glk5/igt@runner@aborted.html
   [113]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-glk5/igt@runner@aborted.html
    - shard-tglb:         ([FAIL][114], [FAIL][115], [FAIL][116]) ([i915#1602] / [i915#1764] / [i915#2295] / [i915#2426] / [i915#2722]) -> ([FAIL][117], [FAIL][118], [FAIL][119]) ([i915#1602] / [i915#1814] / [i915#2295] / [i915#2722])
   [114]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-tglb3/igt@runner@aborted.html
   [115]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-tglb6/igt@runner@aborted.html
   [116]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9495/shard-tglb7/igt@runner@aborted.html
   [117]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb2/igt@runner@aborted.html
   [118]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb8/igt@runner@aborted.html
   [119]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/shard-tglb2/igt@runner@aborted.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109274]: https://bugs.freedesktop.org/show_bug.cgi?id=109274
  [fdo#109280]: https://bugs.freedesktop.org/show_bug.cgi?id=109280
  [fdo#109284]: https://bugs.freedesktop.org/show_bug.cgi?id=109284
  [fdo#109289]: https://bugs.freedesktop.org/show_bug.cgi?id=109289
  [fdo#109291]: https://bugs.freedesktop.org/show_bug.cgi?id=109291
  [fdo#109293]: https://bugs.freedesktop.org/show_bug.cgi?id=109293
  [fdo#109441]: https://bugs.freedesktop.org/show_bug.cgi?id=109441
  [fdo#109506]: https://bugs.freedesktop.org/show_bug.cgi?id=109506
  [fdo#109642]: https://bugs.freedesktop.org/show_bug.cgi?id=109642
  [fdo#110723]: https://bugs.freedesktop.org/show_bug.cgi?id=110723
  [fdo#111068]: https://bugs.freedesktop.org/show_bug.cgi?id=111068
  [fdo#111614]: https://bugs.freedesktop.org/show_bug.cgi?id=111614
  [fdo#111615]: https://bugs.freedesktop.org/show_bug.cgi?id=111615
  [fdo#111825]: https://bugs.freedesktop.org/show_bug.cgi?id=111825
  [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
  [fdo#111828]: https://bugs.freedesktop.org/show_bug.cgi?id=111828
  [fdo#112283]: https://bugs.freedesktop.org/show_bug.cgi?id=112283
  [fdo#112306]: https://bugs.freedesktop.org/show_bug.cgi?id=112306
  [i915#1185]: https://gitlab.freedesktop.org/drm/intel/issues/1185
  [i915#1187]: https://gitlab.freedesktop.org/drm/intel/issues/1187
  [i915#1319]: https://gitlab.freedesktop.org/drm/intel/issues/1319
  [i915#1436]: https://gitlab.freedesktop.org/drm/intel/issues/1436
  [i915#155]: https://gitlab.freedesktop.org/drm/intel/issues/155
  [i915#1567]: https://gitlab.freedesktop.org/drm/intel/issues/1567
  [i915#1602]: https://gitlab.freedesktop.org/drm/intel/issues/1602
  [i915#1610]: https://gitlab.freedesktop.org/drm/intel/issues/1610
  [i915#1764]: https://gitlab.freedesktop.org/drm/intel/issues/1764
  [i915#1798]: https://gitlab.freedesktop.org/drm/intel/issues/1798
  [i915#180]: https://gitlab.freedesktop.org/drm/intel/issues/180
  [i915#1814]: https://gitlab.freedesktop.org/drm/intel/issues/1814
  [i915#1982]: https://gitlab.freedesktop.org/drm/intel/issues/1982
  [i915#2122]: https://gitlab.freedesktop.org/drm/intel/issues/2122
  [i915#2295]: https://gitlab.freedesktop.org/drm/intel/issues/2295
  [i915#2389]: https://gitlab.freedesktop.org/drm/intel/issues/2389
  [i915#2411]: https://gitlab.freedesktop.org/drm/intel/issues/2411
  [i915#2426]: https://gitlab.freedesktop.org/drm/intel/issues/2426
  [i915#250]: https://gitlab.freedesktop.org/drm/intel/issues/250
  [i915#2598]: https://gitlab.freedesktop.org/drm/intel/issues/2598
  [i915#2635]: https://gitlab.freedesktop.org/drm/intel/issues/2635
  [i915#2637]: https://gitlab.freedesktop.org/drm/intel/issues/2637
  [i915#2722]: https://gitlab.freedesktop.org/drm/intel/issues/2722
  [i915#2795]: https://gitlab.freedesktop.org/drm/intel/issues/2795
  [i915#2803]: https://gitlab.freedesktop.org/drm/intel/issues/2803
  [i915#456]: https://gitlab.freedesktop.org/drm/intel/issues/456
  [i915#483]: https://gitlab.freedesktop.org/drm/intel/issues/483
  [i915#533]: https://gitlab.freedesktop.org/drm/intel/issues/533
  [i915#54]: https://gitlab.freedesktop.org/drm/intel/issues/54
  [i915#579]: https://gitlab.freedesktop.org/drm/intel/issues/579
  [i915#588]: https://gitlab.freedesktop.org/drm/intel/issues/588
  [i915#658]: https://gitlab.freedesktop.org/drm/intel/issues/658
  [i915#78]: https://gitlab.freedesktop.org/drm/intel/issues/78
  [i915#96]: https://gitlab.freedesktop.org/drm/intel/issues/96
  [k.org#202321]: https://bugzilla.kernel.org/show_bug.cgi?id=202321


Participating hosts (10 -> 8)
------------------------------

  Missing    (2): pig-skl-6260u pig-glk-j5005 


Build changes
-------------

  * CI: CI-20190529 -> None
  * IGT: IGT_5905 -> IGTPW_5302
  * Piglit: piglit_4509 -> None

  CI-20190529: 20190529
  CI_DRM_9495: 2960e86fd8fd7659400d05f40a1e06d3a97b6987 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_5302: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/index.html
  IGT_5905: 3d0934900bddeb7a68f1abab4cd05077f0609e32 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5302/index.html

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

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

_______________________________________________
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.BUILD: failure for kms_rotation_crc:Add HW rotation test case for amdgpu (rev2)
  2020-12-16 22:12 [igt-dev] [PATCH] kms_rotation_crc:Add HW rotation test case for amdgpu Sung Joon Kim
                   ` (2 preceding siblings ...)
  2020-12-17  2:32 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork
@ 2020-12-17 13:41 ` Patchwork
  3 siblings, 0 replies; 5+ messages in thread
From: Patchwork @ 2020-12-17 13:41 UTC (permalink / raw)
  To: Kim, Sung joon; +Cc: igt-dev

== Series Details ==

Series: kms_rotation_crc:Add HW rotation test case for amdgpu (rev2)
URL   : https://patchwork.freedesktop.org/series/85018/
State : failure

== Summary ==

Applying: kms_rotation_crc:Add HW rotation test case for amdgpu
Patch failed at 0001 kms_rotation_crc:Add HW rotation test case for amdgpu
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".


_______________________________________________
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:[~2020-12-17 13:41 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-16 22:12 [igt-dev] [PATCH] kms_rotation_crc:Add HW rotation test case for amdgpu Sung Joon Kim
     [not found] ` <MN2PR12MB3054150157A5A6E90F904EF997C50@MN2PR12MB3054.namprd12.prod.outlook.com>
2020-12-16 22:43   ` Kim, Sung joon
2020-12-16 23:09 ` [igt-dev] ✓ Fi.CI.BAT: success for " Patchwork
2020-12-17  2:32 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork
2020-12-17 13:41 ` [igt-dev] ✗ Fi.CI.BUILD: failure for kms_rotation_crc:Add HW rotation test case for amdgpu (rev2) Patchwork

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.