All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH i-g-t v4] igt/gem_workarounds: Test all types of workarounds
@ 2017-10-30 20:17 Oscar Mateo
  2017-10-30 21:01 ` ✗ Fi.CI.BAT: failure for igt/gem_workarounds: Test all types of workarounds (rev3) Patchwork
  0 siblings, 1 reply; 2+ messages in thread
From: Oscar Mateo @ 2017-10-30 20:17 UTC (permalink / raw)
  To: intel-gfx

Apart from context based workarounds, we can now also test for global
MMIO and whitelisting ones.

Do take into account that this test does not guarantee that all known
WAs for a given platform are applied. It only checks that the WAs the
kernel does know about are correctly applied (e.g. they didn't get
lost on a GPU reset or a suspend/resume).

v2:
  - Do not wait for the GPU unnecessarily (Chris)
  - Make a comment that this tests only looks for regressions (Chris)

v3:
  - GT instead of MMIO (Chris, Mika)
  - Limit register access to just the mmio tests (Chris)
  - Add the possibility to read the WAs from a local file (Chris)
  - Display workarounds (Ville)

v4:
  - Keep backward compatibility with older kernels (Petri)
  - Unify the result checker and pretty print the result (Chris)

Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Petri Latvala <petri.latvala@intel.com>
---
 tests/gem_workarounds.c | 251 ++++++++++++++++++++++++++++++++++++------------
 1 file changed, 189 insertions(+), 62 deletions(-)

diff --git a/tests/gem_workarounds.c b/tests/gem_workarounds.c
index 7b99961..19afea7 100644
--- a/tests/gem_workarounds.c
+++ b/tests/gem_workarounds.c
@@ -28,6 +28,7 @@
 #include "igt.h"
 
 #include <fcntl.h>
+#include <ctype.h>
 
 #define PAGE_SIZE 4096
 #define PAGE_ALIGN(x) ALIGN(x, PAGE_SIZE)
@@ -62,27 +63,53 @@ static struct write_only_list {
 	 */
 };
 
-static struct intel_wa_reg *wa_regs;
-static int num_wa_regs;
+static struct intel_wa_reg *ctx_wa_regs;
+static int num_ctx_wa_regs;
+
+static struct intel_wa_reg *gt_wa_regs;
+static int num_gt_wa_regs;
+
+static struct intel_wa_reg *display_wa_regs;
+static int num_display_wa_regs;
+
+static struct intel_wa_reg *whitelist_wa_regs;
+static int num_whitelist_wa_regs;
 
 static bool write_only(const uint32_t addr)
 {
 	int i;
 
-	for (i = 0; i < ARRAY_SIZE(wo_list); i++) {
-		if (gen == wo_list[i].gen &&
-		    addr == wo_list[i].addr) {
-			igt_info("Skipping check for 0x%x due to write only\n", addr);
+	for (i = 0; i < ARRAY_SIZE(wo_list); i++)
+		if (gen == wo_list[i].gen && addr == wo_list[i].addr)
 			return true;
-		}
-	}
 
 	return false;
 }
 
+static int check_result(struct intel_wa_reg *wa_reg,
+			uint32_t out, const char *type)
+{
+	const bool ok = (wa_reg->value & wa_reg->mask) == (out & wa_reg->mask);
+	char buf[80];
+
+	snprintf(buf, sizeof(buf), "0x%05X\t0x%08X\t0x%08X\t0x%08X\t(%s)",
+		 wa_reg->addr, wa_reg->value, wa_reg->mask, out, type);
+
+	if (ok) {
+		igt_debug("%s\tOK\n", buf);
+	} else if (write_only(wa_reg->addr)) {
+		igt_debug("%s\tIGNORED (w/o)\n", buf);
+	} else {
+		igt_warn("%s\tFAIL\n", buf);
+		return 1;
+	}
+
+	return 0;
+}
+
 #define MI_STORE_REGISTER_MEM (0x24 << 23)
 
-static int workaround_fail_count(int fd, uint32_t ctx)
+static int ctx_workarounds_fail_count(int fd, uint32_t ctx)
 {
 	struct drm_i915_gem_exec_object2 obj[2];
 	struct drm_i915_gem_relocation_entry *reloc;
@@ -91,13 +118,16 @@ static int workaround_fail_count(int fd, uint32_t ctx)
 	uint32_t *base, *out;
 	int fail_count = 0;
 
-	reloc = calloc(num_wa_regs, sizeof(*reloc));
+	if (!num_ctx_wa_regs)
+		return 0;
+
+	reloc = calloc(num_ctx_wa_regs, sizeof(*reloc));
 	igt_assert(reloc);
 
-	result_sz = 4 * num_wa_regs;
+	result_sz = 4 * num_ctx_wa_regs;
 	result_sz = PAGE_ALIGN(result_sz);
 
-	batch_sz = 16 * num_wa_regs + 4;
+	batch_sz = 16 * num_ctx_wa_regs + 4;
 	batch_sz = PAGE_ALIGN(batch_sz);
 
 	memset(obj, 0, sizeof(obj));
@@ -105,12 +135,12 @@ static int workaround_fail_count(int fd, uint32_t ctx)
 	gem_set_caching(fd, obj[0].handle, I915_CACHING_CACHED);
 	obj[1].handle = gem_create(fd, batch_sz);
 	obj[1].relocs_ptr = to_user_pointer(reloc);
-	obj[1].relocation_count = num_wa_regs;
+	obj[1].relocation_count = num_ctx_wa_regs;
 
 	out = base = gem_mmap__cpu(fd, obj[1].handle, 0, batch_sz, PROT_WRITE);
-	for (int i = 0; i < num_wa_regs; i++) {
+	for (int i = 0; i < num_ctx_wa_regs; i++) {
 		*out++ = MI_STORE_REGISTER_MEM | ((gen >= 8 ? 4 : 2) - 2);
-		*out++ = wa_regs[i].addr;
+		*out++ = ctx_wa_regs[i].addr;
 		reloc[i].target_handle = obj[0].handle;
 		reloc[i].offset = (out - base) * sizeof(*out);
 		reloc[i].delta = i * sizeof(uint32_t);
@@ -131,29 +161,9 @@ static int workaround_fail_count(int fd, uint32_t ctx)
 
 	gem_set_domain(fd, obj[0].handle, I915_GEM_DOMAIN_CPU, 0);
 
-	igt_debug("Address\tval\t\tmask\t\tread\t\tresult\n");
-
 	out = gem_mmap__cpu(fd, obj[0].handle, 0, result_sz, PROT_READ);
-	for (int i = 0; i < num_wa_regs; i++) {
-		const bool ok =
-			(wa_regs[i].value & wa_regs[i].mask) ==
-			(out[i] & wa_regs[i].mask);
-		char buf[80];
-
-		snprintf(buf, sizeof(buf),
-			 "0x%05X\t0x%08X\t0x%08X\t0x%08X",
-			 wa_regs[i].addr, wa_regs[i].value, wa_regs[i].mask,
-			 out[i]);
-
-		if (ok) {
-			igt_debug("%s\tOK\n", buf);
-		} else if (write_only(wa_regs[i].addr)) {
-			igt_debug("%s\tIGNORED (w/o)\n", buf);
-		} else {
-			igt_warn("%s\tFAIL\n", buf);
-			fail_count++;
-		}
-	}
+	for (int i = 0; i < num_ctx_wa_regs; i++)
+		fail_count += check_result(&ctx_wa_regs[i], out[i], "ctx");
 	munmap(out, result_sz);
 
 	gem_close(fd, obj[1].handle);
@@ -163,6 +173,44 @@ static int workaround_fail_count(int fd, uint32_t ctx)
 	return fail_count;
 }
 
+static int mmio_workarounds_fail_count(struct intel_wa_reg *wa_regs,
+				       int num_wa_regs, const char *type)
+{
+	int i, fail_count = 0;
+
+	for (i = 0; i < num_wa_regs; i++) {
+		const uint32_t val = intel_register_read(wa_regs[i].addr);
+		fail_count += check_result(&wa_regs[i], val, type);
+	}
+
+	return fail_count;
+}
+
+static int workarounds_fail_count(int fd, uint32_t ctx)
+{
+	int fail_count = 0;
+
+	igt_debug("Address\tval\t\tmask\t\tread\t\ttype\tresult\n");
+
+	fail_count += ctx_workarounds_fail_count(fd, ctx);
+
+	intel_register_access_init(intel_get_pci_device(), 0, fd);
+
+	fail_count += mmio_workarounds_fail_count(gt_wa_regs,
+						  num_gt_wa_regs,
+						  "gt");
+	fail_count += mmio_workarounds_fail_count(display_wa_regs,
+						  num_display_wa_regs,
+						  "disp");
+	fail_count += mmio_workarounds_fail_count(whitelist_wa_regs,
+						  num_whitelist_wa_regs,
+						  "wlist");
+
+	intel_register_access_fini();
+
+	return fail_count;
+}
+
 static int reopen(int fd)
 {
 	char path[256];
@@ -185,7 +233,7 @@ static void check_workarounds(int fd, enum operation op, unsigned int flags)
 	if (flags & CONTEXT)
 		ctx = gem_context_create(fd);
 
-	igt_assert_eq(workaround_fail_count(fd, ctx), 0);
+	igt_assert_eq(workarounds_fail_count(fd, ctx), 0);
 
 	switch (op) {
 	case GPU_RESET:
@@ -209,7 +257,7 @@ static void check_workarounds(int fd, enum operation op, unsigned int flags)
 		igt_assert(0);
 	}
 
-	igt_assert_eq(workaround_fail_count(fd, ctx), 0);
+	igt_assert_eq(workarounds_fail_count(fd, ctx), 0);
 
 	if (flags & CONTEXT)
 		gem_context_destroy(fd, ctx);
@@ -217,6 +265,70 @@ static void check_workarounds(int fd, enum operation op, unsigned int flags)
 		close(fd);
 }
 
+static bool is_empty(const char *s)
+{
+	while (*s != '\0') {
+		if (!isspace(*s))
+			return false;
+		s++;
+	}
+
+	return true;
+}
+
+static char *skip_preamble(char *s, const char *preamble)
+{
+	int i = strlen(preamble);
+
+	while (*s == *preamble) {
+		s++;
+		preamble++;
+		i--;
+	}
+
+	return (i == 0) ? s : NULL;
+}
+
+static void read_workarounds(FILE *file, const char *preamble,
+			     struct intel_wa_reg **regs, int *num)
+{
+	char *header, *line = NULL;
+	size_t line_size;
+	struct intel_wa_reg *wa_regs = NULL;
+	int num_wa_regs = 0;
+	int i = 0;
+
+	igt_assert(getline(&line, &line_size, file) > 0);
+	header = skip_preamble(line, preamble);
+	if (!header)
+		goto out;
+	igt_debug("i915_wa_registers: %s", line);
+	sscanf(header, " applied: %d", &num_wa_regs);
+	if (!num_wa_regs)
+		goto out;
+
+	wa_regs = malloc(num_wa_regs * sizeof(*wa_regs));
+
+	while (getline(&line, &line_size, file) > 0) {
+		if (is_empty(line))
+			break;
+
+		if (sscanf(line, "0x%X: 0x%08X, mask: 0x%08X",
+			   &wa_regs[i].addr,
+			   &wa_regs[i].value,
+			   &wa_regs[i].mask) == 3)
+			i++;
+	}
+
+	igt_assert_lte(i, num_wa_regs);
+
+out:
+	*regs = wa_regs;
+	*num = num_wa_regs;
+
+	free(line);
+}
+
 igt_main
 {
 	int device = -1;
@@ -242,38 +354,48 @@ igt_main
 
 	igt_fixture {
 		FILE *file;
-		char *line = NULL;
-		size_t line_size;
-		int i, fd;
+		int fd;
 
 		device = drm_open_driver(DRIVER_INTEL);
 		igt_require_gem(device);
 
 		gen = intel_gen(intel_get_drm_devid(device));
 
-		fd = igt_debugfs_open(device, "i915_wa_registers", O_RDONLY);
-		file = fdopen(fd, "r");
-		igt_assert(getline(&line, &line_size, file) > 0);
-		igt_debug("i915_wa_registers: %s", line);
-		sscanf(line, "Workarounds applied: %d", &num_wa_regs);
-		igt_require(num_wa_regs > 0);
-
-		wa_regs = malloc(num_wa_regs * sizeof(*wa_regs));
-		igt_assert(wa_regs);
-
-		i = 0;
-		while (getline(&line, &line_size, file) > 0) {
-			igt_debug("%s", line);
-			if (sscanf(line, "0x%X: 0x%08X, mask: 0x%08X",
-				   &wa_regs[i].addr,
-				   &wa_regs[i].value,
-				   &wa_regs[i].mask) == 3)
-				i++;
+		if ((file = fopen("wa_registers.txt", "r"))) {
+			igt_info("Using a local workarounds file\n");
+		} else {
+			fd = igt_debugfs_open(device, "i915_wa_registers", O_RDONLY);
+			file = fdopen(fd, "r");
 		}
 
-		igt_assert_lte(i, num_wa_regs);
+		/*
+		 * This test relies on the list of workarounds the kernel says
+		 * have been applied and it only checks that those are (indeed)
+		 * correctly applied. It does not report whether the system has
+		 * applied all known workarounds for a fiven platform.
+		 */
+		read_workarounds(file, "Workarounds",
+				 &ctx_wa_regs, &num_ctx_wa_regs);
+
+		if (num_ctx_wa_regs == 0) {
+			/* Newish kernel, with support for more WA types */
+			rewind(file);
+
+			read_workarounds(file, "Context workarounds",
+					&ctx_wa_regs, &num_ctx_wa_regs);
+			read_workarounds(file, "GT workarounds",
+					&gt_wa_regs, &num_gt_wa_regs);
+			read_workarounds(file, "Display workarounds",
+					&display_wa_regs,
+					&num_display_wa_regs);
+			read_workarounds(file, "Whitelist workarounds",
+					&whitelist_wa_regs,
+					&num_whitelist_wa_regs);
+		}
+		igt_require(num_ctx_wa_regs +
+			    num_gt_wa_regs +
+			    num_whitelist_wa_regs > 0);
 
-		free(line);
 		fclose(file);
 		close(fd);
 	}
@@ -284,4 +406,9 @@ igt_main
 				check_workarounds(device, op->op, m->flags);
 		}
 	}
+
+	igt_fixture {
+		free(ctx_wa_regs);
+		free(gt_wa_regs);
+	}
 }
-- 
1.9.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

* ✗ Fi.CI.BAT: failure for igt/gem_workarounds: Test all types of workarounds (rev3)
  2017-10-30 20:17 [PATCH i-g-t v4] igt/gem_workarounds: Test all types of workarounds Oscar Mateo
@ 2017-10-30 21:01 ` Patchwork
  0 siblings, 0 replies; 2+ messages in thread
From: Patchwork @ 2017-10-30 21:01 UTC (permalink / raw)
  To: Oscar Mateo; +Cc: intel-gfx

== Series Details ==

Series: igt/gem_workarounds: Test all types of workarounds (rev3)
URL   : https://patchwork.freedesktop.org/series/31612/
State : failure

== Summary ==

IGT patchset tested on top of latest successful build
7aac0e88606ce453b111ce80419dc58519db05ad assembler: Fix bashism in run-test.sh

with latest DRM-Tip kernel build CI_DRM_3295
302b1723bec5 drm-tip: 2017y-10m-30d-18h-28m-39s UTC integration manifest

No testlist changes.

Test gem_exec_suspend:
        Subgroup basic-s3:
                pass       -> DMESG-WARN (fi-cfl-s) fdo#103186
Test gem_workarounds:
        Subgroup basic-read:
                skip       -> FAIL       (fi-gdg-551)
                skip       -> FAIL       (fi-blb-e6850)
                skip       -> FAIL       (fi-pnv-d510)
                skip       -> FAIL       (fi-bwr-2160)
                skip       -> FAIL       (fi-elk-e7500)
                skip       -> FAIL       (fi-ilk-650)
Test kms_pipe_crc_basic:
        Subgroup suspend-read-crc-pipe-c:
                incomplete -> PASS       (fi-bxt-dsi)
Test pm_rpm:
        Subgroup basic-pci-d3-state:
                incomplete -> FAIL       (fi-bxt-j4205)

fdo#103186 https://bugs.freedesktop.org/show_bug.cgi?id=103186

fi-bdw-5557u     total:289  pass:266  dwarn:0   dfail:0   fail:2   skip:21  time:465s
fi-bdw-gvtdvm    total:289  pass:265  dwarn:0   dfail:0   fail:0   skip:24  time:451s
fi-blb-e6850     total:289  pass:223  dwarn:1   dfail:0   fail:1   skip:64  time:378s
fi-bsw-n3050     total:289  pass:241  dwarn:0   dfail:0   fail:2   skip:46  time:540s
fi-bwr-2160      total:289  pass:183  dwarn:0   dfail:0   fail:1   skip:105 time:265s
fi-bxt-dsi       total:289  pass:257  dwarn:0   dfail:0   fail:2   skip:30  time:517s
fi-bxt-j4205     total:289  pass:258  dwarn:0   dfail:0   fail:2   skip:29  time:514s
fi-byt-j1900     total:289  pass:251  dwarn:1   dfail:0   fail:2   skip:35  time:517s
fi-byt-n2820     total:289  pass:247  dwarn:1   dfail:0   fail:2   skip:39  time:507s
fi-cfl-s         total:289  pass:251  dwarn:4   dfail:0   fail:2   skip:32  time:572s
fi-cnl-y         total:289  pass:260  dwarn:0   dfail:0   fail:2   skip:27  time:629s
fi-elk-e7500     total:289  pass:229  dwarn:0   dfail:0   fail:1   skip:59  time:421s
fi-gdg-551       total:289  pass:178  dwarn:1   dfail:0   fail:2   skip:108 time:252s
fi-glk-1         total:289  pass:259  dwarn:0   dfail:0   fail:2   skip:28  time:599s
fi-hsw-4770      total:289  pass:260  dwarn:0   dfail:0   fail:2   skip:27  time:444s
fi-hsw-4770r     total:289  pass:260  dwarn:0   dfail:0   fail:2   skip:27  time:449s
fi-ilk-650       total:289  pass:228  dwarn:0   dfail:0   fail:1   skip:60  time:426s
fi-ivb-3520m     total:289  pass:260  dwarn:0   dfail:0   fail:0   skip:29  time:497s
fi-ivb-3770      total:289  pass:260  dwarn:0   dfail:0   fail:0   skip:29  time:461s
fi-kbl-7500u     total:289  pass:262  dwarn:1   dfail:0   fail:2   skip:24  time:511s
fi-kbl-7560u     total:289  pass:268  dwarn:0   dfail:0   fail:2   skip:19  time:581s
fi-kbl-7567u     total:289  pass:267  dwarn:0   dfail:0   fail:2   skip:20  time:495s
fi-kbl-r         total:289  pass:260  dwarn:0   dfail:0   fail:2   skip:27  time:596s
fi-pnv-d510      total:289  pass:222  dwarn:1   dfail:0   fail:1   skip:65  time:541s
fi-skl-6260u     total:289  pass:267  dwarn:0   dfail:0   fail:2   skip:20  time:474s
fi-skl-6600u     total:289  pass:260  dwarn:0   dfail:0   fail:2   skip:27  time:602s
fi-skl-6700hq    total:289  pass:261  dwarn:0   dfail:0   fail:2   skip:26  time:659s
fi-skl-6700k     total:289  pass:263  dwarn:0   dfail:0   fail:2   skip:24  time:541s
fi-skl-6770hq    total:289  pass:267  dwarn:0   dfail:0   fail:2   skip:20  time:521s
fi-skl-gvtdvm    total:289  pass:266  dwarn:0   dfail:0   fail:0   skip:23  time:455s
fi-snb-2520m     total:289  pass:250  dwarn:0   dfail:0   fail:0   skip:39  time:564s
fi-snb-2600      total:289  pass:249  dwarn:0   dfail:0   fail:0   skip:40  time:418s

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_447/
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

end of thread, other threads:[~2017-10-30 21:01 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-30 20:17 [PATCH i-g-t v4] igt/gem_workarounds: Test all types of workarounds Oscar Mateo
2017-10-30 21:01 ` ✗ Fi.CI.BAT: failure for igt/gem_workarounds: Test all types of workarounds (rev3) 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.