diff mbox

[igt,3/4] kms_frontbuffer_tracking: add stridechange subtest

Message ID 1445376139-14817-3-git-send-email-paulo.r.zanoni@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Zanoni, Paulo R Oct. 20, 2015, 9:22 p.m. UTC
This is a corner case not exercised by the other subtests. The test is
expected to pass both with the current Kernel tree and with the
patches that are on the mailing list.

The patches currently on the mailing list change how the CFB is
allocated, and this subtest is designed to make sure everything still
works as expected.

Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
---
 tests/kms_frontbuffer_tracking.c | 47 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 46 insertions(+), 1 deletion(-)
diff mbox

Patch

diff --git a/tests/kms_frontbuffer_tracking.c b/tests/kms_frontbuffer_tracking.c
index 2c0295c..e183a06 100644
--- a/tests/kms_frontbuffer_tracking.c
+++ b/tests/kms_frontbuffer_tracking.c
@@ -2876,6 +2876,47 @@  static void badstride_subtest(const struct test_mode *t)
 	igt_remove_fb(drm.fd, &wide_fb);
 }
 
+/**
+ * stridechange - change the frontbuffer stride by doing a modeset
+ *
+ * METHOD
+ *   This test sets a mode on a CRTC, then creates a buffer with a different
+ *   stride - still compatible with FBC -, and sets the mode on it. The Kernel
+ *   currently shortcuts the modeset path for this case, so it won't trigger
+ *   calls to xx_crtc_enable or xx_crtc_disable, and that could lead to
+ *   problems, so test the case.
+ *
+ * EXPECTED RESULTS
+ *   With the current Kernel, FBC may or may not remain enabled on this case,
+ *   but we can still check the CRC values.
+ *
+ * FAILURES
+ *   A bad Kernel may just not resize the CFB while keeping FBC enabled, and
+ *   this can lead to underruns or stolen memory corruption. Underruns usually
+ *   lead to CRC check errors, and stolen memory corruption can't be easily
+ *   checked currently. A bad Kernel may also just throw some WARNs on dmesg.
+ */
+static void stridechange_subtest(const struct test_mode *t)
+{
+	struct igt_fb new_fb;
+	struct modeset_params *params = pick_params(t);
+
+	prepare_subtest(t, NULL);
+
+	create_fb(t->format, params->fb.fb->width + 512, params->fb.fb->height,
+		  LOCAL_I915_FORMAT_MOD_X_TILED, t->plane, &new_fb);
+	fill_fb(&new_fb, COLOR_PRIM_BG);
+
+	params->fb.fb = &new_fb;
+	set_mode_for_params(params);
+
+	/* We can't assert that FBC will be enabled since there may not be
+	 * enough space for the CFB, but we can check the CRC. */
+	do_assertions(DONT_ASSERT_FEATURE_STATUS);
+
+	igt_remove_fb(drm.fd, &new_fb);
+}
+
 static int opt_handler(int option, int option_index, void *data)
 {
 	switch (option) {
@@ -3276,10 +3317,14 @@  int main(int argc, char *argv[])
 		igt_subtest_f("%s-modesetfrombusy", feature_str(t.feature))
 			modesetfrombusy_subtest(&t);
 
-		if (t.feature & FEATURE_FBC)
+		if (t.feature & FEATURE_FBC) {
 			igt_subtest_f("%s-badstride", feature_str(t.feature))
 				badstride_subtest(&t);
 
+			igt_subtest_f("%s-stridechange", feature_str(t.feature))
+				stridechange_subtest(&t);
+		}
+
 		if (t.feature & FEATURE_PSR)
 			igt_subtest_f("%s-slowdraw", feature_str(t.feature))
 				slow_draw_subtest(&t);