All of lore.kernel.org
 help / color / mirror / Atom feed
* [igt-dev] [PATCH i-g-t v2 0/2] validate color tests using chamelium.
@ 2020-01-16  6:19 Kunal Joshi
  2020-01-16  6:19 ` [igt-dev] [PATCH i-g-t v2 1/2] lib/igt_chamelium: added function returning a bool to compare framebuffer reference with framedump Kunal Joshi
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Kunal Joshi @ 2020-01-16  6:19 UTC (permalink / raw)
  To: igt-dev; +Cc: Kunal Joshi, ville.syrjala, petri.latvala, daniel.vetter

For gen11+ platforms, there are frequent crc mismatch issues observed
in color tests. This is happening due to hardware limitation (pipe rounding).
One of the solutions to fix this is by rewriting color tests and making them
compatible with chamelium.

In this patch series, color tests are modified to have frame dump comparison
instead of crc comparison using chamelium hooks. This will be useful even for
future platforms. Also, with this approach we could enable limited-range
subtest which was commented in kms_color because of crc mismatch.

Kunal Joshi (2):
  lib/igt_chamelium: added function returning a bool to compare
    framebuffer reference with framedump.
  tests/kms_color_chamelium: add subtests to validate color.

 lib/igt_chamelium.c         |   65 +++
 lib/igt_chamelium.h         |    5 +
 tests/Makefile.am           |    1 +
 tests/kms_color_chamelium.c | 1130 +++++++++++++++++++++++++++++++++++++++++++
 tests/meson.build           |    1 +
 5 files changed, 1202 insertions(+)
 create mode 100644 tests/kms_color_chamelium.c

-- 
2.7.4

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

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

* [igt-dev] [PATCH i-g-t v2 1/2] lib/igt_chamelium: added function returning a bool to compare framebuffer reference with framedump.
  2020-01-16  6:19 [igt-dev] [PATCH i-g-t v2 0/2] validate color tests using chamelium Kunal Joshi
@ 2020-01-16  6:19 ` Kunal Joshi
  2020-01-16  6:19 ` [igt-dev] [PATCH i-g-t v2 2/2] tests/kms_color_chamelium: add subtests to validate color Kunal Joshi
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Kunal Joshi @ 2020-01-16  6:19 UTC (permalink / raw)
  To: igt-dev; +Cc: Kunal Joshi, ville.syrjala, petri.latvala, daniel.vetter

Added chamelium_frame_match_or_dump which returns bool that the captured
frame matches with reference framebuffer.

(v2)
        Removed previously added function chamelium_assert_frame_dump_eq.

Signed-off-by: Kunal Joshi <kunal1.joshi@intel.com>
Signed-off-by: Swati Sharma <swati2.sharma@intel.com>
Suggested-by: Uma Shankar <uma.shankar@intel.com>
---
 lib/igt_chamelium.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/igt_chamelium.h |  5 +++++
 2 files changed, 70 insertions(+)

diff --git a/lib/igt_chamelium.c b/lib/igt_chamelium.c
index 9971f51..68c4973 100644
--- a/lib/igt_chamelium.c
+++ b/lib/igt_chamelium.c
@@ -1632,6 +1632,71 @@ void chamelium_assert_frame_match_or_dump(struct chamelium *chamelium,
 }
 
 /**
+ * chamelium_assert_frame_match_or_dump:
+ * @chamelium: The chamelium instance the frame dump belongs to
+ * @frame: The chamelium frame dump to match
+ * @fb: pointer to an #igt_fb structure
+ * @check: the type of frame matching check to use
+ *
+ * Returns bool that the provided captured frame matches the reference
+ * frame from the framebuffer. If they do not, this saves the reference
+ * and captured frames to a png file.
+ */
+bool chamelium_frame_match_or_dump(struct chamelium *chamelium,
+				   struct chamelium_port *port,
+				   const struct chamelium_frame_dump *frame,
+				   struct igt_fb *fb,
+				   enum chamelium_check check)
+{
+	cairo_surface_t *reference;
+	cairo_surface_t *capture;
+	igt_crc_t *reference_crc;
+	igt_crc_t *capture_crc;
+	bool match;
+
+	/* Grab the reference frame from framebuffer */
+	reference = igt_get_cairo_surface(chamelium->drm_fd, fb);
+
+	/* Grab the captured frame from chamelium */
+	capture = convert_frame_dump_argb32(frame);
+
+	switch (check) {
+	case CHAMELIUM_CHECK_ANALOG:
+		match = igt_check_analog_frame_match(reference, capture);
+		break;
+	case CHAMELIUM_CHECK_CHECKERBOARD:
+		match = igt_check_checkerboard_frame_match(reference, capture);
+		break;
+	default:
+		igt_assert(false);
+	}
+
+	if (!match && igt_frame_dump_is_enabled()) {
+		reference_crc = malloc(sizeof(igt_crc_t));
+		igt_assert(reference_crc);
+
+		/* Calculate the reference frame CRC. */
+		chamelium_do_calculate_fb_crc(reference, reference_crc);
+
+		/* Get the captured frame CRC from the Chamelium. */
+		capture_crc = chamelium_get_crc_for_area(chamelium, port, 0, 0,
+							 0, 0);
+		igt_assert(capture_crc);
+
+		compared_frames_dump(reference, capture, reference_crc,
+				     capture_crc);
+
+		free(reference_crc);
+		free(capture_crc);
+	}
+
+	cairo_surface_destroy(reference);
+	cairo_surface_destroy(capture);
+
+	return match;
+}
+
+/**
  * chamelium_analog_frame_crop:
  * @chamelium: The Chamelium instance to use
  * @dump: The chamelium frame dump to crop
diff --git a/lib/igt_chamelium.h b/lib/igt_chamelium.h
index 08705a9..d03c924 100644
--- a/lib/igt_chamelium.h
+++ b/lib/igt_chamelium.h
@@ -204,6 +204,11 @@ void chamelium_assert_frame_match_or_dump(struct chamelium *chamelium,
 					  const struct chamelium_frame_dump *frame,
 					  struct igt_fb *fb,
 					  enum chamelium_check check);
+bool chamelium_frame_match_or_dump(struct chamelium *chamelium,
+				   struct chamelium_port *port,
+				   const struct chamelium_frame_dump *frame,
+				   struct igt_fb *fb,
+				   enum chamelium_check check);
 void chamelium_crop_analog_frame(struct chamelium_frame_dump *dump, int width,
 				 int height);
 void chamelium_destroy_frame_dump(struct chamelium_frame_dump *dump);
-- 
2.7.4

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

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

* [igt-dev] [PATCH i-g-t v2 2/2] tests/kms_color_chamelium: add subtests to validate color.
  2020-01-16  6:19 [igt-dev] [PATCH i-g-t v2 0/2] validate color tests using chamelium Kunal Joshi
  2020-01-16  6:19 ` [igt-dev] [PATCH i-g-t v2 1/2] lib/igt_chamelium: added function returning a bool to compare framebuffer reference with framedump Kunal Joshi
@ 2020-01-16  6:19 ` Kunal Joshi
  2020-01-20  7:38   ` Shankar, Uma
  2020-01-16 15:03 ` [igt-dev] ✓ Fi.CI.BAT: success for validate color tests using chamelium. (rev2) Patchwork
  2020-01-19  7:07 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
  3 siblings, 1 reply; 6+ messages in thread
From: Kunal Joshi @ 2020-01-16  6:19 UTC (permalink / raw)
  To: igt-dev; +Cc: Kunal Joshi, ville.syrjala, petri.latvala, daniel.vetter

To validate color subtests using chamelium, subtests modified
to do frame dump comparison instead of crc comparison.
Tests require chamelium and will validate color features
at pipe level.

(v2)
        Comparing framedump with framebuffer reference instead of
        comparing two framedump.

Signed-off-by: Kunal Joshi <kunal1.joshi@intel.com>
Signed-off-by: Swati Sharma <swati2.sharma@intel.com>
Suggested-by: Uma Shankar <uma.shankar@intel.com>
---
 tests/Makefile.am           |    1 +
 tests/kms_color_chamelium.c | 1130 +++++++++++++++++++++++++++++++++++++++++++
 tests/meson.build           |    1 +
 3 files changed, 1132 insertions(+)
 create mode 100644 tests/kms_color_chamelium.c

diff --git a/tests/Makefile.am b/tests/Makefile.am
index fc30524..50fc989 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -13,6 +13,7 @@ endif
 if HAVE_CHAMELIUM
 TESTS_progs += \
 	kms_chamelium \
+	kms_color_chamelium \
 	$(NULL)
 endif
 
diff --git a/tests/kms_color_chamelium.c b/tests/kms_color_chamelium.c
new file mode 100644
index 0000000..ee0c6c5
--- /dev/null
+++ b/tests/kms_color_chamelium.c
@@ -0,0 +1,1130 @@
+/*
+ * Copyright © 2020 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 <math.h>
+#include <unistd.h>
+
+#include "drm.h"
+#include "drmtest.h"
+#include "igt.h"
+
+IGT_TEST_DESCRIPTION("Test Color Features at Pipe level");
+
+/* Internal */
+typedef struct {
+	double r, g, b;
+} color_t;
+
+typedef struct {
+	int drm_fd;
+	uint32_t devid;
+	igt_display_t display;
+
+	uint32_t color_depth;
+	uint64_t degamma_lut_size;
+	uint64_t gamma_lut_size;
+
+	struct chamelium *chamelium;
+	struct chamelium_port **ports;
+	int port_count;
+} data_t;
+
+typedef struct {
+	int size;
+	double coeffs[];
+} gamma_lut_t;
+
+static void paint_gradient_rectangles(data_t *data,
+				      drmModeModeInfo *mode,
+				      color_t *colors,
+				      struct igt_fb *fb)
+{
+	cairo_t *cr = igt_get_cairo_ctx(data->drm_fd, fb);
+	int i, l = mode->hdisplay / 3;
+	int rows_remaining = mode->hdisplay % 3;
+
+	/* Paint 3 gradient rectangles with red/green/blue between 1.0 and
+	 * 0.5. We want to avoid 0 so each max LUTs only affect their own
+	 * rectangle.
+	 */
+	for (i = 0 ; i < 3; i++) {
+		igt_paint_color_gradient_range(cr, i * l, 0, l, mode->vdisplay,
+					       colors[i].r != 0 ? 0.2 : 0,
+					       colors[i].g != 0 ? 0.2 : 0,
+					       colors[i].b != 0 ? 0.2 : 0,
+					       colors[i].r,
+					       colors[i].g,
+					       colors[i].b);
+	}
+
+	if (rows_remaining > 0)
+		igt_paint_color_gradient_range(cr, i * l, 0, rows_remaining,
+					       mode->vdisplay,
+					       colors[i-1].r != 0 ? 0.2 : 0,
+					       colors[i-1].g != 0 ? 0.2 : 0,
+					       colors[i-1].b != 0 ? 0.2 : 0,
+					       colors[i-1].r,
+					       colors[i-1].g,
+					       colors[i-1].b);
+
+	igt_put_cairo_ctx(data->drm_fd, fb, cr);
+}
+
+static void paint_rectangles(data_t *data,
+			     drmModeModeInfo *mode,
+			     color_t *colors,
+			     struct igt_fb *fb)
+{
+	cairo_t *cr = igt_get_cairo_ctx(data->drm_fd, fb);
+	int i, l = mode->hdisplay / 3;
+	int rows_remaining = mode->hdisplay % 3;
+
+	/* Paint 3 solid rectangles. */
+	for (i = 0 ; i < 3; i++) {
+		igt_paint_color(cr, i * l, 0, l, mode->vdisplay,
+				colors[i].r, colors[i].g, colors[i].b);
+	}
+
+	if (rows_remaining > 0)
+		igt_paint_color(cr, i * l, 0, rows_remaining, mode->vdisplay,
+				colors[i-1].r, colors[i-1].g, colors[i-1].b);
+
+	igt_put_cairo_ctx(data->drm_fd, fb, cr);
+}
+
+static gamma_lut_t *alloc_lut(int lut_size)
+{
+	gamma_lut_t *gamma;
+
+	igt_assert_lt(0, lut_size);
+
+	gamma = malloc(sizeof(*gamma) + lut_size * sizeof(gamma->coeffs[0]));
+	igt_assert(gamma);
+	gamma->size = lut_size;
+
+	return gamma;
+}
+
+static void free_lut(gamma_lut_t *gamma)
+{
+	if (!gamma)
+		return;
+
+	free(gamma);
+}
+
+static gamma_lut_t *generate_table(int lut_size, double exp)
+{
+	gamma_lut_t *gamma = alloc_lut(lut_size);
+	int i;
+
+	gamma->coeffs[0] = 0.0;
+	for (i = 1; i < lut_size; i++)
+		gamma->coeffs[i] = pow(i * 1.0 / (lut_size - 1), exp);
+
+	return gamma;
+}
+
+static gamma_lut_t *generate_table_max(int lut_size)
+{
+	gamma_lut_t *gamma = alloc_lut(lut_size);
+	int i;
+
+	gamma->coeffs[0] = 0.0;
+	for (i = 1; i < lut_size; i++)
+		gamma->coeffs[i] = 1.0;
+
+	return gamma;
+}
+
+static struct drm_color_lut *coeffs_to_lut(data_t *data,
+					   const gamma_lut_t *gamma,
+					   uint32_t color_depth,
+					   int off)
+{
+	struct drm_color_lut *lut;
+	int i, lut_size = gamma->size;
+	uint32_t max_value = (1 << 16) - 1;
+	uint32_t mask;
+
+	if (is_i915_device(data->drm_fd))
+		mask = ((1 << color_depth) - 1) << 8;
+	else
+		mask = max_value;
+
+	lut = malloc(sizeof(struct drm_color_lut) * lut_size);
+
+	if (IS_CHERRYVIEW(data->devid))
+		lut_size -= 1;
+	for (i = 0; i < lut_size; i++) {
+		uint32_t v = (gamma->coeffs[i] * max_value);
+
+		v &= mask;
+
+		lut[i].red = v;
+		lut[i].green = v;
+		lut[i].blue = v;
+	}
+
+	if (IS_CHERRYVIEW(data->devid))
+		lut[lut_size].red =
+			lut[lut_size].green =
+			lut[lut_size].blue = lut[lut_size - 1].red;
+
+	return lut;
+}
+
+static void set_degamma(data_t *data,
+			igt_pipe_t *pipe,
+			const gamma_lut_t *gamma)
+{
+	struct drm_color_lut *lut = coeffs_to_lut(data, gamma,
+						  data->color_depth, 0);
+
+	free(lut);
+}
+
+static void set_gamma(data_t *data,
+		      igt_pipe_t *pipe,
+		      const gamma_lut_t *gamma)
+{
+	size_t size = sizeof(struct drm_color_lut) * gamma->size;
+	struct drm_color_lut *lut = coeffs_to_lut(data, gamma,
+						  data->color_depth, 0);
+
+	igt_pipe_obj_replace_prop_blob(pipe, IGT_CRTC_GAMMA_LUT, lut, size);
+
+	free(lut);
+}
+
+static void set_ctm(igt_pipe_t *pipe, const double *coefficients)
+{
+	struct drm_color_ctm ctm;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(ctm.matrix); i++) {
+		if (coefficients[i] < 0) {
+			ctm.matrix[i] =
+				(int64_t) (-coefficients[i] *
+				((int64_t) 1L << 32));
+			ctm.matrix[i] |= 1ULL << 63;
+		} else
+			ctm.matrix[i] =
+				(int64_t) (coefficients[i] *
+				((int64_t) 1L << 32));
+	}
+
+	igt_pipe_obj_replace_prop_blob(pipe, IGT_CRTC_CTM, &ctm, sizeof(ctm));
+}
+
+static void disable_prop(igt_pipe_t *pipe, enum igt_atomic_crtc_properties prop)
+{
+	if (igt_pipe_obj_has_prop(pipe, prop))
+		igt_pipe_obj_replace_prop_blob(pipe, prop, NULL, 0);
+}
+
+#define disable_degamma(pipe) disable_prop(pipe, IGT_CRTC_DEGAMMA_LUT)
+#define disable_gamma(pipe) disable_prop(pipe, IGT_CRTC_GAMMA_LUT)
+#define disable_ctm(pipe) disable_prop(pipe, IGT_CRTC_CTM)
+
+/*
+ * Draw 3 gradient rectangles in red, green and blue, with a maxed out
+ * degamma LUT and verify we have the same frame dump as drawing solid color
+ * rectangles with linear degamma LUT.
+ */
+static void test_pipe_degamma(data_t *data,
+			      igt_plane_t *primary)
+{
+	igt_output_t *output;
+	gamma_lut_t *degamma_linear, *degamma_full;
+	gamma_lut_t *gamma_linear;
+	color_t red_green_blue[] = {
+		{ 1.0, 0.0, 0.0 },
+		{ 0.0, 1.0, 0.0 },
+		{ 0.0, 0.0, 1.0 }
+	};
+
+	int i;
+	struct chamelium_port *port;
+	char *connected_ports[4];
+	bool valid_output = false;
+
+	for (i = 0; i < data->port_count; i++)
+		connected_ports[i] =
+			(char *) chamelium_port_get_name(data->ports[i]);
+
+	igt_require(igt_pipe_obj_has_prop(primary->pipe, IGT_CRTC_DEGAMMA_LUT));
+	igt_require(igt_pipe_obj_has_prop(primary->pipe, IGT_CRTC_GAMMA_LUT));
+
+	degamma_linear = generate_table(data->degamma_lut_size, 1.0);
+	degamma_full = generate_table_max(data->degamma_lut_size);
+
+	gamma_linear = generate_table(data->gamma_lut_size, 1.0);
+
+	for_each_valid_output_on_pipe(&data->display,
+				      primary->pipe->pipe,
+				      output) {
+		drmModeModeInfo *mode;
+		struct igt_fb fb_modeset, fb, fbref;
+		struct chamelium_frame_dump *frame_fullcolors;
+		int fb_id, fb_modeset_id, fbref_id;
+
+		for (i = 0; i < data->port_count; i++)
+			valid_output |=
+				(strcmp(output->name, connected_ports[i]) == 0);
+		if (!valid_output)
+			continue;
+		else
+			for (i = 0; i < data->port_count; i++)
+				if (strcmp(output->name,
+					   connected_ports[i]) == 0)
+					port = data->ports[i];
+
+		igt_output_set_pipe(output, primary->pipe->pipe);
+		mode = igt_output_get_mode(output);
+
+		/* Create a framebuffer at the size of the output. */
+		fb_id = igt_create_fb(data->drm_fd,
+				      mode->hdisplay,
+				      mode->vdisplay,
+				      DRM_FORMAT_XRGB8888,
+				      LOCAL_DRM_FORMAT_MOD_NONE,
+				      &fb);
+		igt_assert(fb_id);
+
+		fb_modeset_id = igt_create_fb(data->drm_fd,
+					      mode->hdisplay,
+					      mode->vdisplay,
+					      DRM_FORMAT_XRGB8888,
+					      LOCAL_DRM_FORMAT_MOD_NONE,
+					      &fb_modeset);
+		igt_assert(fb_modeset_id);
+
+		fbref_id = igt_create_fb(data->drm_fd,
+					      mode->hdisplay,
+					      mode->vdisplay,
+					      DRM_FORMAT_XRGB8888,
+					      LOCAL_DRM_FORMAT_MOD_NONE,
+					      &fbref);
+		igt_assert(fbref_id);
+
+		igt_plane_set_fb(primary, &fb_modeset);
+		disable_ctm(primary->pipe);
+		disable_degamma(primary->pipe);
+		set_gamma(data, primary->pipe, gamma_linear);
+		igt_display_commit(&data->display);
+
+		/* Draw solid colors with no degamma transformation. */
+		paint_rectangles(data, mode, red_green_blue, &fbref);
+
+		/* Draw a gradient with degamma LUT to remap all
+		 * values to max red/green/blue.
+		 */
+		paint_gradient_rectangles(data, mode, red_green_blue, &fb);
+		igt_plane_set_fb(primary, &fb);
+		set_degamma(data, primary->pipe, degamma_full);
+		igt_display_commit(&data->display);
+		chamelium_capture(data->chamelium, port, 0, 0, 0, 0, 1);
+		frame_fullcolors =
+			chamelium_read_captured_frame(data->chamelium, 0);
+
+		/* Verify that the framebuffer reference of the software
+		 * computed output is equal to the frame dump of the degamma
+		 * LUT transformation output.
+		 */
+		igt_assert(chamelium_frame_match_or_dump(data->chamelium, port,
+							 frame_fullcolors,
+							 &fbref,
+							 CHAMELIUM_CHECK_ANALOG));
+
+		igt_plane_set_fb(primary, NULL);
+		igt_output_set_pipe(output, PIPE_NONE);
+	}
+
+	free_lut(degamma_linear);
+	free_lut(degamma_full);
+	free_lut(gamma_linear);
+}
+
+/*
+ * Draw 3 gradient rectangles in red, green and blue, with a maxed out
+ * gamma LUT and verify we have the same frame dump as drawing solid
+ * color rectangles.
+ */
+static void test_pipe_gamma(data_t *data,
+			    igt_plane_t *primary)
+{
+	igt_output_t *output;
+	gamma_lut_t *gamma_full;
+	color_t red_green_blue[] = {
+		{ 1.0, 0.0, 0.0 },
+		{ 0.0, 1.0, 0.0 },
+		{ 0.0, 0.0, 1.0 }
+	};
+
+	int i;
+	struct chamelium_port *port;
+	char *connected_ports[4];
+	bool valid_output = false;
+
+	for (i = 0; i < data->port_count; i++)
+		connected_ports[i] =
+			(char *) chamelium_port_get_name(data->ports[i]);
+
+	igt_require(igt_pipe_obj_has_prop(primary->pipe, IGT_CRTC_GAMMA_LUT));
+
+	gamma_full = generate_table_max(data->gamma_lut_size);
+
+	for_each_valid_output_on_pipe(&data->display,
+				      primary->pipe->pipe,
+				      output) {
+		drmModeModeInfo *mode;
+		struct igt_fb fb_modeset, fb, fbref;
+		struct chamelium_frame_dump *frame_fullcolors;
+		int fb_id, fb_modeset_id, fbref_id;
+
+		for (i = 0; i < data->port_count; i++)
+			valid_output |=
+				(strcmp(output->name, connected_ports[i]) == 0);
+		if (!valid_output)
+			continue;
+		else
+			for (i = 0; i < data->port_count; i++)
+				if (strcmp(output->name,
+					   connected_ports[i]) == 0)
+					port = data->ports[i];
+
+		igt_output_set_pipe(output, primary->pipe->pipe);
+		mode = igt_output_get_mode(output);
+
+		/* Create a framebuffer at the size of the output. */
+		fb_id = igt_create_fb(data->drm_fd,
+				      mode->hdisplay,
+				      mode->vdisplay,
+				      DRM_FORMAT_XRGB8888,
+				      LOCAL_DRM_FORMAT_MOD_NONE,
+				      &fb);
+		igt_assert(fb_id);
+
+		fb_modeset_id = igt_create_fb(data->drm_fd,
+					      mode->hdisplay,
+					      mode->vdisplay,
+					      DRM_FORMAT_XRGB8888,
+					      LOCAL_DRM_FORMAT_MOD_NONE,
+					      &fb_modeset);
+		igt_assert(fb_modeset_id);
+
+		fbref_id = igt_create_fb(data->drm_fd,
+				      mode->hdisplay,
+				      mode->vdisplay,
+				      DRM_FORMAT_XRGB8888,
+				      LOCAL_DRM_FORMAT_MOD_NONE,
+				      &fbref);
+		igt_assert(fbref_id);
+
+		igt_plane_set_fb(primary, &fb_modeset);
+		disable_ctm(primary->pipe);
+		disable_degamma(primary->pipe);
+		set_gamma(data, primary->pipe, gamma_full);
+		igt_display_commit(&data->display);
+
+		/* Draw solid colors with no gamma transformation. */
+		paint_rectangles(data, mode, red_green_blue, &fbref);
+
+		/* Draw a gradient with gamma LUT to remap all values
+		 * to max red/green/blue.
+		 */
+		paint_gradient_rectangles(data, mode, red_green_blue, &fb);
+		igt_plane_set_fb(primary, &fb);
+		igt_display_commit(&data->display);
+		chamelium_capture(data->chamelium, port, 0, 0, 0, 0, 1);
+		frame_fullcolors =
+			chamelium_read_captured_frame(data->chamelium, 0);
+
+		/* Verify that the framebuffer reference of the software
+		 * computed output is equal to the frame dump of the
+		 * degamma LUT transformation output.
+		 */
+		igt_assert(chamelium_frame_match_or_dump(data->chamelium, port,
+							 frame_fullcolors,
+							 &fbref,
+							 CHAMELIUM_CHECK_ANALOG));
+
+		igt_plane_set_fb(primary, NULL);
+		igt_output_set_pipe(output, PIPE_NONE);
+	}
+
+	free_lut(gamma_full);
+}
+
+/*
+ * Draw 3 rectangles using before colors with the ctm matrix apply and verify
+ * the frame dump is equal to using after colors with an identify ctm matrix.
+ */
+static bool test_pipe_ctm(data_t *data,
+			  igt_plane_t *primary,
+			  color_t *before,
+			  color_t *after,
+			  double *ctm_matrix)
+{
+	gamma_lut_t *degamma_linear, *gamma_linear;
+	igt_output_t *output;
+
+	int i;
+	bool ret = true;
+	struct chamelium_port *port;
+	char *connected_ports[4];
+	bool valid_output = false;
+
+	igt_require(igt_pipe_obj_has_prop(primary->pipe, IGT_CRTC_CTM));
+
+	for (i = 0; i < data->port_count; i++)
+		connected_ports[i] =
+			(char *) chamelium_port_get_name(data->ports[i]);
+
+	degamma_linear = generate_table(data->degamma_lut_size, 1.0);
+	gamma_linear = generate_table(data->gamma_lut_size, 1.0);
+
+	for_each_valid_output_on_pipe(&data->display,
+				      primary->pipe->pipe,
+				      output) {
+		drmModeModeInfo *mode;
+		struct igt_fb fb_modeset, fb, fbref;
+		struct chamelium_frame_dump *frame_hardware;
+		int fb_id, fb_modeset_id, fbref_id;
+
+		for (i = 0; i < data->port_count; i++)
+			valid_output |=
+				(strcmp(output->name, connected_ports[i]) == 0);
+		if (!valid_output)
+			continue;
+		else
+			for (i = 0; i < data->port_count; i++)
+				if (strcmp(output->name,
+					   connected_ports[i]) == 0)
+					port = data->ports[i];
+
+		igt_output_set_pipe(output, primary->pipe->pipe);
+		mode = igt_output_get_mode(output);
+
+		/* Create a framebuffer at the size of the output. */
+		fb_id = igt_create_fb(data->drm_fd,
+				      mode->hdisplay,
+				      mode->vdisplay,
+				      DRM_FORMAT_XRGB8888,
+				      LOCAL_DRM_FORMAT_MOD_NONE,
+				      &fb);
+		igt_assert(fb_id);
+
+		fb_modeset_id = igt_create_fb(data->drm_fd,
+					      mode->hdisplay,
+					      mode->vdisplay,
+					      DRM_FORMAT_XRGB8888,
+					      LOCAL_DRM_FORMAT_MOD_NONE,
+					      &fb_modeset);
+		igt_assert(fb_modeset_id);
+
+		fbref_id = igt_create_fb(data->drm_fd,
+				      mode->hdisplay,
+				      mode->vdisplay,
+				      DRM_FORMAT_XRGB8888,
+				      LOCAL_DRM_FORMAT_MOD_NONE,
+				      &fbref);
+		igt_assert(fbref_id);
+
+		igt_plane_set_fb(primary, &fb_modeset);
+
+		if (memcmp(before, after, sizeof(color_t))) {
+			set_degamma(data, primary->pipe, degamma_linear);
+			set_gamma(data, primary->pipe, gamma_linear);
+		} else {
+			/* Disable Degamma and Gamma for ctm max test */
+			disable_degamma(primary->pipe);
+			disable_gamma(primary->pipe);
+		}
+
+		disable_ctm(primary->pipe);
+		igt_display_commit(&data->display);
+
+		paint_rectangles(data, mode, after, &fbref);
+
+		/* With CTM transformation. */
+		paint_rectangles(data, mode, before, &fb);
+		igt_plane_set_fb(primary, &fb);
+		set_ctm(primary->pipe, ctm_matrix);
+		igt_display_commit(&data->display);
+		chamelium_capture(data->chamelium, port, 0, 0, 0, 0, 1);
+		frame_hardware =
+			chamelium_read_captured_frame(data->chamelium, 0);
+
+		/* Verify that the framebuffer reference of the software
+		 * computed output is equal to the frame dump of the CTM
+		 * matrix transformation output.
+		 */
+		ret &= chamelium_frame_match_or_dump(data->chamelium, port,
+						     frame_hardware,
+						     &fbref,
+						     CHAMELIUM_CHECK_ANALOG);
+
+		igt_plane_set_fb(primary, NULL);
+		igt_output_set_pipe(output, PIPE_NONE);
+	}
+
+	free_lut(degamma_linear);
+	free_lut(gamma_linear);
+
+	return ret;
+}
+
+static void test_pipe_limited_range_ctm(data_t *data,
+					igt_plane_t *primary)
+{
+	double limited_result = 235.0 / 255.0;
+	color_t red_green_blue_limited[] = {
+		{ limited_result, 0.0, 0.0 },
+		{ 0.0, limited_result, 0.0 },
+		{ 0.0, 0.0, limited_result }
+	};
+	color_t red_green_blue_full[] = {
+		{ 0.5, 0.0, 0.0 },
+		{ 0.0, 0.5, 0.0 },
+		{ 0.0, 0.0, 0.5 }
+	};
+	double ctm[] = { 1.0, 0.0, 0.0,
+			0.0, 1.0, 0.0,
+			0.0, 0.0, 1.0 };
+	gamma_lut_t *degamma_linear, *gamma_linear;
+	igt_output_t *output;
+	bool has_broadcast_rgb_output = false;
+
+	int i;
+	struct chamelium_port *port;
+	char *connected_ports[4];
+	bool valid_output = false;
+
+	degamma_linear = generate_table(data->degamma_lut_size, 1.0);
+	gamma_linear = generate_table(data->gamma_lut_size, 1.0);
+
+	for (i = 0; i < data->port_count; i++)
+		connected_ports[i] =
+			(char *) chamelium_port_get_name(data->ports[i]);
+
+	for_each_valid_output_on_pipe(&data->display,
+				      primary->pipe->pipe,
+				      output) {
+		drmModeModeInfo *mode;
+		struct igt_fb fb_modeset, fb, fbref;
+		struct chamelium_frame_dump *frame_limited;
+		int fb_id, fb_modeset_id, fbref_id;
+
+		for (i = 0; i < data->port_count; i++)
+			valid_output |=
+				(strcmp(output->name, connected_ports[i]) == 0);
+		if (!valid_output)
+			continue;
+		else
+			for (i = 0; i < data->port_count; i++)
+				if (strcmp(output->name,
+				    connected_ports[i]) == 0)
+					port = data->ports[i];
+
+		if (!igt_output_has_prop(output, IGT_CONNECTOR_BROADCAST_RGB))
+			continue;
+
+		has_broadcast_rgb_output = true;
+
+		igt_output_set_pipe(output, primary->pipe->pipe);
+		mode = igt_output_get_mode(output);
+
+		/* Create a framebuffer at the size of the output. */
+		fb_id = igt_create_fb(data->drm_fd,
+				      mode->hdisplay,
+				      mode->vdisplay,
+				      DRM_FORMAT_XRGB8888,
+				      LOCAL_DRM_FORMAT_MOD_NONE,
+				      &fb);
+		igt_assert(fb_id);
+
+		fb_modeset_id = igt_create_fb(data->drm_fd,
+					      mode->hdisplay,
+					      mode->vdisplay,
+					      DRM_FORMAT_XRGB8888,
+					      LOCAL_DRM_FORMAT_MOD_NONE,
+					      &fb_modeset);
+		igt_assert(fb_modeset_id);
+
+		fbref_id = igt_create_fb(data->drm_fd,
+				      mode->hdisplay,
+				      mode->vdisplay,
+				      DRM_FORMAT_XRGB8888,
+				      LOCAL_DRM_FORMAT_MOD_NONE,
+				      &fbref);
+		igt_assert(fbref_id);
+
+		igt_plane_set_fb(primary, &fb_modeset);
+
+		set_degamma(data, primary->pipe, degamma_linear);
+		set_gamma(data, primary->pipe, gamma_linear);
+		set_ctm(primary->pipe, ctm);
+
+		igt_output_set_prop_value(output,
+					  IGT_CONNECTOR_BROADCAST_RGB,
+					  BROADCAST_RGB_FULL);
+		paint_rectangles(data, mode, red_green_blue_limited, &fb);
+		igt_plane_set_fb(primary, &fb);
+		igt_display_commit(&data->display);
+
+		/* Set the output into limited range. */
+		igt_output_set_prop_value(output,
+					  IGT_CONNECTOR_BROADCAST_RGB,
+					  BROADCAST_RGB_16_235);
+		paint_rectangles(data, mode, red_green_blue_full, &fb);
+
+		/* And reset.. */
+		igt_output_set_prop_value(output,
+					  IGT_CONNECTOR_BROADCAST_RGB,
+					  BROADCAST_RGB_FULL);
+		igt_plane_set_fb(primary, NULL);
+		igt_output_set_pipe(output, PIPE_NONE);
+		chamelium_capture(data->chamelium, port, 0, 0, 0, 0, 1);
+		frame_limited =
+			chamelium_read_captured_frame(data->chamelium, 0);
+
+
+		/* Verify that the framebuffer reference of the software
+		 * computed output is equal to the frame dump of the CTM
+		 * matrix transformation output.
+		 */
+		igt_assert(chamelium_frame_match_or_dump(data->chamelium, port,
+							 frame_limited,
+							 &fbref,
+							 CHAMELIUM_CHECK_ANALOG));
+
+	}
+
+	free_lut(gamma_linear);
+	free_lut(degamma_linear);
+
+	igt_require(has_broadcast_rgb_output);
+}
+
+static void
+run_tests_for_pipe(data_t *data, enum pipe p)
+{
+	igt_pipe_t *pipe;
+	igt_plane_t *primary;
+	double delta;
+	int i;
+	color_t red_green_blue[] = {
+		{ 1.0, 0.0, 0.0 },
+		{ 0.0, 1.0, 0.0 },
+		{ 0.0, 0.0, 1.0 }
+	};
+
+	igt_fixture {
+
+		igt_require(p < data->display.n_pipes);
+
+		pipe = &data->display.pipes[p];
+		igt_require(pipe->n_planes >= 0);
+
+		primary = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
+
+		if (igt_pipe_obj_has_prop(&data->display.pipes[p],
+					  IGT_CRTC_DEGAMMA_LUT_SIZE)) {
+			data->degamma_lut_size =
+				igt_pipe_obj_get_prop(&data->display.pipes[p],
+						IGT_CRTC_DEGAMMA_LUT_SIZE);
+			igt_assert_lt(0, data->degamma_lut_size);
+		}
+
+		if (igt_pipe_obj_has_prop(&data->display.pipes[p],
+					  IGT_CRTC_GAMMA_LUT_SIZE)) {
+			data->gamma_lut_size =
+				igt_pipe_obj_get_prop(&data->display.pipes[p],
+						      IGT_CRTC_GAMMA_LUT_SIZE);
+			igt_assert_lt(0, data->gamma_lut_size);
+		}
+
+		igt_display_require_output_on_pipe(&data->display, p);
+	}
+
+	data->color_depth = 8;
+	delta = 1.0 / (1 << data->color_depth);
+
+	igt_describe("Compare after applying ctm matrix & identity matrix");
+	igt_subtest_f("pipe-%s-ctm-red-to-blue", kmstest_pipe_name(p)) {
+		color_t blue_green_blue[] = {
+			{ 0.0, 0.0, 1.0 },
+			{ 0.0, 1.0, 0.0 },
+			{ 0.0, 0.0, 1.0 }
+		};
+		double ctm[] = { 0.0, 0.0, 0.0,
+				0.0, 1.0, 0.0,
+				1.0, 0.0, 1.0 };
+		igt_assert(test_pipe_ctm(data, primary, red_green_blue,
+					 blue_green_blue, ctm));
+	}
+
+	igt_describe("Compare after applying ctm matrix & identity matrix");
+	igt_subtest_f("pipe-%s-ctm-green-to-red", kmstest_pipe_name(p)) {
+		color_t red_red_blue[] = {
+			{ 1.0, 0.0, 0.0 },
+			{ 1.0, 0.0, 0.0 },
+			{ 0.0, 0.0, 1.0 }
+		};
+		double ctm[] = { 1.0, 1.0, 0.0,
+				0.0, 0.0, 0.0,
+				0.0, 0.0, 1.0 };
+		igt_assert(test_pipe_ctm(data, primary, red_green_blue,
+					 red_red_blue, ctm));
+	}
+
+	igt_describe("Compare after applying ctm matrix & identity matrix");
+	igt_subtest_f("pipe-%s-ctm-blue-to-red", kmstest_pipe_name(p)) {
+		color_t red_green_red[] = {
+			{ 1.0, 0.0, 0.0 },
+			{ 0.0, 1.0, 0.0 },
+			{ 1.0, 0.0, 0.0 }
+		};
+		double ctm[] = { 1.0, 0.0, 1.0,
+				0.0, 1.0, 0.0,
+				0.0, 0.0, 0.0 };
+		igt_assert(test_pipe_ctm(data, primary, red_green_blue,
+					 red_green_red, ctm));
+	}
+
+	/* We tests a few values around the expected result because
+	 * the it depends on the hardware we're dealing with, we can
+	 * either get clamped or rounded values and we also need to
+	 * account for odd number of items in the LUTs.
+	 */
+	igt_describe("Compare after applying ctm matrix & identity matrix");
+	igt_subtest_f("pipe-%s-ctm-0-25", kmstest_pipe_name(p)) {
+		color_t expected_colors[] = {
+			{ 0.0, }, { 0.0, }, { 0.0, }
+		};
+		double ctm[] = { 0.25, 0.0,  0.0,
+				 0.0,  0.25, 0.0,
+				 0.0,  0.0,  0.25 };
+		bool success = false;
+
+		for (i = 0; i < 5; i++) {
+			expected_colors[0].r =
+				expected_colors[1].g =
+				expected_colors[2].b =
+				0.25 + delta * (i - 2);
+			success |= test_pipe_ctm(data, primary,
+						 red_green_blue,
+						 expected_colors, ctm);
+		}
+		igt_assert(success);
+	}
+
+	igt_describe("Compare after applying ctm matrix & identity matrix");
+	igt_subtest_f("pipe-%s-ctm-0-5", kmstest_pipe_name(p)) {
+		color_t expected_colors[] = {
+			{ 0.0, }, { 0.0, }, { 0.0, }
+		};
+		double ctm[] = { 0.5, 0.0, 0.0,
+				 0.0, 0.5, 0.0,
+				 0.0, 0.0, 0.5 };
+		bool success = false;
+
+		for (i = 0; i < 5; i++) {
+			expected_colors[0].r =
+				expected_colors[1].g =
+				expected_colors[2].b =
+				0.5 + delta * (i - 2);
+			success |= test_pipe_ctm(data, primary,
+						 red_green_blue,
+						 expected_colors, ctm);
+		}
+		igt_assert(success);
+	}
+
+	igt_describe("Compare after applying ctm matrix & identity matrix");
+	igt_subtest_f("pipe-%s-ctm-0-75", kmstest_pipe_name(p)) {
+		color_t expected_colors[] = {
+			{ 0.0, }, { 0.0, }, { 0.0, }
+		};
+		double ctm[] = { 0.75, 0.0,  0.0,
+				 0.0,  0.75, 0.0,
+				 0.0,  0.0,  0.75 };
+		bool success = false;
+
+		for (i = 0; i < 7; i++) {
+			expected_colors[0].r =
+				expected_colors[1].g =
+				expected_colors[2].b =
+				0.75 + delta * (i - 3);
+			success |= test_pipe_ctm(data, primary,
+						 red_green_blue,
+						 expected_colors, ctm);
+		}
+		igt_assert(success);
+	}
+
+	igt_describe("Compare after applying ctm matrix & identity matrix");
+	igt_subtest_f("pipe-%s-ctm-max", kmstest_pipe_name(p)) {
+		color_t full_rgb[] = {
+			{ 1.0, 0.0, 0.0 },
+			{ 0.0, 1.0, 0.0 },
+			{ 0.0, 0.0, 1.0 }
+		};
+		double ctm[] = { 100.0,   0.0,   0.0,
+				 0.0,   100.0,   0.0,
+				 0.0,     0.0, 100.0 };
+
+		/* CherryView generates values on 10bits that we
+		 * produce with an 8 bits per color framebuffer.
+		 */
+		igt_require(!IS_CHERRYVIEW(data->devid));
+
+		igt_assert(test_pipe_ctm(data, primary, red_green_blue,
+					 full_rgb, ctm));
+	}
+
+	igt_describe("Compare after applying ctm matrix & identity matrix");
+	igt_subtest_f("pipe-%s-ctm-negative", kmstest_pipe_name(p)) {
+		color_t all_black[] = {
+			{ 0.0, 0.0, 0.0 },
+			{ 0.0, 0.0, 0.0 },
+			{ 0.0, 0.0, 0.0 }
+		};
+		double ctm[] = { -1.0,  0.0,  0.0,
+				 0.0, -1.0,  0.0,
+				 0.0,  0.0, -1.0 };
+		igt_assert(test_pipe_ctm(data, primary, red_green_blue,
+					 all_black, ctm));
+	}
+
+	igt_describe("Compare after applying ctm matrix & identity matrix");
+	igt_subtest_f("pipe-%s-ctm-limited-range", kmstest_pipe_name(p))
+		test_pipe_limited_range_ctm(data, primary);
+
+	igt_describe("Compare maxed out gamma LUT and solid color linear LUT");
+	igt_subtest_f("pipe-%s-degamma", kmstest_pipe_name(p))
+		test_pipe_degamma(data, primary);
+
+	igt_describe("Compare maxed out gamma LUT and solid color linear LUT");
+	igt_subtest_f("pipe-%s-gamma", kmstest_pipe_name(p))
+		test_pipe_gamma(data, primary);
+
+	igt_fixture {
+		disable_degamma(primary->pipe);
+		disable_gamma(primary->pipe);
+		disable_ctm(primary->pipe);
+		igt_display_commit(&data->display);
+	}
+}
+
+static int
+pipe_set_property_blob_id(igt_pipe_t *pipe,
+			  enum igt_atomic_crtc_properties prop,
+			  uint32_t blob_id)
+{
+	int ret;
+
+	igt_pipe_obj_replace_prop_blob(pipe, prop, NULL, 0);
+
+	igt_pipe_obj_set_prop_value(pipe, prop, blob_id);
+
+	ret = igt_display_try_commit2(pipe->display,
+				      pipe->display->is_atomic ?
+				      COMMIT_ATOMIC : COMMIT_LEGACY);
+
+	igt_pipe_obj_set_prop_value(pipe, prop, 0);
+
+	return ret;
+}
+
+static int
+pipe_set_property_blob(igt_pipe_t *pipe,
+		       enum igt_atomic_crtc_properties prop,
+		       void *ptr, size_t length)
+{
+	igt_pipe_obj_replace_prop_blob(pipe, prop, ptr, length);
+
+	return igt_display_try_commit2(pipe->display,
+				       pipe->display->is_atomic ?
+				       COMMIT_ATOMIC : COMMIT_LEGACY);
+}
+
+static void
+invalid_gamma_lut_sizes(data_t *data)
+{
+	igt_display_t *display = &data->display;
+	igt_pipe_t *pipe = &display->pipes[0];
+	size_t gamma_lut_size = data->gamma_lut_size *
+				sizeof(struct drm_color_lut);
+	struct drm_color_lut *gamma_lut;
+
+	igt_require(igt_pipe_obj_has_prop(pipe, IGT_CRTC_GAMMA_LUT));
+
+	gamma_lut = malloc(gamma_lut_size * 2);
+
+	igt_display_commit2(display,
+			    display->is_atomic ?
+			    COMMIT_ATOMIC : COMMIT_LEGACY);
+
+	igt_assert_eq(pipe_set_property_blob(pipe,
+					     IGT_CRTC_GAMMA_LUT,
+					     gamma_lut, 1),
+					     -EINVAL);
+	igt_assert_eq(pipe_set_property_blob(pipe,
+					     IGT_CRTC_GAMMA_LUT,
+					     gamma_lut, gamma_lut_size + 1),
+					     -EINVAL);
+	igt_assert_eq(pipe_set_property_blob(pipe,
+					     IGT_CRTC_GAMMA_LUT,
+					     gamma_lut,
+					     gamma_lut_size - 1),
+					     -EINVAL);
+	igt_assert_eq(pipe_set_property_blob(pipe,
+					     IGT_CRTC_GAMMA_LUT,
+					     gamma_lut,
+					     gamma_lut_size +
+					     sizeof(struct drm_color_lut)),
+					     -EINVAL);
+	igt_assert_eq(pipe_set_property_blob_id(pipe,
+						IGT_CRTC_GAMMA_LUT,
+						pipe->crtc_id),
+						-EINVAL);
+	igt_assert_eq(pipe_set_property_blob_id(pipe,
+						IGT_CRTC_GAMMA_LUT,
+						4096 * 4096),
+						-EINVAL);
+
+	free(gamma_lut);
+}
+
+static void
+invalid_degamma_lut_sizes(data_t *data)
+{
+	igt_display_t *display = &data->display;
+	igt_pipe_t *pipe = &display->pipes[0];
+	size_t degamma_lut_size = data->degamma_lut_size *
+				  sizeof(struct drm_color_lut);
+	struct drm_color_lut *degamma_lut;
+
+	igt_require(igt_pipe_obj_has_prop(pipe, IGT_CRTC_DEGAMMA_LUT));
+
+	degamma_lut = malloc(degamma_lut_size * 2);
+
+	igt_display_commit2(display,
+			    display->is_atomic ?
+			    COMMIT_ATOMIC : COMMIT_LEGACY);
+
+	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_DEGAMMA_LUT,
+					     degamma_lut, 1), -EINVAL);
+	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_DEGAMMA_LUT,
+					     degamma_lut, degamma_lut_size + 1),
+					     -EINVAL);
+	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_DEGAMMA_LUT,
+					     degamma_lut,
+					     degamma_lut_size - 1),
+					     -EINVAL);
+	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_DEGAMMA_LUT,
+					     degamma_lut,
+					     degamma_lut_size +
+					     sizeof(struct drm_color_lut)),
+					     -EINVAL);
+	igt_assert_eq(pipe_set_property_blob_id(pipe, IGT_CRTC_DEGAMMA_LUT,
+						pipe->crtc_id), -EINVAL);
+	igt_assert_eq(pipe_set_property_blob_id(pipe, IGT_CRTC_DEGAMMA_LUT,
+						4096 * 4096), -EINVAL);
+
+	free(degamma_lut);
+}
+
+static void
+invalid_ctm_matrix_sizes(data_t *data)
+{
+	igt_display_t *display = &data->display;
+	igt_pipe_t *pipe = &display->pipes[0];
+	void *ptr;
+
+	igt_require(igt_pipe_obj_has_prop(pipe, IGT_CRTC_CTM));
+
+	ptr = malloc(sizeof(struct drm_color_ctm) * 4);
+
+	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_CTM, ptr, 1),
+					     -EINVAL);
+	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_CTM, ptr,
+					     sizeof(struct drm_color_ctm) + 1),
+					     -EINVAL);
+	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_CTM, ptr,
+					     sizeof(struct drm_color_ctm) - 1),
+					     -EINVAL);
+	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_CTM, ptr,
+					     sizeof(struct drm_color_ctm) * 2),
+					     -EINVAL);
+	igt_assert_eq(pipe_set_property_blob_id(pipe, IGT_CRTC_CTM,
+						pipe->crtc_id), -EINVAL);
+	igt_assert_eq(pipe_set_property_blob_id(pipe, IGT_CRTC_CTM,
+						4096 * 4096), -EINVAL);
+
+	free(ptr);
+}
+
+igt_main
+{
+	data_t data = {};
+	enum pipe pipe;
+
+	igt_fixture {
+		data.drm_fd = drm_open_driver_master(DRIVER_ANY);
+		if (is_i915_device(data.drm_fd))
+			data.devid = intel_get_drm_devid(data.drm_fd);
+		data.chamelium = chamelium_init(data.drm_fd);
+		igt_require(data.chamelium);
+
+		data.ports = chamelium_get_ports(data.chamelium,
+						 &data.port_count);
+
+		kmstest_set_vt_graphics_mode();
+		igt_display_require(&data.display, data.drm_fd);
+		igt_require(data.display.is_atomic);
+	}
+
+	for_each_pipe_static(pipe)
+		igt_subtest_group
+			run_tests_for_pipe(&data, pipe);
+	igt_describe("Negative test case gamma lut size");
+	igt_subtest_f("pipe-invalid-gamma-lut-sizes")
+		invalid_gamma_lut_sizes(&data);
+
+	igt_describe("Negative test case degamma lut size");
+	igt_subtest_f("pipe-invalid-degamma-lut-sizes")
+		invalid_degamma_lut_sizes(&data);
+
+	igt_describe("Negative test case ctm matrix size");
+	igt_subtest_f("pipe-invalid-ctm-matrix-sizes")
+		invalid_ctm_matrix_sizes(&data);
+
+	igt_fixture {
+		igt_display_fini(&data.display);
+	}
+}
diff --git a/tests/meson.build b/tests/meson.build
index a79d22b..a10854f 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -255,6 +255,7 @@ endif
 if chamelium.found()
 	test_progs += [
 		'kms_chamelium',
+		'kms_color_chamelium',
 	]
 	test_deps += chamelium
 endif
-- 
2.7.4

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

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

* [igt-dev] ✓ Fi.CI.BAT: success for validate color tests using chamelium. (rev2)
  2020-01-16  6:19 [igt-dev] [PATCH i-g-t v2 0/2] validate color tests using chamelium Kunal Joshi
  2020-01-16  6:19 ` [igt-dev] [PATCH i-g-t v2 1/2] lib/igt_chamelium: added function returning a bool to compare framebuffer reference with framedump Kunal Joshi
  2020-01-16  6:19 ` [igt-dev] [PATCH i-g-t v2 2/2] tests/kms_color_chamelium: add subtests to validate color Kunal Joshi
@ 2020-01-16 15:03 ` Patchwork
  2020-01-19  7:07 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
  3 siblings, 0 replies; 6+ messages in thread
From: Patchwork @ 2020-01-16 15:03 UTC (permalink / raw)
  To: Kunal Joshi; +Cc: igt-dev

== Series Details ==

Series: validate color tests using chamelium. (rev2)
URL   : https://patchwork.freedesktop.org/series/72006/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_7754 -> IGTPW_3927
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

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

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

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

### IGT changes ###

#### Issues hit ####

  * igt@gem_exec_suspend@basic-s0:
    - fi-cml-s:           [PASS][1] -> [FAIL][2] ([fdo#103375])
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/fi-cml-s/igt@gem_exec_suspend@basic-s0.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/fi-cml-s/igt@gem_exec_suspend@basic-s0.html

  * igt@i915_module_load@reload-with-fault-injection:
    - fi-skl-6770hq:      [PASS][3] -> [INCOMPLETE][4] ([i915#671])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/fi-skl-6770hq/igt@i915_module_load@reload-with-fault-injection.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/fi-skl-6770hq/igt@i915_module_load@reload-with-fault-injection.html

  * igt@i915_selftest@live_execlists:
    - fi-kbl-soraka:      [PASS][5] -> [DMESG-FAIL][6] ([i915#656])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/fi-kbl-soraka/igt@i915_selftest@live_execlists.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/fi-kbl-soraka/igt@i915_selftest@live_execlists.html

  
#### Possible fixes ####

  * igt@gem_exec_suspend@basic-s3:
    - fi-cml-s:           [DMESG-WARN][7] ([fdo#111764]) -> [PASS][8]
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/fi-cml-s/igt@gem_exec_suspend@basic-s3.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/fi-cml-s/igt@gem_exec_suspend@basic-s3.html

  * igt@i915_selftest@live_blt:
    - fi-ivb-3770:        [DMESG-FAIL][9] ([i915#770]) -> [PASS][10]
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/fi-ivb-3770/igt@i915_selftest@live_blt.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/fi-ivb-3770/igt@i915_selftest@live_blt.html

  * igt@kms_chamelium@hdmi-hpd-fast:
    - fi-kbl-7500u:       [FAIL][11] ([fdo#111096] / [i915#323]) -> [PASS][12]
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/fi-kbl-7500u/igt@kms_chamelium@hdmi-hpd-fast.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/fi-kbl-7500u/igt@kms_chamelium@hdmi-hpd-fast.html

  
  [fdo#103375]: https://bugs.freedesktop.org/show_bug.cgi?id=103375
  [fdo#111096]: https://bugs.freedesktop.org/show_bug.cgi?id=111096
  [fdo#111764]: https://bugs.freedesktop.org/show_bug.cgi?id=111764
  [i915#323]: https://gitlab.freedesktop.org/drm/intel/issues/323
  [i915#656]: https://gitlab.freedesktop.org/drm/intel/issues/656
  [i915#671]: https://gitlab.freedesktop.org/drm/intel/issues/671
  [i915#770]: https://gitlab.freedesktop.org/drm/intel/issues/770


Participating hosts (48 -> 45)
------------------------------

  Additional (3): fi-hsw-4770r fi-byt-n2820 fi-snb-2520m 
  Missing    (6): fi-ilk-m540 fi-hsw-4200u fi-byt-squawks fi-bsw-cyan fi-tgl-y fi-byt-clapper 


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

  * CI: CI-20190529 -> None
  * IGT: IGT_5370 -> IGTPW_3927

  CI-20190529: 20190529
  CI_DRM_7754: 4db14301dfa813d24cd2ad46552af83d493c5d12 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_3927: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/index.html
  IGT_5370: a98fb02cc2816a48eec374392d9b6941abb6af2c @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools



== Testlist changes ==

+igt@kms_color_chamelium@pipe-a-ctm-0-5
+igt@kms_color_chamelium@pipe-a-ctm-0-25
+igt@kms_color_chamelium@pipe-a-ctm-0-75
+igt@kms_color_chamelium@pipe-a-ctm-blue-to-red
+igt@kms_color_chamelium@pipe-a-ctm-green-to-red
+igt@kms_color_chamelium@pipe-a-ctm-limited-range
+igt@kms_color_chamelium@pipe-a-ctm-max
+igt@kms_color_chamelium@pipe-a-ctm-negative
+igt@kms_color_chamelium@pipe-a-ctm-red-to-blue
+igt@kms_color_chamelium@pipe-a-degamma
+igt@kms_color_chamelium@pipe-a-gamma
+igt@kms_color_chamelium@pipe-b-ctm-0-5
+igt@kms_color_chamelium@pipe-b-ctm-0-25
+igt@kms_color_chamelium@pipe-b-ctm-0-75
+igt@kms_color_chamelium@pipe-b-ctm-blue-to-red
+igt@kms_color_chamelium@pipe-b-ctm-green-to-red
+igt@kms_color_chamelium@pipe-b-ctm-limited-range
+igt@kms_color_chamelium@pipe-b-ctm-max
+igt@kms_color_chamelium@pipe-b-ctm-negative
+igt@kms_color_chamelium@pipe-b-ctm-red-to-blue
+igt@kms_color_chamelium@pipe-b-degamma
+igt@kms_color_chamelium@pipe-b-gamma
+igt@kms_color_chamelium@pipe-c-ctm-0-5
+igt@kms_color_chamelium@pipe-c-ctm-0-25
+igt@kms_color_chamelium@pipe-c-ctm-0-75
+igt@kms_color_chamelium@pipe-c-ctm-blue-to-red
+igt@kms_color_chamelium@pipe-c-ctm-green-to-red
+igt@kms_color_chamelium@pipe-c-ctm-limited-range
+igt@kms_color_chamelium@pipe-c-ctm-max
+igt@kms_color_chamelium@pipe-c-ctm-negative
+igt@kms_color_chamelium@pipe-c-ctm-red-to-blue
+igt@kms_color_chamelium@pipe-c-degamma
+igt@kms_color_chamelium@pipe-c-gamma
+igt@kms_color_chamelium@pipe-d-ctm-0-5
+igt@kms_color_chamelium@pipe-d-ctm-0-25
+igt@kms_color_chamelium@pipe-d-ctm-0-75
+igt@kms_color_chamelium@pipe-d-ctm-blue-to-red
+igt@kms_color_chamelium@pipe-d-ctm-green-to-red
+igt@kms_color_chamelium@pipe-d-ctm-limited-range
+igt@kms_color_chamelium@pipe-d-ctm-max
+igt@kms_color_chamelium@pipe-d-ctm-negative
+igt@kms_color_chamelium@pipe-d-ctm-red-to-blue
+igt@kms_color_chamelium@pipe-d-degamma
+igt@kms_color_chamelium@pipe-d-gamma
+igt@kms_color_chamelium@pipe-e-ctm-0-5
+igt@kms_color_chamelium@pipe-e-ctm-0-25
+igt@kms_color_chamelium@pipe-e-ctm-0-75
+igt@kms_color_chamelium@pipe-e-ctm-blue-to-red
+igt@kms_color_chamelium@pipe-e-ctm-green-to-red
+igt@kms_color_chamelium@pipe-e-ctm-limited-range
+igt@kms_color_chamelium@pipe-e-ctm-max
+igt@kms_color_chamelium@pipe-e-ctm-negative
+igt@kms_color_chamelium@pipe-e-ctm-red-to-blue
+igt@kms_color_chamelium@pipe-e-degamma
+igt@kms_color_chamelium@pipe-e-gamma
+igt@kms_color_chamelium@pipe-f-ctm-0-5
+igt@kms_color_chamelium@pipe-f-ctm-0-25
+igt@kms_color_chamelium@pipe-f-ctm-0-75
+igt@kms_color_chamelium@pipe-f-ctm-blue-to-red
+igt@kms_color_chamelium@pipe-f-ctm-green-to-red
+igt@kms_color_chamelium@pipe-f-ctm-limited-range
+igt@kms_color_chamelium@pipe-f-ctm-max
+igt@kms_color_chamelium@pipe-f-ctm-negative
+igt@kms_color_chamelium@pipe-f-ctm-red-to-blue
+igt@kms_color_chamelium@pipe-f-degamma
+igt@kms_color_chamelium@pipe-f-gamma
+igt@kms_color_chamelium@pipe-invalid-ctm-matrix-sizes
+igt@kms_color_chamelium@pipe-invalid-degamma-lut-sizes
+igt@kms_color_chamelium@pipe-invalid-gamma-lut-sizes

== Logs ==

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

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

* [igt-dev] ✓ Fi.CI.IGT: success for validate color tests using chamelium. (rev2)
  2020-01-16  6:19 [igt-dev] [PATCH i-g-t v2 0/2] validate color tests using chamelium Kunal Joshi
                   ` (2 preceding siblings ...)
  2020-01-16 15:03 ` [igt-dev] ✓ Fi.CI.BAT: success for validate color tests using chamelium. (rev2) Patchwork
@ 2020-01-19  7:07 ` Patchwork
  3 siblings, 0 replies; 6+ messages in thread
From: Patchwork @ 2020-01-19  7:07 UTC (permalink / raw)
  To: Kunal Joshi; +Cc: igt-dev

== Series Details ==

Series: validate color tests using chamelium. (rev2)
URL   : https://patchwork.freedesktop.org/series/72006/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_7754_full -> IGTPW_3927_full
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

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

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

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

### IGT changes ###

#### Possible regressions ####

  * {igt@kms_color_chamelium@pipe-invalid-degamma-lut-sizes} (NEW):
    - shard-tglb:         NOTRUN -> [SKIP][1] +31 similar issues
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-tglb8/igt@kms_color_chamelium@pipe-invalid-degamma-lut-sizes.html

  
New tests
---------

  New tests have been introduced between CI_DRM_7754_full and IGTPW_3927_full:

### New IGT tests (47) ###

  * igt@kms_color_chamelium@pipe-a-ctm-0-25:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-a-ctm-0-5:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-a-ctm-0-75:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-a-ctm-blue-to-red:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-a-ctm-green-to-red:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-a-ctm-limited-range:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-a-ctm-max:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-a-ctm-negative:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-a-ctm-red-to-blue:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-a-degamma:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-a-gamma:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-b-ctm-0-25:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-b-ctm-0-5:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-b-ctm-0-75:
    - Statuses : 4 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-b-ctm-blue-to-red:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-b-ctm-green-to-red:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-b-ctm-limited-range:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-b-ctm-max:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-b-ctm-negative:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-b-ctm-red-to-blue:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-b-degamma:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-b-gamma:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-c-ctm-0-25:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-c-ctm-0-5:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-c-ctm-0-75:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-c-ctm-blue-to-red:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-c-ctm-green-to-red:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-c-ctm-limited-range:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-c-ctm-max:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-c-ctm-negative:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-c-ctm-red-to-blue:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-c-degamma:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-c-gamma:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-d-ctm-0-25:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-d-ctm-0-5:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-d-ctm-0-75:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-d-ctm-blue-to-red:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-d-ctm-green-to-red:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-d-ctm-limited-range:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-d-ctm-max:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-d-ctm-negative:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-d-ctm-red-to-blue:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-d-degamma:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-d-gamma:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-invalid-ctm-matrix-sizes:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-invalid-degamma-lut-sizes:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_color_chamelium@pipe-invalid-gamma-lut-sizes:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  

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

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

### IGT changes ###

#### Issues hit ####

  * igt@gem_ctx_isolation@rcs0-s3:
    - shard-kbl:          [PASS][2] -> [DMESG-WARN][3] ([i915#180]) +7 similar issues
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-kbl3/igt@gem_ctx_isolation@rcs0-s3.html
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-kbl1/igt@gem_ctx_isolation@rcs0-s3.html

  * igt@gem_ctx_persistence@vcs1-queued:
    - shard-iclb:         [PASS][4] -> [SKIP][5] ([fdo#109276] / [fdo#112080]) +5 similar issues
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-iclb1/igt@gem_ctx_persistence@vcs1-queued.html
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-iclb8/igt@gem_ctx_persistence@vcs1-queued.html

  * igt@gem_exec_create@forked:
    - shard-apl:          [PASS][6] -> [TIMEOUT][7] ([fdo#112271] / [i915#940])
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-apl8/igt@gem_exec_create@forked.html
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-apl4/igt@gem_exec_create@forked.html

  * igt@gem_exec_gttfill@basic:
    - shard-tglb:         [PASS][8] -> [INCOMPLETE][9] ([fdo#111593] / [i915#472])
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-tglb5/igt@gem_exec_gttfill@basic.html
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-tglb3/igt@gem_exec_gttfill@basic.html

  * igt@gem_exec_parallel@contexts:
    - shard-tglb:         [PASS][10] -> [INCOMPLETE][11] ([i915#470] / [i915#472]) +1 similar issue
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-tglb6/igt@gem_exec_parallel@contexts.html
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-tglb3/igt@gem_exec_parallel@contexts.html

  * igt@gem_exec_schedule@pi-shared-iova-bsd:
    - shard-iclb:         [PASS][12] -> [SKIP][13] ([i915#677])
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-iclb8/igt@gem_exec_schedule@pi-shared-iova-bsd.html
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-iclb1/igt@gem_exec_schedule@pi-shared-iova-bsd.html

  * igt@gem_exec_schedule@preempt-queue-blt:
    - shard-tglb:         [PASS][14] -> [INCOMPLETE][15] ([fdo#111677] / [i915#472])
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-tglb5/igt@gem_exec_schedule@preempt-queue-blt.html
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-tglb6/igt@gem_exec_schedule@preempt-queue-blt.html

  * igt@gem_exec_schedule@preempt-queue-chain-bsd1:
    - shard-tglb:         [PASS][16] -> [INCOMPLETE][17] ([fdo#111606] / [fdo#111677] / [i915#472])
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-tglb1/igt@gem_exec_schedule@preempt-queue-chain-bsd1.html
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-tglb3/igt@gem_exec_schedule@preempt-queue-chain-bsd1.html

  * igt@gem_exec_schedule@preemptive-hang-bsd:
    - shard-iclb:         [PASS][18] -> [SKIP][19] ([fdo#112146]) +4 similar issues
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-iclb8/igt@gem_exec_schedule@preemptive-hang-bsd.html
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-iclb1/igt@gem_exec_schedule@preemptive-hang-bsd.html

  * igt@gem_persistent_relocs@forked-faulting-reloc-thrashing:
    - shard-kbl:          [PASS][20] -> [INCOMPLETE][21] ([fdo#103665] / [i915#530])
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-kbl2/igt@gem_persistent_relocs@forked-faulting-reloc-thrashing.html
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-kbl3/igt@gem_persistent_relocs@forked-faulting-reloc-thrashing.html

  * igt@gem_persistent_relocs@forked-interruptible-thrash-inactive:
    - shard-kbl:          [PASS][22] -> [TIMEOUT][23] ([fdo#112271] / [i915#530]) +1 similar issue
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-kbl7/igt@gem_persistent_relocs@forked-interruptible-thrash-inactive.html
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-kbl2/igt@gem_persistent_relocs@forked-interruptible-thrash-inactive.html

  * igt@gem_persistent_relocs@forked-thrashing:
    - shard-tglb:         [PASS][24] -> [TIMEOUT][25] ([fdo#112126] / [fdo#112271])
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-tglb8/igt@gem_persistent_relocs@forked-thrashing.html
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-tglb4/igt@gem_persistent_relocs@forked-thrashing.html

  * igt@gem_ppgtt@flink-and-close-vma-leak:
    - shard-glk:          [PASS][26] -> [FAIL][27] ([i915#644])
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-glk9/igt@gem_ppgtt@flink-and-close-vma-leak.html
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-glk4/igt@gem_ppgtt@flink-and-close-vma-leak.html

  * igt@gem_sync@basic-each:
    - shard-tglb:         [PASS][28] -> [INCOMPLETE][29] ([i915#472] / [i915#707])
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-tglb1/igt@gem_sync@basic-each.html
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-tglb7/igt@gem_sync@basic-each.html

  * igt@i915_pm_dc@dc6-psr:
    - shard-iclb:         [PASS][30] -> [FAIL][31] ([i915#454])
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-iclb6/igt@i915_pm_dc@dc6-psr.html
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-iclb6/igt@i915_pm_dc@dc6-psr.html

  * igt@kms_cursor_crc@pipe-c-cursor-suspend:
    - shard-apl:          [PASS][32] -> [DMESG-WARN][33] ([i915#180]) +2 similar issues
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-apl6/igt@kms_cursor_crc@pipe-c-cursor-suspend.html
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-apl1/igt@kms_cursor_crc@pipe-c-cursor-suspend.html

  * igt@kms_cursor_legacy@2x-flip-vs-cursor-atomic:
    - shard-glk:          [PASS][34] -> [FAIL][35] ([i915#72])
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-glk1/igt@kms_cursor_legacy@2x-flip-vs-cursor-atomic.html
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-glk5/igt@kms_cursor_legacy@2x-flip-vs-cursor-atomic.html

  * igt@kms_draw_crc@draw-method-xrgb8888-mmap-gtt-xtiled:
    - shard-snb:          [PASS][36] -> [DMESG-WARN][37] ([i915#478]) +1 similar issue
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-snb1/igt@kms_draw_crc@draw-method-xrgb8888-mmap-gtt-xtiled.html
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-snb2/igt@kms_draw_crc@draw-method-xrgb8888-mmap-gtt-xtiled.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-shrfb-pgflip-blt:
    - shard-tglb:         [PASS][38] -> [FAIL][39] ([i915#49]) +1 similar issue
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-tglb1/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-shrfb-pgflip-blt.html
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-tglb4/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-shrfb-pgflip-blt.html

  * igt@kms_plane@plane-panning-bottom-right-suspend-pipe-b-planes:
    - shard-iclb:         [PASS][40] -> [DMESG-WARN][41] ([fdo#111764])
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-iclb2/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-b-planes.html
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-iclb4/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-b-planes.html

  * igt@kms_psr@no_drrs:
    - shard-iclb:         [PASS][42] -> [FAIL][43] ([i915#173])
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-iclb5/igt@kms_psr@no_drrs.html
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-iclb1/igt@kms_psr@no_drrs.html

  * igt@kms_psr@psr2_sprite_plane_move:
    - shard-iclb:         [PASS][44] -> [SKIP][45] ([fdo#109441]) +1 similar issue
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-iclb2/igt@kms_psr@psr2_sprite_plane_move.html
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-iclb4/igt@kms_psr@psr2_sprite_plane_move.html

  * igt@perf_pmu@busy-vcs1:
    - shard-iclb:         [PASS][46] -> [SKIP][47] ([fdo#112080]) +7 similar issues
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-iclb4/igt@perf_pmu@busy-vcs1.html
   [47]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-iclb5/igt@perf_pmu@busy-vcs1.html

  * igt@prime_vgem@fence-wait-bsd2:
    - shard-iclb:         [PASS][48] -> [SKIP][49] ([fdo#109276]) +19 similar issues
   [48]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-iclb1/igt@prime_vgem@fence-wait-bsd2.html
   [49]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-iclb8/igt@prime_vgem@fence-wait-bsd2.html

  
#### Possible fixes ####

  * igt@gem_ctx_isolation@vcs1-dirty-create:
    - shard-iclb:         [SKIP][50] ([fdo#109276] / [fdo#112080]) -> [PASS][51] +2 similar issues
   [50]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-iclb6/igt@gem_ctx_isolation@vcs1-dirty-create.html
   [51]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-iclb4/igt@gem_ctx_isolation@vcs1-dirty-create.html

  * igt@gem_ctx_shared@q-smoketest-bsd:
    - shard-tglb:         [INCOMPLETE][52] ([i915#461] / [i915#472]) -> [PASS][53]
   [52]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-tglb3/igt@gem_ctx_shared@q-smoketest-bsd.html
   [53]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-tglb8/igt@gem_ctx_shared@q-smoketest-bsd.html

  * igt@gem_exec_parallel@vcs1-fds:
    - shard-iclb:         [SKIP][54] ([fdo#112080]) -> [PASS][55] +8 similar issues
   [54]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-iclb8/igt@gem_exec_parallel@vcs1-fds.html
   [55]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-iclb4/igt@gem_exec_parallel@vcs1-fds.html

  * igt@gem_exec_schedule@independent-bsd:
    - shard-iclb:         [SKIP][56] ([fdo#112146]) -> [PASS][57] +1 similar issue
   [56]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-iclb2/igt@gem_exec_schedule@independent-bsd.html
   [57]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-iclb8/igt@gem_exec_schedule@independent-bsd.html

  * igt@gem_exec_schedule@pi-distinct-iova-bsd:
    - shard-iclb:         [SKIP][58] ([i915#677]) -> [PASS][59] +1 similar issue
   [58]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-iclb1/igt@gem_exec_schedule@pi-distinct-iova-bsd.html
   [59]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-iclb5/igt@gem_exec_schedule@pi-distinct-iova-bsd.html

  * igt@gem_exec_schedule@preempt-queue-bsd2:
    - shard-tglb:         [INCOMPLETE][60] ([fdo#111606] / [fdo#111677] / [i915#472]) -> [PASS][61]
   [60]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-tglb3/igt@gem_exec_schedule@preempt-queue-bsd2.html
   [61]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-tglb7/igt@gem_exec_schedule@preempt-queue-bsd2.html

  * igt@gem_exec_schedule@promotion-bsd1:
    - shard-iclb:         [SKIP][62] ([fdo#109276]) -> [PASS][63] +13 similar issues
   [62]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-iclb6/igt@gem_exec_schedule@promotion-bsd1.html
   [63]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-iclb2/igt@gem_exec_schedule@promotion-bsd1.html

  * igt@gem_exec_schedule@smoketest-vebox:
    - shard-tglb:         [INCOMPLETE][64] ([i915#472] / [i915#707]) -> [PASS][65]
   [64]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-tglb6/igt@gem_exec_schedule@smoketest-vebox.html
   [65]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-tglb5/igt@gem_exec_schedule@smoketest-vebox.html

  * igt@gem_persistent_relocs@forked-faulting-reloc-thrash-inactive:
    - shard-tglb:         [TIMEOUT][66] ([fdo#112271] / [i915#530]) -> [PASS][67]
   [66]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-tglb7/igt@gem_persistent_relocs@forked-faulting-reloc-thrash-inactive.html
   [67]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-tglb4/igt@gem_persistent_relocs@forked-faulting-reloc-thrash-inactive.html

  * igt@gem_persistent_relocs@forked-interruptible-thrashing:
    - shard-apl:          [TIMEOUT][68] ([fdo#112271] / [i915#530]) -> [PASS][69]
   [68]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-apl6/igt@gem_persistent_relocs@forked-interruptible-thrashing.html
   [69]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-apl1/igt@gem_persistent_relocs@forked-interruptible-thrashing.html
    - shard-kbl:          [TIMEOUT][70] ([fdo#112271] / [i915#530]) -> [PASS][71]
   [70]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-kbl2/igt@gem_persistent_relocs@forked-interruptible-thrashing.html
   [71]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-kbl4/igt@gem_persistent_relocs@forked-interruptible-thrashing.html

  * igt@gem_persistent_relocs@forked-thrashing:
    - shard-kbl:          [INCOMPLETE][72] ([fdo#103665] / [i915#530]) -> [PASS][73]
   [72]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-kbl1/igt@gem_persistent_relocs@forked-thrashing.html
   [73]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-kbl3/igt@gem_persistent_relocs@forked-thrashing.html

  * igt@gem_userptr_blits@map-fixed-invalidate-busy:
    - shard-snb:          [DMESG-WARN][74] ([fdo#111870] / [i915#478]) -> [PASS][75] +2 similar issues
   [74]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-snb4/igt@gem_userptr_blits@map-fixed-invalidate-busy.html
   [75]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-snb1/igt@gem_userptr_blits@map-fixed-invalidate-busy.html

  * igt@i915_selftest@live_gt_timelines:
    - shard-tglb:         [INCOMPLETE][76] ([i915#455] / [i915#472]) -> [PASS][77]
   [76]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-tglb3/igt@i915_selftest@live_gt_timelines.html
   [77]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-tglb6/igt@i915_selftest@live_gt_timelines.html

  * igt@i915_suspend@debugfs-reader:
    - shard-iclb:         [DMESG-WARN][78] ([fdo#111764]) -> [PASS][79]
   [78]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-iclb6/igt@i915_suspend@debugfs-reader.html
   [79]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-iclb1/igt@i915_suspend@debugfs-reader.html
    - shard-snb:          [DMESG-WARN][80] ([i915#42]) -> [PASS][81]
   [80]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-snb5/igt@i915_suspend@debugfs-reader.html
   [81]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-snb2/igt@i915_suspend@debugfs-reader.html

  * igt@kms_cursor_crc@pipe-a-cursor-256x85-sliding:
    - shard-kbl:          [FAIL][82] ([i915#54]) -> [PASS][83]
   [82]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-kbl4/igt@kms_cursor_crc@pipe-a-cursor-256x85-sliding.html
   [83]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-kbl3/igt@kms_cursor_crc@pipe-a-cursor-256x85-sliding.html
    - shard-apl:          [FAIL][84] ([i915#54]) -> [PASS][85]
   [84]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-apl4/igt@kms_cursor_crc@pipe-a-cursor-256x85-sliding.html
   [85]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-apl1/igt@kms_cursor_crc@pipe-a-cursor-256x85-sliding.html

  * igt@kms_cursor_crc@pipe-b-cursor-suspend:
    - shard-apl:          [DMESG-WARN][86] ([i915#180]) -> [PASS][87] +2 similar issues
   [86]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-apl2/igt@kms_cursor_crc@pipe-b-cursor-suspend.html
   [87]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-apl4/igt@kms_cursor_crc@pipe-b-cursor-suspend.html

  * igt@kms_flip@flip-vs-suspend-interruptible:
    - shard-kbl:          [DMESG-WARN][88] ([i915#180] / [i915#391]) -> [PASS][89]
   [88]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-kbl7/igt@kms_flip@flip-vs-suspend-interruptible.html
   [89]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-kbl4/igt@kms_flip@flip-vs-suspend-interruptible.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-indfb-draw-pwrite:
    - shard-tglb:         [FAIL][90] ([i915#49]) -> [PASS][91] +2 similar issues
   [90]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-tglb6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-indfb-draw-pwrite.html
   [91]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-tglb8/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-indfb-draw-pwrite.html

  * igt@kms_psr@psr2_cursor_render:
    - shard-iclb:         [SKIP][92] ([fdo#109441]) -> [PASS][93] +5 similar issues
   [92]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-iclb8/igt@kms_psr@psr2_cursor_render.html
   [93]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-iclb2/igt@kms_psr@psr2_cursor_render.html

  * igt@kms_setmode@basic:
    - shard-apl:          [FAIL][94] ([i915#31]) -> [PASS][95]
   [94]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-apl1/igt@kms_setmode@basic.html
   [95]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-apl6/igt@kms_setmode@basic.html

  * igt@kms_universal_plane@universal-plane-pipe-b-functional:
    - shard-apl:          [FAIL][96] ([i915#331]) -> [PASS][97]
   [96]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-apl7/igt@kms_universal_plane@universal-plane-pipe-b-functional.html
   [97]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-apl7/igt@kms_universal_plane@universal-plane-pipe-b-functional.html
    - shard-kbl:          [FAIL][98] ([i915#331]) -> [PASS][99]
   [98]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-kbl1/igt@kms_universal_plane@universal-plane-pipe-b-functional.html
   [99]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-kbl1/igt@kms_universal_plane@universal-plane-pipe-b-functional.html

  * igt@kms_vblank@pipe-a-ts-continuation-suspend:
    - shard-kbl:          [DMESG-WARN][100] ([i915#180]) -> [PASS][101] +3 similar issues
   [100]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-kbl4/igt@kms_vblank@pipe-a-ts-continuation-suspend.html
   [101]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-kbl4/igt@kms_vblank@pipe-a-ts-continuation-suspend.html

  
#### Warnings ####

  * igt@gem_ctx_isolation@vcs1-nonpriv:
    - shard-iclb:         [SKIP][102] ([fdo#109276] / [fdo#112080]) -> [FAIL][103] ([IGT#28])
   [102]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-iclb8/igt@gem_ctx_isolation@vcs1-nonpriv.html
   [103]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-iclb1/igt@gem_ctx_isolation@vcs1-nonpriv.html

  * igt@gem_userptr_blits@map-fixed-invalidate-busy-gup:
    - shard-snb:          [DMESG-WARN][104] ([fdo#110789] / [fdo#111870] / [i915#478]) -> [DMESG-WARN][105] ([fdo#111870] / [i915#478]) +1 similar issue
   [104]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7754/shard-snb4/igt@gem_userptr_blits@map-fixed-invalidate-busy-gup.html
   [105]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/shard-snb6/igt@gem_userptr_blits@map-fixed-invalidate-busy-gup.html

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

  [IGT#28]: https://gitlab.freedesktop.org/drm/igt-gpu-tools/issues/28
  [fdo#103665]: https://bugs.freedesktop.org/show_bug.cgi?id=103665
  [fdo#109276]: https://bugs.freedesktop.org/show_bug.cgi?id=109276
  [fdo#109441]: https://bugs.freedesktop.org/show_bug.cgi?id=109441
  [fdo#110789]: https://bugs.freedesktop.org/show_bug.cgi?id=110789
  [fdo#111593]: https://bugs.freedesktop.org/show_bug.cgi?id=111593
  [fdo#111606]: https://bugs.freedesktop.org/show_bug.cgi?id=111606
  [fdo#111677]: https://bugs.freedesktop.org/show_bug.cgi?id=111677
  [fdo#111764]: https://bugs.freedesktop.org/show_bug.cgi?id=111764
  [fdo#111870]: https://bugs.freedesktop.org/show_bug.cgi?id=111870
  [fdo#112080]: https://bugs.freedesktop.org/show_bug.cgi?id=112080
  [fdo#112126]: https://bugs.freedesktop.org/show_bug.cgi?id=112126
  [fdo#112146]: https://bugs.freedesktop.org/show_bug.cgi?id=112146
  [fdo#112271]: https://bugs.freedesktop.org/show_bug.cgi?id=112271
  [i915#173]: https://gitlab.freedesktop.org/drm/intel/issues/173
  [i915#180]: https://gitlab.freedesktop.org/drm/intel/issues/180
  [i915#31]: https://gitlab.freedesktop.org/drm/intel/issues/31
  [i915#331]: https://gitlab.freedesktop.org/drm/intel/issues/331
  [i915#391]: https://gitlab.freedesktop.org/drm/intel/issues/391
  [i915#42]: https://gitlab.freedesktop.org/drm/intel/issues/42
  [i915#454]: https://gitlab.freedesktop.org/drm/intel/issues/454
  [i915#455]: https://gitlab.freedesktop.org/drm/intel/issues/455
  [i915#461]: https://gitlab.freedesktop.org/drm/intel/issues/461
  [i915#470]: https://gitlab.freedesktop.org/drm/intel/issues/470
  [i915#472]: https://gitlab.freedesktop.org/drm/intel/issues/472
  [i915#478]: https://gitlab.freedesktop.org/drm/intel/issues/478
  [i915#49]: https://gitlab.freedesktop.org/drm/intel/issues/49
  [i915#530]: https://gitlab.freedesktop.org/drm/intel/issues/530
  [i915#54]: https://gitlab.freedesktop.org/drm/intel/issues/54
  [i915#644]: https://gitlab.freedesktop.org/drm/intel/issues/644
  [i915#677]: https://gitlab.freedesktop.org/drm/intel/issues/677
  [i915#707]: https://gitlab.freedesktop.org/drm/intel/issues/707
  [i915#72]: https://gitlab.freedesktop.org/drm/intel/issues/72
  [i915#940]: https://gitlab.freedesktop.org/drm/intel/issues/940


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

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


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

  * CI: CI-20190529 -> None
  * IGT: IGT_5370 -> IGTPW_3927
  * Piglit: piglit_4509 -> None

  CI-20190529: 20190529
  CI_DRM_7754: 4db14301dfa813d24cd2ad46552af83d493c5d12 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_3927: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3927/index.html
  IGT_5370: a98fb02cc2816a48eec374392d9b6941abb6af2c @ 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_3927/index.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* Re: [igt-dev] [PATCH i-g-t v2 2/2] tests/kms_color_chamelium: add subtests to validate color.
  2020-01-16  6:19 ` [igt-dev] [PATCH i-g-t v2 2/2] tests/kms_color_chamelium: add subtests to validate color Kunal Joshi
@ 2020-01-20  7:38   ` Shankar, Uma
  0 siblings, 0 replies; 6+ messages in thread
From: Shankar, Uma @ 2020-01-20  7:38 UTC (permalink / raw)
  To: Joshi, Kunal1, igt-dev; +Cc: Vetter, Daniel, Syrjala, Ville, Latvala, Petri



> -----Original Message-----
> From: Joshi, Kunal1 <kunal1.joshi@intel.com>
> Sent: Thursday, January 16, 2020 11:50 AM
> To: igt-dev@lists.freedesktop.org
> Cc: Latvala, Petri <petri.latvala@intel.com>; Hiler, Arkadiusz
> <arkadiusz.hiler@intel.com>; Vetter, Daniel <daniel.vetter@intel.com>; Shankar,
> Uma <uma.shankar@intel.com>; Sharma, Swati2 <swati2.sharma@intel.com>;
> Syrjala, Ville <ville.syrjala@intel.com>; Joshi, Kunal1 <kunal1.joshi@intel.com>
> Subject: [PATCH i-g-t v2 2/2] tests/kms_color_chamelium: add subtests to validate
> color.
> 
> To validate color subtests using chamelium, subtests modified to do frame dump
> comparison instead of crc comparison.
> Tests require chamelium and will validate color features at pipe level.
> 
> (v2)
>         Comparing framedump with framebuffer reference instead of
>         comparing two framedump.
> 
> Signed-off-by: Kunal Joshi <kunal1.joshi@intel.com>
> Signed-off-by: Swati Sharma <swati2.sharma@intel.com>
> Suggested-by: Uma Shankar <uma.shankar@intel.com>
> ---
>  tests/Makefile.am           |    1 +
>  tests/kms_color_chamelium.c | 1130
> +++++++++++++++++++++++++++++++++++++++++++
>  tests/meson.build           |    1 +
>  3 files changed, 1132 insertions(+)
>  create mode 100644 tests/kms_color_chamelium.c
> 
> diff --git a/tests/Makefile.am b/tests/Makefile.am index fc30524..50fc989 100644
> --- a/tests/Makefile.am
> +++ b/tests/Makefile.am
> @@ -13,6 +13,7 @@ endif
>  if HAVE_CHAMELIUM
>  TESTS_progs += \
>  	kms_chamelium \
> +	kms_color_chamelium \
>  	$(NULL)
>  endif
> 
> diff --git a/tests/kms_color_chamelium.c b/tests/kms_color_chamelium.c new file
> mode 100644 index 0000000..ee0c6c5
> --- /dev/null
> +++ b/tests/kms_color_chamelium.c
> @@ -0,0 +1,1130 @@
> +/*
> + * Copyright © 2020 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 <math.h>
> +#include <unistd.h>
> +
> +#include "drm.h"
> +#include "drmtest.h"
> +#include "igt.h"
> +
> +IGT_TEST_DESCRIPTION("Test Color Features at Pipe level");
> +

This new file duplicates many functions from kms_color, can you create a header file
and export those so that we can avoid the duplicacy.

> +/* Internal */
> +typedef struct {
> +	double r, g, b;
> +} color_t;
> +
> +typedef struct {
> +	int drm_fd;
> +	uint32_t devid;
> +	igt_display_t display;
> +
> +	uint32_t color_depth;
> +	uint64_t degamma_lut_size;
> +	uint64_t gamma_lut_size;
> +
> +	struct chamelium *chamelium;
> +	struct chamelium_port **ports;
> +	int port_count;
> +} data_t;
> +
> +typedef struct {
> +	int size;
> +	double coeffs[];
> +} gamma_lut_t;
> +
> +static void paint_gradient_rectangles(data_t *data,
> +				      drmModeModeInfo *mode,
> +				      color_t *colors,
> +				      struct igt_fb *fb)
> +{
> +	cairo_t *cr = igt_get_cairo_ctx(data->drm_fd, fb);
> +	int i, l = mode->hdisplay / 3;
> +	int rows_remaining = mode->hdisplay % 3;
> +
> +	/* Paint 3 gradient rectangles with red/green/blue between 1.0 and
> +	 * 0.5. We want to avoid 0 so each max LUTs only affect their own
> +	 * rectangle.
> +	 */
> +	for (i = 0 ; i < 3; i++) {
> +		igt_paint_color_gradient_range(cr, i * l, 0, l, mode->vdisplay,
> +					       colors[i].r != 0 ? 0.2 : 0,
> +					       colors[i].g != 0 ? 0.2 : 0,
> +					       colors[i].b != 0 ? 0.2 : 0,
> +					       colors[i].r,
> +					       colors[i].g,
> +					       colors[i].b);
> +	}
> +
> +	if (rows_remaining > 0)
> +		igt_paint_color_gradient_range(cr, i * l, 0, rows_remaining,
> +					       mode->vdisplay,
> +					       colors[i-1].r != 0 ? 0.2 : 0,
> +					       colors[i-1].g != 0 ? 0.2 : 0,
> +					       colors[i-1].b != 0 ? 0.2 : 0,
> +					       colors[i-1].r,
> +					       colors[i-1].g,
> +					       colors[i-1].b);
> +
> +	igt_put_cairo_ctx(data->drm_fd, fb, cr); }
> +
> +static void paint_rectangles(data_t *data,
> +			     drmModeModeInfo *mode,
> +			     color_t *colors,
> +			     struct igt_fb *fb)
> +{
> +	cairo_t *cr = igt_get_cairo_ctx(data->drm_fd, fb);
> +	int i, l = mode->hdisplay / 3;
> +	int rows_remaining = mode->hdisplay % 3;
> +
> +	/* Paint 3 solid rectangles. */
> +	for (i = 0 ; i < 3; i++) {
> +		igt_paint_color(cr, i * l, 0, l, mode->vdisplay,
> +				colors[i].r, colors[i].g, colors[i].b);
> +	}
> +
> +	if (rows_remaining > 0)
> +		igt_paint_color(cr, i * l, 0, rows_remaining, mode->vdisplay,
> +				colors[i-1].r, colors[i-1].g, colors[i-1].b);
> +
> +	igt_put_cairo_ctx(data->drm_fd, fb, cr); }
> +
> +static gamma_lut_t *alloc_lut(int lut_size) {
> +	gamma_lut_t *gamma;
> +
> +	igt_assert_lt(0, lut_size);
> +
> +	gamma = malloc(sizeof(*gamma) + lut_size * sizeof(gamma->coeffs[0]));
> +	igt_assert(gamma);
> +	gamma->size = lut_size;
> +
> +	return gamma;
> +}
> +
> +static void free_lut(gamma_lut_t *gamma) {
> +	if (!gamma)
> +		return;
> +
> +	free(gamma);
> +}
> +
> +static gamma_lut_t *generate_table(int lut_size, double exp) {
> +	gamma_lut_t *gamma = alloc_lut(lut_size);
> +	int i;
> +
> +	gamma->coeffs[0] = 0.0;
> +	for (i = 1; i < lut_size; i++)
> +		gamma->coeffs[i] = pow(i * 1.0 / (lut_size - 1), exp);
> +
> +	return gamma;
> +}
> +
> +static gamma_lut_t *generate_table_max(int lut_size) {
> +	gamma_lut_t *gamma = alloc_lut(lut_size);
> +	int i;
> +
> +	gamma->coeffs[0] = 0.0;
> +	for (i = 1; i < lut_size; i++)
> +		gamma->coeffs[i] = 1.0;
> +
> +	return gamma;
> +}
> +
> +static struct drm_color_lut *coeffs_to_lut(data_t *data,
> +					   const gamma_lut_t *gamma,
> +					   uint32_t color_depth,
> +					   int off)
> +{
> +	struct drm_color_lut *lut;
> +	int i, lut_size = gamma->size;
> +	uint32_t max_value = (1 << 16) - 1;
> +	uint32_t mask;
> +
> +	if (is_i915_device(data->drm_fd))
> +		mask = ((1 << color_depth) - 1) << 8;
> +	else
> +		mask = max_value;
> +
> +	lut = malloc(sizeof(struct drm_color_lut) * lut_size);
> +
> +	if (IS_CHERRYVIEW(data->devid))
> +		lut_size -= 1;
> +	for (i = 0; i < lut_size; i++) {
> +		uint32_t v = (gamma->coeffs[i] * max_value);
> +
> +		v &= mask;
> +
> +		lut[i].red = v;
> +		lut[i].green = v;
> +		lut[i].blue = v;
> +	}
> +
> +	if (IS_CHERRYVIEW(data->devid))
> +		lut[lut_size].red =
> +			lut[lut_size].green =
> +			lut[lut_size].blue = lut[lut_size - 1].red;
> +
> +	return lut;
> +}
> +
> +static void set_degamma(data_t *data,
> +			igt_pipe_t *pipe,
> +			const gamma_lut_t *gamma)
> +{
> +	struct drm_color_lut *lut = coeffs_to_lut(data, gamma,
> +						  data->color_depth, 0);
> +
> +	free(lut);
> +}
> +
> +static void set_gamma(data_t *data,
> +		      igt_pipe_t *pipe,
> +		      const gamma_lut_t *gamma)
> +{
> +	size_t size = sizeof(struct drm_color_lut) * gamma->size;
> +	struct drm_color_lut *lut = coeffs_to_lut(data, gamma,
> +						  data->color_depth, 0);
> +
> +	igt_pipe_obj_replace_prop_blob(pipe, IGT_CRTC_GAMMA_LUT, lut, size);
> +
> +	free(lut);
> +}
> +
> +static void set_ctm(igt_pipe_t *pipe, const double *coefficients) {
> +	struct drm_color_ctm ctm;
> +	int i;
> +
> +	for (i = 0; i < ARRAY_SIZE(ctm.matrix); i++) {
> +		if (coefficients[i] < 0) {
> +			ctm.matrix[i] =
> +				(int64_t) (-coefficients[i] *
> +				((int64_t) 1L << 32));
> +			ctm.matrix[i] |= 1ULL << 63;
> +		} else
> +			ctm.matrix[i] =
> +				(int64_t) (coefficients[i] *
> +				((int64_t) 1L << 32));
> +	}
> +
> +	igt_pipe_obj_replace_prop_blob(pipe, IGT_CRTC_CTM, &ctm, sizeof(ctm));
> +}
> +
> +static void disable_prop(igt_pipe_t *pipe, enum
> +igt_atomic_crtc_properties prop) {
> +	if (igt_pipe_obj_has_prop(pipe, prop))
> +		igt_pipe_obj_replace_prop_blob(pipe, prop, NULL, 0); }
> +
> +#define disable_degamma(pipe) disable_prop(pipe, IGT_CRTC_DEGAMMA_LUT)
> +#define disable_gamma(pipe) disable_prop(pipe, IGT_CRTC_GAMMA_LUT)
> +#define disable_ctm(pipe) disable_prop(pipe, IGT_CRTC_CTM)
> +
> +/*
> + * Draw 3 gradient rectangles in red, green and blue, with a maxed out
> + * degamma LUT and verify we have the same frame dump as drawing solid
> +color
> + * rectangles with linear degamma LUT.
> + */
> +static void test_pipe_degamma(data_t *data,
> +			      igt_plane_t *primary)
> +{
> +	igt_output_t *output;
> +	gamma_lut_t *degamma_linear, *degamma_full;
> +	gamma_lut_t *gamma_linear;
> +	color_t red_green_blue[] = {
> +		{ 1.0, 0.0, 0.0 },
> +		{ 0.0, 1.0, 0.0 },
> +		{ 0.0, 0.0, 1.0 }
> +	};
> +
> +	int i;
> +	struct chamelium_port *port;
> +	char *connected_ports[4];
> +	bool valid_output = false;
> +
> +	for (i = 0; i < data->port_count; i++)
> +		connected_ports[i] =
> +			(char *) chamelium_port_get_name(data->ports[i]);
> +
> +	igt_require(igt_pipe_obj_has_prop(primary->pipe,
> IGT_CRTC_DEGAMMA_LUT));
> +	igt_require(igt_pipe_obj_has_prop(primary->pipe,
> IGT_CRTC_GAMMA_LUT));
> +
> +	degamma_linear = generate_table(data->degamma_lut_size, 1.0);
> +	degamma_full = generate_table_max(data->degamma_lut_size);
> +
> +	gamma_linear = generate_table(data->gamma_lut_size, 1.0);
> +
> +	for_each_valid_output_on_pipe(&data->display,
> +				      primary->pipe->pipe,
> +				      output) {
> +		drmModeModeInfo *mode;
> +		struct igt_fb fb_modeset, fb, fbref;
> +		struct chamelium_frame_dump *frame_fullcolors;
> +		int fb_id, fb_modeset_id, fbref_id;
> +
> +		for (i = 0; i < data->port_count; i++)
> +			valid_output |=
> +				(strcmp(output->name, connected_ports[i]) == 0);
> +		if (!valid_output)
> +			continue;
> +		else
> +			for (i = 0; i < data->port_count; i++)
> +				if (strcmp(output->name,
> +					   connected_ports[i]) == 0)
> +					port = data->ports[i];
> +
> +		igt_output_set_pipe(output, primary->pipe->pipe);
> +		mode = igt_output_get_mode(output);
> +
> +		/* Create a framebuffer at the size of the output. */
> +		fb_id = igt_create_fb(data->drm_fd,
> +				      mode->hdisplay,
> +				      mode->vdisplay,
> +				      DRM_FORMAT_XRGB8888,
> +				      LOCAL_DRM_FORMAT_MOD_NONE,
> +				      &fb);
> +		igt_assert(fb_id);
> +
> +		fb_modeset_id = igt_create_fb(data->drm_fd,
> +					      mode->hdisplay,
> +					      mode->vdisplay,
> +					      DRM_FORMAT_XRGB8888,
> +					      LOCAL_DRM_FORMAT_MOD_NONE,
> +					      &fb_modeset);
> +		igt_assert(fb_modeset_id);
> +
> +		fbref_id = igt_create_fb(data->drm_fd,
> +					      mode->hdisplay,
> +					      mode->vdisplay,
> +					      DRM_FORMAT_XRGB8888,
> +					      LOCAL_DRM_FORMAT_MOD_NONE,
> +					      &fbref);
> +		igt_assert(fbref_id);
> +
> +		igt_plane_set_fb(primary, &fb_modeset);
> +		disable_ctm(primary->pipe);
> +		disable_degamma(primary->pipe);
> +		set_gamma(data, primary->pipe, gamma_linear);
> +		igt_display_commit(&data->display);
> +
> +		/* Draw solid colors with no degamma transformation. */
> +		paint_rectangles(data, mode, red_green_blue, &fbref);
> +
> +		/* Draw a gradient with degamma LUT to remap all
> +		 * values to max red/green/blue.
> +		 */
> +		paint_gradient_rectangles(data, mode, red_green_blue, &fb);
> +		igt_plane_set_fb(primary, &fb);
> +		set_degamma(data, primary->pipe, degamma_full);
> +		igt_display_commit(&data->display);
> +		chamelium_capture(data->chamelium, port, 0, 0, 0, 0, 1);
> +		frame_fullcolors =
> +			chamelium_read_captured_frame(data->chamelium, 0);
> +
> +		/* Verify that the framebuffer reference of the software
> +		 * computed output is equal to the frame dump of the degamma
> +		 * LUT transformation output.
> +		 */
> +		igt_assert(chamelium_frame_match_or_dump(data->chamelium,
> port,
> +							 frame_fullcolors,
> +							 &fbref,
> +
> CHAMELIUM_CHECK_ANALOG));
> +
> +		igt_plane_set_fb(primary, NULL);
> +		igt_output_set_pipe(output, PIPE_NONE);
> +	}
> +
> +	free_lut(degamma_linear);
> +	free_lut(degamma_full);
> +	free_lut(gamma_linear);
> +}
> +
> +/*
> + * Draw 3 gradient rectangles in red, green and blue, with a maxed out
> + * gamma LUT and verify we have the same frame dump as drawing solid
> + * color rectangles.
> + */
> +static void test_pipe_gamma(data_t *data,
> +			    igt_plane_t *primary)
> +{
> +	igt_output_t *output;
> +	gamma_lut_t *gamma_full;
> +	color_t red_green_blue[] = {
> +		{ 1.0, 0.0, 0.0 },
> +		{ 0.0, 1.0, 0.0 },
> +		{ 0.0, 0.0, 1.0 }
> +	};
> +
> +	int i;
> +	struct chamelium_port *port;
> +	char *connected_ports[4];
> +	bool valid_output = false;
> +
> +	for (i = 0; i < data->port_count; i++)
> +		connected_ports[i] =
> +			(char *) chamelium_port_get_name(data->ports[i]);
> +
> +	igt_require(igt_pipe_obj_has_prop(primary->pipe,
> IGT_CRTC_GAMMA_LUT));
> +
> +	gamma_full = generate_table_max(data->gamma_lut_size);
> +
> +	for_each_valid_output_on_pipe(&data->display,
> +				      primary->pipe->pipe,
> +				      output) {
> +		drmModeModeInfo *mode;
> +		struct igt_fb fb_modeset, fb, fbref;
> +		struct chamelium_frame_dump *frame_fullcolors;
> +		int fb_id, fb_modeset_id, fbref_id;
> +
> +		for (i = 0; i < data->port_count; i++)
> +			valid_output |=
> +				(strcmp(output->name, connected_ports[i]) == 0);
> +		if (!valid_output)
> +			continue;
> +		else
> +			for (i = 0; i < data->port_count; i++)
> +				if (strcmp(output->name,
> +					   connected_ports[i]) == 0)
> +					port = data->ports[i];
> +
> +		igt_output_set_pipe(output, primary->pipe->pipe);
> +		mode = igt_output_get_mode(output);
> +
> +		/* Create a framebuffer at the size of the output. */
> +		fb_id = igt_create_fb(data->drm_fd,
> +				      mode->hdisplay,
> +				      mode->vdisplay,
> +				      DRM_FORMAT_XRGB8888,
> +				      LOCAL_DRM_FORMAT_MOD_NONE,
> +				      &fb);
> +		igt_assert(fb_id);
> +
> +		fb_modeset_id = igt_create_fb(data->drm_fd,
> +					      mode->hdisplay,
> +					      mode->vdisplay,
> +					      DRM_FORMAT_XRGB8888,
> +					      LOCAL_DRM_FORMAT_MOD_NONE,
> +					      &fb_modeset);
> +		igt_assert(fb_modeset_id);
> +
> +		fbref_id = igt_create_fb(data->drm_fd,
> +				      mode->hdisplay,
> +				      mode->vdisplay,
> +				      DRM_FORMAT_XRGB8888,
> +				      LOCAL_DRM_FORMAT_MOD_NONE,
> +				      &fbref);
> +		igt_assert(fbref_id);
> +
> +		igt_plane_set_fb(primary, &fb_modeset);
> +		disable_ctm(primary->pipe);
> +		disable_degamma(primary->pipe);
> +		set_gamma(data, primary->pipe, gamma_full);
> +		igt_display_commit(&data->display);
> +
> +		/* Draw solid colors with no gamma transformation. */
> +		paint_rectangles(data, mode, red_green_blue, &fbref);
> +
> +		/* Draw a gradient with gamma LUT to remap all values
> +		 * to max red/green/blue.
> +		 */
> +		paint_gradient_rectangles(data, mode, red_green_blue, &fb);
> +		igt_plane_set_fb(primary, &fb);
> +		igt_display_commit(&data->display);
> +		chamelium_capture(data->chamelium, port, 0, 0, 0, 0, 1);
> +		frame_fullcolors =
> +			chamelium_read_captured_frame(data->chamelium, 0);
> +
> +		/* Verify that the framebuffer reference of the software
> +		 * computed output is equal to the frame dump of the
> +		 * degamma LUT transformation output.
> +		 */
> +		igt_assert(chamelium_frame_match_or_dump(data->chamelium,
> port,
> +							 frame_fullcolors,
> +							 &fbref,
> +
> CHAMELIUM_CHECK_ANALOG));
> +
> +		igt_plane_set_fb(primary, NULL);
> +		igt_output_set_pipe(output, PIPE_NONE);
> +	}
> +
> +	free_lut(gamma_full);
> +}
> +
> +/*
> + * Draw 3 rectangles using before colors with the ctm matrix apply and
> +verify
> + * the frame dump is equal to using after colors with an identify ctm matrix.
> + */
> +static bool test_pipe_ctm(data_t *data,
> +			  igt_plane_t *primary,
> +			  color_t *before,
> +			  color_t *after,
> +			  double *ctm_matrix)
> +{
> +	gamma_lut_t *degamma_linear, *gamma_linear;
> +	igt_output_t *output;
> +
> +	int i;
> +	bool ret = true;
> +	struct chamelium_port *port;
> +	char *connected_ports[4];
> +	bool valid_output = false;
> +
> +	igt_require(igt_pipe_obj_has_prop(primary->pipe, IGT_CRTC_CTM));
> +
> +	for (i = 0; i < data->port_count; i++)
> +		connected_ports[i] =
> +			(char *) chamelium_port_get_name(data->ports[i]);
> +
> +	degamma_linear = generate_table(data->degamma_lut_size, 1.0);
> +	gamma_linear = generate_table(data->gamma_lut_size, 1.0);
> +
> +	for_each_valid_output_on_pipe(&data->display,
> +				      primary->pipe->pipe,
> +				      output) {
> +		drmModeModeInfo *mode;
> +		struct igt_fb fb_modeset, fb, fbref;
> +		struct chamelium_frame_dump *frame_hardware;
> +		int fb_id, fb_modeset_id, fbref_id;
> +
> +		for (i = 0; i < data->port_count; i++)
> +			valid_output |=
> +				(strcmp(output->name, connected_ports[i]) == 0);
> +		if (!valid_output)
> +			continue;
> +		else
> +			for (i = 0; i < data->port_count; i++)
> +				if (strcmp(output->name,
> +					   connected_ports[i]) == 0)
> +					port = data->ports[i];
> +
> +		igt_output_set_pipe(output, primary->pipe->pipe);
> +		mode = igt_output_get_mode(output);
> +
> +		/* Create a framebuffer at the size of the output. */
> +		fb_id = igt_create_fb(data->drm_fd,
> +				      mode->hdisplay,
> +				      mode->vdisplay,
> +				      DRM_FORMAT_XRGB8888,
> +				      LOCAL_DRM_FORMAT_MOD_NONE,
> +				      &fb);
> +		igt_assert(fb_id);
> +
> +		fb_modeset_id = igt_create_fb(data->drm_fd,
> +					      mode->hdisplay,
> +					      mode->vdisplay,
> +					      DRM_FORMAT_XRGB8888,
> +					      LOCAL_DRM_FORMAT_MOD_NONE,
> +					      &fb_modeset);
> +		igt_assert(fb_modeset_id);
> +
> +		fbref_id = igt_create_fb(data->drm_fd,
> +				      mode->hdisplay,
> +				      mode->vdisplay,
> +				      DRM_FORMAT_XRGB8888,
> +				      LOCAL_DRM_FORMAT_MOD_NONE,
> +				      &fbref);
> +		igt_assert(fbref_id);
> +
> +		igt_plane_set_fb(primary, &fb_modeset);
> +
> +		if (memcmp(before, after, sizeof(color_t))) {
> +			set_degamma(data, primary->pipe, degamma_linear);
> +			set_gamma(data, primary->pipe, gamma_linear);
> +		} else {
> +			/* Disable Degamma and Gamma for ctm max test */
> +			disable_degamma(primary->pipe);
> +			disable_gamma(primary->pipe);
> +		}
> +
> +		disable_ctm(primary->pipe);
> +		igt_display_commit(&data->display);
> +
> +		paint_rectangles(data, mode, after, &fbref);
> +
> +		/* With CTM transformation. */
> +		paint_rectangles(data, mode, before, &fb);
> +		igt_plane_set_fb(primary, &fb);
> +		set_ctm(primary->pipe, ctm_matrix);
> +		igt_display_commit(&data->display);
> +		chamelium_capture(data->chamelium, port, 0, 0, 0, 0, 1);
> +		frame_hardware =
> +			chamelium_read_captured_frame(data->chamelium, 0);
> +
> +		/* Verify that the framebuffer reference of the software
> +		 * computed output is equal to the frame dump of the CTM
> +		 * matrix transformation output.
> +		 */
> +		ret &= chamelium_frame_match_or_dump(data->chamelium, port,
> +						     frame_hardware,
> +						     &fbref,
> +						     CHAMELIUM_CHECK_ANALOG);
> +
> +		igt_plane_set_fb(primary, NULL);
> +		igt_output_set_pipe(output, PIPE_NONE);
> +	}
> +
> +	free_lut(degamma_linear);
> +	free_lut(gamma_linear);
> +
> +	return ret;
> +}
> +
> +static void test_pipe_limited_range_ctm(data_t *data,
> +					igt_plane_t *primary)
> +{
> +	double limited_result = 235.0 / 255.0;
> +	color_t red_green_blue_limited[] = {
> +		{ limited_result, 0.0, 0.0 },
> +		{ 0.0, limited_result, 0.0 },
> +		{ 0.0, 0.0, limited_result }
> +	};
> +	color_t red_green_blue_full[] = {
> +		{ 0.5, 0.0, 0.0 },
> +		{ 0.0, 0.5, 0.0 },
> +		{ 0.0, 0.0, 0.5 }
> +	};
> +	double ctm[] = { 1.0, 0.0, 0.0,
> +			0.0, 1.0, 0.0,
> +			0.0, 0.0, 1.0 };
> +	gamma_lut_t *degamma_linear, *gamma_linear;
> +	igt_output_t *output;
> +	bool has_broadcast_rgb_output = false;
> +
> +	int i;
> +	struct chamelium_port *port;
> +	char *connected_ports[4];
> +	bool valid_output = false;
> +
> +	degamma_linear = generate_table(data->degamma_lut_size, 1.0);
> +	gamma_linear = generate_table(data->gamma_lut_size, 1.0);
> +
> +	for (i = 0; i < data->port_count; i++)
> +		connected_ports[i] =
> +			(char *) chamelium_port_get_name(data->ports[i]);
> +
> +	for_each_valid_output_on_pipe(&data->display,
> +				      primary->pipe->pipe,
> +				      output) {
> +		drmModeModeInfo *mode;
> +		struct igt_fb fb_modeset, fb, fbref;
> +		struct chamelium_frame_dump *frame_limited;
> +		int fb_id, fb_modeset_id, fbref_id;
> +
> +		for (i = 0; i < data->port_count; i++)
> +			valid_output |=
> +				(strcmp(output->name, connected_ports[i]) == 0);
> +		if (!valid_output)
> +			continue;
> +		else
> +			for (i = 0; i < data->port_count; i++)
> +				if (strcmp(output->name,
> +				    connected_ports[i]) == 0)
> +					port = data->ports[i];
> +
> +		if (!igt_output_has_prop(output,
> IGT_CONNECTOR_BROADCAST_RGB))
> +			continue;
> +
> +		has_broadcast_rgb_output = true;
> +
> +		igt_output_set_pipe(output, primary->pipe->pipe);
> +		mode = igt_output_get_mode(output);
> +
> +		/* Create a framebuffer at the size of the output. */
> +		fb_id = igt_create_fb(data->drm_fd,
> +				      mode->hdisplay,
> +				      mode->vdisplay,
> +				      DRM_FORMAT_XRGB8888,
> +				      LOCAL_DRM_FORMAT_MOD_NONE,
> +				      &fb);
> +		igt_assert(fb_id);
> +
> +		fb_modeset_id = igt_create_fb(data->drm_fd,
> +					      mode->hdisplay,
> +					      mode->vdisplay,
> +					      DRM_FORMAT_XRGB8888,
> +					      LOCAL_DRM_FORMAT_MOD_NONE,
> +					      &fb_modeset);
> +		igt_assert(fb_modeset_id);
> +
> +		fbref_id = igt_create_fb(data->drm_fd,
> +				      mode->hdisplay,
> +				      mode->vdisplay,
> +				      DRM_FORMAT_XRGB8888,
> +				      LOCAL_DRM_FORMAT_MOD_NONE,
> +				      &fbref);
> +		igt_assert(fbref_id);
> +
> +		igt_plane_set_fb(primary, &fb_modeset);
> +
> +		set_degamma(data, primary->pipe, degamma_linear);
> +		set_gamma(data, primary->pipe, gamma_linear);
> +		set_ctm(primary->pipe, ctm);
> +
> +		igt_output_set_prop_value(output,
> +					  IGT_CONNECTOR_BROADCAST_RGB,
> +					  BROADCAST_RGB_FULL);
> +		paint_rectangles(data, mode, red_green_blue_limited, &fb);
> +		igt_plane_set_fb(primary, &fb);
> +		igt_display_commit(&data->display);
> +
> +		/* Set the output into limited range. */
> +		igt_output_set_prop_value(output,
> +					  IGT_CONNECTOR_BROADCAST_RGB,
> +					  BROADCAST_RGB_16_235);
> +		paint_rectangles(data, mode, red_green_blue_full, &fb);
> +
> +		/* And reset.. */
> +		igt_output_set_prop_value(output,
> +					  IGT_CONNECTOR_BROADCAST_RGB,
> +					  BROADCAST_RGB_FULL);
> +		igt_plane_set_fb(primary, NULL);
> +		igt_output_set_pipe(output, PIPE_NONE);
> +		chamelium_capture(data->chamelium, port, 0, 0, 0, 0, 1);
> +		frame_limited =
> +			chamelium_read_captured_frame(data->chamelium, 0);
> +
> +
> +		/* Verify that the framebuffer reference of the software
> +		 * computed output is equal to the frame dump of the CTM
> +		 * matrix transformation output.
> +		 */
> +		igt_assert(chamelium_frame_match_or_dump(data->chamelium,
> port,
> +							 frame_limited,
> +							 &fbref,
> +
> CHAMELIUM_CHECK_ANALOG));
> +
> +	}
> +
> +	free_lut(gamma_linear);
> +	free_lut(degamma_linear);
> +
> +	igt_require(has_broadcast_rgb_output);
> +}
> +
> +static void
> +run_tests_for_pipe(data_t *data, enum pipe p) {
> +	igt_pipe_t *pipe;
> +	igt_plane_t *primary;
> +	double delta;
> +	int i;
> +	color_t red_green_blue[] = {
> +		{ 1.0, 0.0, 0.0 },
> +		{ 0.0, 1.0, 0.0 },
> +		{ 0.0, 0.0, 1.0 }
> +	};
> +
> +	igt_fixture {
> +
> +		igt_require(p < data->display.n_pipes);
> +
> +		pipe = &data->display.pipes[p];
> +		igt_require(pipe->n_planes >= 0);
> +
> +		primary = igt_pipe_get_plane_type(pipe,
> DRM_PLANE_TYPE_PRIMARY);
> +
> +		if (igt_pipe_obj_has_prop(&data->display.pipes[p],
> +					  IGT_CRTC_DEGAMMA_LUT_SIZE)) {
> +			data->degamma_lut_size =
> +				igt_pipe_obj_get_prop(&data->display.pipes[p],
> +						IGT_CRTC_DEGAMMA_LUT_SIZE);
> +			igt_assert_lt(0, data->degamma_lut_size);
> +		}
> +
> +		if (igt_pipe_obj_has_prop(&data->display.pipes[p],
> +					  IGT_CRTC_GAMMA_LUT_SIZE)) {
> +			data->gamma_lut_size =
> +				igt_pipe_obj_get_prop(&data->display.pipes[p],
> +						      IGT_CRTC_GAMMA_LUT_SIZE);
> +			igt_assert_lt(0, data->gamma_lut_size);
> +		}
> +
> +		igt_display_require_output_on_pipe(&data->display, p);
> +	}
> +
> +	data->color_depth = 8;
> +	delta = 1.0 / (1 << data->color_depth);
> +
> +	igt_describe("Compare after applying ctm matrix & identity matrix");
> +	igt_subtest_f("pipe-%s-ctm-red-to-blue", kmstest_pipe_name(p)) {
> +		color_t blue_green_blue[] = {
> +			{ 0.0, 0.0, 1.0 },
> +			{ 0.0, 1.0, 0.0 },
> +			{ 0.0, 0.0, 1.0 }
> +		};
> +		double ctm[] = { 0.0, 0.0, 0.0,
> +				0.0, 1.0, 0.0,
> +				1.0, 0.0, 1.0 };
> +		igt_assert(test_pipe_ctm(data, primary, red_green_blue,
> +					 blue_green_blue, ctm));
> +	}
> +
> +	igt_describe("Compare after applying ctm matrix & identity matrix");
> +	igt_subtest_f("pipe-%s-ctm-green-to-red", kmstest_pipe_name(p)) {
> +		color_t red_red_blue[] = {
> +			{ 1.0, 0.0, 0.0 },
> +			{ 1.0, 0.0, 0.0 },
> +			{ 0.0, 0.0, 1.0 }
> +		};
> +		double ctm[] = { 1.0, 1.0, 0.0,
> +				0.0, 0.0, 0.0,
> +				0.0, 0.0, 1.0 };
> +		igt_assert(test_pipe_ctm(data, primary, red_green_blue,
> +					 red_red_blue, ctm));
> +	}
> +
> +	igt_describe("Compare after applying ctm matrix & identity matrix");
> +	igt_subtest_f("pipe-%s-ctm-blue-to-red", kmstest_pipe_name(p)) {
> +		color_t red_green_red[] = {
> +			{ 1.0, 0.0, 0.0 },
> +			{ 0.0, 1.0, 0.0 },
> +			{ 1.0, 0.0, 0.0 }
> +		};
> +		double ctm[] = { 1.0, 0.0, 1.0,
> +				0.0, 1.0, 0.0,
> +				0.0, 0.0, 0.0 };
> +		igt_assert(test_pipe_ctm(data, primary, red_green_blue,
> +					 red_green_red, ctm));
> +	}
> +
> +	/* We tests a few values around the expected result because
> +	 * the it depends on the hardware we're dealing with, we can
> +	 * either get clamped or rounded values and we also need to
> +	 * account for odd number of items in the LUTs.
> +	 */
> +	igt_describe("Compare after applying ctm matrix & identity matrix");
> +	igt_subtest_f("pipe-%s-ctm-0-25", kmstest_pipe_name(p)) {
> +		color_t expected_colors[] = {
> +			{ 0.0, }, { 0.0, }, { 0.0, }
> +		};
> +		double ctm[] = { 0.25, 0.0,  0.0,
> +				 0.0,  0.25, 0.0,
> +				 0.0,  0.0,  0.25 };
> +		bool success = false;
> +
> +		for (i = 0; i < 5; i++) {
> +			expected_colors[0].r =
> +				expected_colors[1].g =
> +				expected_colors[2].b =
> +				0.25 + delta * (i - 2);
> +			success |= test_pipe_ctm(data, primary,
> +						 red_green_blue,
> +						 expected_colors, ctm);
> +		}
> +		igt_assert(success);
> +	}
> +
> +	igt_describe("Compare after applying ctm matrix & identity matrix");
> +	igt_subtest_f("pipe-%s-ctm-0-5", kmstest_pipe_name(p)) {
> +		color_t expected_colors[] = {
> +			{ 0.0, }, { 0.0, }, { 0.0, }
> +		};
> +		double ctm[] = { 0.5, 0.0, 0.0,
> +				 0.0, 0.5, 0.0,
> +				 0.0, 0.0, 0.5 };
> +		bool success = false;
> +
> +		for (i = 0; i < 5; i++) {
> +			expected_colors[0].r =
> +				expected_colors[1].g =
> +				expected_colors[2].b =
> +				0.5 + delta * (i - 2);
> +			success |= test_pipe_ctm(data, primary,
> +						 red_green_blue,
> +						 expected_colors, ctm);
> +		}
> +		igt_assert(success);
> +	}
> +
> +	igt_describe("Compare after applying ctm matrix & identity matrix");
> +	igt_subtest_f("pipe-%s-ctm-0-75", kmstest_pipe_name(p)) {
> +		color_t expected_colors[] = {
> +			{ 0.0, }, { 0.0, }, { 0.0, }
> +		};
> +		double ctm[] = { 0.75, 0.0,  0.0,
> +				 0.0,  0.75, 0.0,
> +				 0.0,  0.0,  0.75 };
> +		bool success = false;
> +
> +		for (i = 0; i < 7; i++) {
> +			expected_colors[0].r =
> +				expected_colors[1].g =
> +				expected_colors[2].b =
> +				0.75 + delta * (i - 3);
> +			success |= test_pipe_ctm(data, primary,
> +						 red_green_blue,
> +						 expected_colors, ctm);
> +		}
> +		igt_assert(success);
> +	}
> +
> +	igt_describe("Compare after applying ctm matrix & identity matrix");
> +	igt_subtest_f("pipe-%s-ctm-max", kmstest_pipe_name(p)) {
> +		color_t full_rgb[] = {
> +			{ 1.0, 0.0, 0.0 },
> +			{ 0.0, 1.0, 0.0 },
> +			{ 0.0, 0.0, 1.0 }
> +		};
> +		double ctm[] = { 100.0,   0.0,   0.0,
> +				 0.0,   100.0,   0.0,
> +				 0.0,     0.0, 100.0 };
> +
> +		/* CherryView generates values on 10bits that we
> +		 * produce with an 8 bits per color framebuffer.
> +		 */
> +		igt_require(!IS_CHERRYVIEW(data->devid));
> +
> +		igt_assert(test_pipe_ctm(data, primary, red_green_blue,
> +					 full_rgb, ctm));
> +	}
> +
> +	igt_describe("Compare after applying ctm matrix & identity matrix");
> +	igt_subtest_f("pipe-%s-ctm-negative", kmstest_pipe_name(p)) {
> +		color_t all_black[] = {
> +			{ 0.0, 0.0, 0.0 },
> +			{ 0.0, 0.0, 0.0 },
> +			{ 0.0, 0.0, 0.0 }
> +		};
> +		double ctm[] = { -1.0,  0.0,  0.0,
> +				 0.0, -1.0,  0.0,
> +				 0.0,  0.0, -1.0 };
> +		igt_assert(test_pipe_ctm(data, primary, red_green_blue,
> +					 all_black, ctm));
> +	}
> +
> +	igt_describe("Compare after applying ctm matrix & identity matrix");
> +	igt_subtest_f("pipe-%s-ctm-limited-range", kmstest_pipe_name(p))
> +		test_pipe_limited_range_ctm(data, primary);
> +
> +	igt_describe("Compare maxed out gamma LUT and solid color linear LUT");
> +	igt_subtest_f("pipe-%s-degamma", kmstest_pipe_name(p))
> +		test_pipe_degamma(data, primary);
> +
> +	igt_describe("Compare maxed out gamma LUT and solid color linear LUT");
> +	igt_subtest_f("pipe-%s-gamma", kmstest_pipe_name(p))
> +		test_pipe_gamma(data, primary);
> +
> +	igt_fixture {
> +		disable_degamma(primary->pipe);
> +		disable_gamma(primary->pipe);
> +		disable_ctm(primary->pipe);
> +		igt_display_commit(&data->display);
> +	}
> +}
> +
> +static int
> +pipe_set_property_blob_id(igt_pipe_t *pipe,
> +			  enum igt_atomic_crtc_properties prop,
> +			  uint32_t blob_id)
> +{
> +	int ret;
> +
> +	igt_pipe_obj_replace_prop_blob(pipe, prop, NULL, 0);
> +
> +	igt_pipe_obj_set_prop_value(pipe, prop, blob_id);
> +
> +	ret = igt_display_try_commit2(pipe->display,
> +				      pipe->display->is_atomic ?
> +				      COMMIT_ATOMIC : COMMIT_LEGACY);
> +
> +	igt_pipe_obj_set_prop_value(pipe, prop, 0);
> +
> +	return ret;
> +}
> +
> +static int
> +pipe_set_property_blob(igt_pipe_t *pipe,
> +		       enum igt_atomic_crtc_properties prop,
> +		       void *ptr, size_t length)
> +{
> +	igt_pipe_obj_replace_prop_blob(pipe, prop, ptr, length);
> +
> +	return igt_display_try_commit2(pipe->display,
> +				       pipe->display->is_atomic ?
> +				       COMMIT_ATOMIC : COMMIT_LEGACY); }
> +
> +static void
> +invalid_gamma_lut_sizes(data_t *data)
> +{
> +	igt_display_t *display = &data->display;
> +	igt_pipe_t *pipe = &display->pipes[0];
> +	size_t gamma_lut_size = data->gamma_lut_size *
> +				sizeof(struct drm_color_lut);
> +	struct drm_color_lut *gamma_lut;
> +
> +	igt_require(igt_pipe_obj_has_prop(pipe, IGT_CRTC_GAMMA_LUT));
> +
> +	gamma_lut = malloc(gamma_lut_size * 2);
> +
> +	igt_display_commit2(display,
> +			    display->is_atomic ?
> +			    COMMIT_ATOMIC : COMMIT_LEGACY);
> +
> +	igt_assert_eq(pipe_set_property_blob(pipe,
> +					     IGT_CRTC_GAMMA_LUT,
> +					     gamma_lut, 1),
> +					     -EINVAL);
> +	igt_assert_eq(pipe_set_property_blob(pipe,
> +					     IGT_CRTC_GAMMA_LUT,
> +					     gamma_lut, gamma_lut_size + 1),
> +					     -EINVAL);
> +	igt_assert_eq(pipe_set_property_blob(pipe,
> +					     IGT_CRTC_GAMMA_LUT,
> +					     gamma_lut,
> +					     gamma_lut_size - 1),
> +					     -EINVAL);
> +	igt_assert_eq(pipe_set_property_blob(pipe,
> +					     IGT_CRTC_GAMMA_LUT,
> +					     gamma_lut,
> +					     gamma_lut_size +
> +					     sizeof(struct drm_color_lut)),
> +					     -EINVAL);
> +	igt_assert_eq(pipe_set_property_blob_id(pipe,
> +						IGT_CRTC_GAMMA_LUT,
> +						pipe->crtc_id),
> +						-EINVAL);
> +	igt_assert_eq(pipe_set_property_blob_id(pipe,
> +						IGT_CRTC_GAMMA_LUT,
> +						4096 * 4096),
> +						-EINVAL);
> +
> +	free(gamma_lut);
> +}
> +
> +static void
> +invalid_degamma_lut_sizes(data_t *data) {
> +	igt_display_t *display = &data->display;
> +	igt_pipe_t *pipe = &display->pipes[0];
> +	size_t degamma_lut_size = data->degamma_lut_size *
> +				  sizeof(struct drm_color_lut);
> +	struct drm_color_lut *degamma_lut;
> +
> +	igt_require(igt_pipe_obj_has_prop(pipe, IGT_CRTC_DEGAMMA_LUT));
> +
> +	degamma_lut = malloc(degamma_lut_size * 2);
> +
> +	igt_display_commit2(display,
> +			    display->is_atomic ?
> +			    COMMIT_ATOMIC : COMMIT_LEGACY);
> +
> +	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_DEGAMMA_LUT,
> +					     degamma_lut, 1), -EINVAL);
> +	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_DEGAMMA_LUT,
> +					     degamma_lut, degamma_lut_size + 1),
> +					     -EINVAL);
> +	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_DEGAMMA_LUT,
> +					     degamma_lut,
> +					     degamma_lut_size - 1),
> +					     -EINVAL);
> +	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_DEGAMMA_LUT,
> +					     degamma_lut,
> +					     degamma_lut_size +
> +					     sizeof(struct drm_color_lut)),
> +					     -EINVAL);
> +	igt_assert_eq(pipe_set_property_blob_id(pipe, IGT_CRTC_DEGAMMA_LUT,
> +						pipe->crtc_id), -EINVAL);
> +	igt_assert_eq(pipe_set_property_blob_id(pipe, IGT_CRTC_DEGAMMA_LUT,
> +						4096 * 4096), -EINVAL);
> +
> +	free(degamma_lut);
> +}
> +
> +static void
> +invalid_ctm_matrix_sizes(data_t *data)
> +{
> +	igt_display_t *display = &data->display;
> +	igt_pipe_t *pipe = &display->pipes[0];
> +	void *ptr;
> +
> +	igt_require(igt_pipe_obj_has_prop(pipe, IGT_CRTC_CTM));
> +
> +	ptr = malloc(sizeof(struct drm_color_ctm) * 4);
> +
> +	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_CTM, ptr, 1),
> +					     -EINVAL);
> +	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_CTM, ptr,
> +					     sizeof(struct drm_color_ctm) + 1),
> +					     -EINVAL);
> +	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_CTM, ptr,
> +					     sizeof(struct drm_color_ctm) - 1),
> +					     -EINVAL);
> +	igt_assert_eq(pipe_set_property_blob(pipe, IGT_CRTC_CTM, ptr,
> +					     sizeof(struct drm_color_ctm) * 2),
> +					     -EINVAL);
> +	igt_assert_eq(pipe_set_property_blob_id(pipe, IGT_CRTC_CTM,
> +						pipe->crtc_id), -EINVAL);
> +	igt_assert_eq(pipe_set_property_blob_id(pipe, IGT_CRTC_CTM,
> +						4096 * 4096), -EINVAL);
> +
> +	free(ptr);
> +}
> +
> +igt_main
> +{
> +	data_t data = {};
> +	enum pipe pipe;
> +
> +	igt_fixture {
> +		data.drm_fd = drm_open_driver_master(DRIVER_ANY);
> +		if (is_i915_device(data.drm_fd))
> +			data.devid = intel_get_drm_devid(data.drm_fd);
> +		data.chamelium = chamelium_init(data.drm_fd);
> +		igt_require(data.chamelium);
> +
> +		data.ports = chamelium_get_ports(data.chamelium,
> +						 &data.port_count);
> +
> +		kmstest_set_vt_graphics_mode();
> +		igt_display_require(&data.display, data.drm_fd);
> +		igt_require(data.display.is_atomic);
> +	}
> +
> +	for_each_pipe_static(pipe)
> +		igt_subtest_group
> +			run_tests_for_pipe(&data, pipe);
> +	igt_describe("Negative test case gamma lut size");
> +	igt_subtest_f("pipe-invalid-gamma-lut-sizes")
> +		invalid_gamma_lut_sizes(&data);
> +
> +	igt_describe("Negative test case degamma lut size");
> +	igt_subtest_f("pipe-invalid-degamma-lut-sizes")
> +		invalid_degamma_lut_sizes(&data);
> +
> +	igt_describe("Negative test case ctm matrix size");
> +	igt_subtest_f("pipe-invalid-ctm-matrix-sizes")
> +		invalid_ctm_matrix_sizes(&data);
> +
> +	igt_fixture {
> +		igt_display_fini(&data.display);
> +	}
> +}
> diff --git a/tests/meson.build b/tests/meson.build index a79d22b..a10854f 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -255,6 +255,7 @@ endif
>  if chamelium.found()
>  	test_progs += [
>  		'kms_chamelium',
> +		'kms_color_chamelium',
>  	]
>  	test_deps += chamelium
>  endif
> --
> 2.7.4

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

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

end of thread, other threads:[~2020-01-20  7:39 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-16  6:19 [igt-dev] [PATCH i-g-t v2 0/2] validate color tests using chamelium Kunal Joshi
2020-01-16  6:19 ` [igt-dev] [PATCH i-g-t v2 1/2] lib/igt_chamelium: added function returning a bool to compare framebuffer reference with framedump Kunal Joshi
2020-01-16  6:19 ` [igt-dev] [PATCH i-g-t v2 2/2] tests/kms_color_chamelium: add subtests to validate color Kunal Joshi
2020-01-20  7:38   ` Shankar, Uma
2020-01-16 15:03 ` [igt-dev] ✓ Fi.CI.BAT: success for validate color tests using chamelium. (rev2) Patchwork
2020-01-19  7:07 ` [igt-dev] ✓ Fi.CI.IGT: " 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.