diff mbox

[igt,4/4] kms_frontbuffer_tracking: be aware of the new FBC Kernel workaround

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

Commit Message

Zanoni, Paulo R Feb. 25, 2016, 4:48 p.m. UTC
We recently implemented a Kernel workaround that deactivates FBC in
case the FBC frontbuffer was ever CPU or WC mmapped. Change the test
suite to take this into account, otherwise we'll fail many tests with
!fbc_enabled assertions.

Also notice that if your Kernel doesn't have the workaround, then this
commit is going to break a lot of tests. The Kernel commit you need
is:
    drm/i915: opt-out CPU and WC mmaps from FBC

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

Patch

diff --git a/tests/kms_frontbuffer_tracking.c b/tests/kms_frontbuffer_tracking.c
index aa124d3..671b0dd 100644
--- a/tests/kms_frontbuffer_tracking.c
+++ b/tests/kms_frontbuffer_tracking.c
@@ -1900,6 +1900,23 @@  static void update_wanted_crc(const struct test_mode *t, struct both_crcs *crc)
 		wanted_crc = crc;
 }
 
+/*
+ * The recent Kernel versions have a workaround that will refuse to activate FBC
+ * if the FBC frontbuffer has ever been CPU or WC mmapped.
+ */
+static bool op_disables_fbc(const struct test_mode *t,
+			    enum igt_draw_method method)
+{
+	if (method != IGT_DRAW_MMAP_CPU && method != IGT_DRAW_MMAP_WC)
+		return false;
+	if (t->plane != PLANE_PRI)
+		return false;
+	if (t->screen == SCREEN_PRIM || t->fbs == FBS_SHARED)
+		return true;
+
+	return false;
+}
+
 static bool op_disables_psr(const struct test_mode *t,
 			    enum igt_draw_method method)
 {
@@ -1969,6 +1986,8 @@  static void draw_subtest(const struct test_mode *t)
 		igt_assert(false);
 	}
 
+	if (op_disables_fbc(t, t->method))
+		assertions |= ASSERT_FBC_DISABLED;
 	if (op_disables_psr(t, t->method))
 		assertions |= ASSERT_PSR_DISABLED;
 
@@ -2027,7 +2046,12 @@  static void multidraw_subtest(const struct test_mode *t)
 	target = pick_target(t, params);
 
 	for (m1 = 0; m1 < IGT_DRAW_METHOD_COUNT; m1++) {
+		if (op_disables_fbc(t, m1))
+			continue;
+
 		for (m2 = m1 + 1; m2 < IGT_DRAW_METHOD_COUNT; m2++) {
+			if (op_disables_fbc(t, m2))
+				continue;
 
 			igt_debug("Methods %s and %s\n",
 				  igt_draw_get_method_name(m1),